随机法解决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 ...
随机推荐
- table可更改th大小的jQuery插件
(function ($) { $.fn.resizetable = function () { var tableObj = $(this); var inResizeRange = false; ...
- stm32时钟配置总结
stm32时钟配置时钟源: 1,HSE(高速外部时钟)即常见的外接8M晶振方案: 2,HSI(高速内部时钟) 即8M内部振荡时钟方案: 3,LSE(低速外部时钟)即常见的32.768Khz晶振方案: ...
- wcf 配置总结
最近在配置WCF的时候,需要一点麻烦,避免以后才出现错误,特记录起来 1.wcf需要使用用户名和X509证书验证 A.服务器的config配置 a.bindings/binding中使用 <se ...
- sql 判断表是否存在,判断列是否存在
判断表是否存在: 语法: SELECT * FROM dbo.SysObjects where id = object_id(N'表名') 例子: SELECT * FROM dbo.SysObjec ...
- POJ 1966 ZOJ 2182 Cable TV Network
无向图顶点连通度的求解,即最少删除多少个点使无向图不连通. 我校“荣誉”出品的<图论算法理论.实现及其应用>这本书上写的有错误,请不要看了,正确的是这样的: 对于每个顶点,分成两个点,v和 ...
- git 免密码提交代码
Linux或者Mac下方法: 创建文件,进入文件,输入内容: cd ~ touch .git-credentials vim .git-credentials https://{username}:{ ...
- 观看网上的N多教程有感
MD只想说一句,我擦. 长篇大论,有个叼毛用呀,显示你文采.... 糟粕真TMD多,直接简单的步骤多好,不要显示的你有多专业,其实就是一个二逼. 还有N多论坛,扯淡的人更多.
- webstrom 快捷键(Idea可用)
在File-->setting可查看和配置功能快捷键,以下列出常用的快捷键 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件. 2. ctrl + ...
- 访问nginx-php页面的时候 报access denied.
访问页面的时候出现这个时access denied 只需到/usr/local/php/etc/php.ini中修改一下 把这个注释掉 ;open_basedir = 把这个值赋值为1 cgi.f ...
- Apache配置详解【转】
http站点要这样配置服务器才安全 2016-07-29 10:32 主机(站点)配置 一个站点的2个核心信息为: 主机名(服务器名/站点名): ServerName 服务器名 站点位置(站点目录路径 ...