随机法解决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 ...
随机推荐
- python--tile函数
1.函数的定义与说明 tile函数位于python模块 numpy.lib.shape_base中,功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组. 2.函数操作 ...
- Prime Path(BFS)
Prime Path Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total S ...
- 36.中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,该抽象类中有
//接口:CentralPartyCommittee package jieKou; public interface CentralPartyCommittee { void partyLeader ...
- 拦截asp.net mvc输出流做处理, 拦截HTML文本(asp.net MVC版)
以前的一个贴子写过一个webForm的拦截HTML输出流的版本,最近用到mvc时用同样的方式发生一些问题. 如下图 查了好久也不知道啥原因. 好吧, 我最后选择放弃. 想起以前自定义Response. ...
- WHM API 1 - createacct
WHM API 1 - createacct Skip to end of metadata Created by Sync User, last modified on Sep 29, ...
- OpenCV成长之路:图像直方图的应用
OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- linux文件特殊属性介绍(s,s,t)
文件的权限有rwx这3个读.写.执行的权限.但是,怎么 /tmp权限有些奇怪?还有, /usr/bin/passwd也有些奇怪,怎么回事呢? [root@linux ~]# ls -ld /tmp ; ...
- 1213 How Many Tables 简单的并查集问题
my code: #include <cstdio>#include <cstring>#include<iostream>using namespace std; ...
- LeetCode OJ 217.Contains Duplicate
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- 循环语句 ,for语句
for语句主要用来反复执行某段代码: for(初始条件:循环条件:状态改变) { 循环体 } 问题类型: 1.穷举(例:0-100以内与7有关的数) <body><input typ ...