随机法解决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 ...
随机推荐
- css样式表及属性
CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/ 此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...
- iOS UITextView 根据输入text自适应高度
转载自:http://www.cnblogs.com/tmf-4838/p/5380495.html #import "ViewController.h" @interface V ...
- redis的主从复制与哨兵
主从复制的关键字是slaveof,有三种方法可以让一个redis数据库变成另一个redis数据库的从数据库: 1.修改redis的配置文件,添加#slaveof <masterip> &l ...
- WebDriver获取table的内容(通过动态获取Table单元格的TagName对其innerHTML值进行获取)
import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedHashMap;import java.util ...
- VBS基础篇 - 对象(3) - FileSystemObject对象
VBS基础篇 - 对象(3) - FileSystemObject对象 文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,在Vbs中对桌面和文件系统进行访问的顶级 ...
- Chapter 1 Mr.Sherlock Holmes
I took my degree of Doctor of Medicine in the University of London, and proceeded to Netley to go th ...
- getTime 方法
转自http://www.yesky.com/imagesnew/software/javascript/html/jsmthgettime.htm getTime 方法返回 Date 对象中的时间值 ...
- thinkphp 实现微信公众号开发(二)--实现自定义菜单
IndexController.class.php <?php namespace Home\Controller; use Think\Controller; class IndexContr ...
- cmstop中实例化controller_admin_content类传递$this,其构造方法中接收到的是--名为cmstop的参数--包含cmstop中所有属性
主程序cmstop类,实例化controller_admin_content类(接收请求后拼接的).传递cmstop所有属性过去.controller_admin_content.构造方法中接收到名称 ...
- JavaScript性能优化技巧之函数节流
函数节流技术的主要思路是,通过一个定时器,阻断连续重复的函数调用.对于我们自己内部使用的函数,这通常意义不大,也不推荐使用这个技术,它可能会丢失对某些数据的处理.但是对于在用户界面调用的函数,却非常有 ...