随机法解决TSP问题
TSP问题一直是个头疼的问题,但是解决的方法数不胜数,很多的算法也都能解决。百度资料一大堆,但是我找到了代码比较简练的一种。随机法。下面只是个人的看法而已,如果有任何问题虚心接受。
顾名思义,随机法就是随机一个序列然后用这个序列去解决问题。
TSP问题描述中,一个人走一圈回到原点要使走过的路程最短,那么他一定有一个路径,随机法,随机的就是这个路径。
首先我们要明白的是,只要随机的量足够大,最终一定能得到结果,因为能随机到枚举的全部。
第二,随机了一个路径之后,我们要在这个路径下面找到最短的路径,方法是通过交换两个位置得到的。
第三,要根据题目意思,确定图不是很大,或者数据量并非那种特别巨大的题目,也就是说看清题目。灵活选用方法。
1、我们随机一个路线出来
0-3-1-2-0(最终是要返回0的)
2、我们根据这个路径找到这个路径的路程s。
3、除了首尾的0之外,交换任意两个数,如果交换完了之后s变小了,就更新s
听上去是不是觉得这个算法很扯,是不是感觉最终得不到最优解,可是当你循环个50000次试试,你就知道,基本上99%都能拿到最优解,这个比暴力搜索快,但是比dp不稳,这个算法的有点在于编码不复杂,而且在基本问题上面都能得到最优解,所以最终我选择了这个。
下面附上代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm> using namespace std;
/*TSP随机法*/ int n;//图的大小
int maps[][];//记录任意两点的距离
int order[];//记录行走的顺序 //计算当前行走顺序下的距离
int dis()
{
int nowDis=;
int i;
//因为是从0开始走最后返回所以是n+1
for (i = ; i <= n+; i++)
{
nowDis += maps[order[i-]][order[i]];
}
return nowDis;
} int main()
{
int i,j;
int answer;//记录答案
int result;//记录最终输出
int ready=;//记录是否成功
int temp;//临时变量
cin>>n;
//用户输入家到任意一点的距离,保存在第一行中
for (i = ; i <= n; i++)
{
cin>>maps[][i];
maps[i][] = maps[][i];
}
//用户输入任意两点间的距离
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
cin>>maps[i][j];
maps[j][i] = maps[i][j];
}
} result = ;
//下面是随机开始 int t;//随机的次数
for (t = ; t < ; t++)
{
//初始化随机序列
for (i = ; i <= n; i++)
order[i] = i;
order[] = ;//一定是从0点开始走
order[n+] = ;//一定最终回到0点 //交换任意随机序列中的值,不动0点和n+1点的值
for (i = ; i <= n; i++)
{
j = rand()%n + ;
swap(order[i],order[j]);
} //获取当前最短路
answer = dis();
while (true)
{
ready = ;
for (i = ; i <= n; i++)
{
for (j = i+; j <= n; j++)
{
//交换每两个值
swap(order[i],order[j]);
temp = dis();
//如果当前交换之后,比当前路径小,那么就更新值
if(temp < answer)
{
answer = temp;
ready = ;
}
else//如果不比当前小,交换回来
swap(order[i],order[j]);
}
}
//只要有一次交换,那么就再一次循环,确保不存在更小的路径
if(ready == )
break;
} if(result > answer)
result = answer;
}
cout<<result<<endl;
return ;
}
随机法解决TSP问题的更多相关文章
- C++实现禁忌搜索解决TSP问题
C++实现禁忌搜索解决TSP问题 使用的搜索方法是Tabu Search(禁忌搜索) 程序设计 1) 文件读入坐标点计算距离矩阵/读入距离矩阵 for(int i = 0; i < CityNu ...
- SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu
%SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu X = [16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 2 ...
- 蚁群算法解决TSP问题
代码实现 运行结果及参数展示 alpha=1beta=5 rho=0.1 alpha=1beta=1rho=0.1 alpha=0.5beta=1rho=0.1 概念蚁群算法(AG)是一种模拟蚂蚁觅 ...
- 拉链法解决Hash节点冲突问题
<?php /* * hash::拉链法解决hash节点存储冲突问题 * ::2014-07-02 * ::Small_Kind */ class small_hash { private $s ...
- 链表法解决hash冲突
/* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...
- ACA:利用ACA解决TSP优化最佳路径问题——Jason niu
load citys_data.mat n = size(citys,1); D = zeros(n,n); for i = 1:n for j = 1:n if i ~= j D(i,j) = sq ...
- Python基于回溯法解决01背包问题实例
Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...
- 拉链法解决hashtable冲突问题
拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字 ...
- 遗传算法解决TSP问题实现以及与最小生成树的对比
摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...
随机推荐
- js 中创建对象
对象是什么 从JavaScript定义上讲对象是无序属性的集合,其属性可以包含基本值.对象或函数.也就是说对象是一组没有特定顺序的属性,每个属性会映射到一个值上,是一组键值对,值可以是数据或对象. 最 ...
- RegisterWindowMessage介绍
该函数为windows API之一 msdn地址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947(v=vs.85). ...
- zendstudio 安装 手册
安装 http://jingyan.baidu.com/article/b907e627b14fbb46e6891c65.html 选择baidu官方32bit安装 补丁破解网址 http://dwt ...
- js iframe跨域访问
1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...
- 十三、oracle 数据字典和动态性能视图
一.概念数据字典是oracle数据库中最重要的组成部分,它提供了数据库的一些系统信息.动态性能视图记载了例程启动后的相关信息. 二.数据字典1).数据字典记录了数据库的系统信息,它是只读表和视图的集合 ...
- SQLServer 错误: 15404,无法获取有关 Windows NT 组 用户
因做服务器数据库迁移,造成的一系列问题, 1.重启SQL 代理,操作也不可. 然后又进行操作: SQL---------安全性------登录名 中原来的系统用户名前的计算机名更改为现在所用的计算机名 ...
- Word试卷文档模型化解析存储到数据库
最近在搞一套在线的考试系统,有许多人反映试题的新增比较麻烦(需要逐个输入),于是呼就整个了试卷批量导入了 poi实现word转html 模型化解析html html转Map数组 Map数组(数组的操作 ...
- JavaScript高级程序设计:第十四章
第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...
- hdu_1115_Lifting the Stone(求多边形重心)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1115 题意:给你N个点围成的一个多边形,让你求这个多边形的重心. 题解: 将多边形划分为若干个三角形. ...
- 解析好的静态页面.shtml浏览器无法解析.需要apache解析后再返回给浏览器
解析好的静态页面.shtml浏览器无法解析.需要apache解析后再返回给浏览器 让Apache支持SHTML(SSI)的配置方法 http.conf放开addtype text/html .shtm ...