TSP——模拟退火解法

都知道TSP是经典的NP问题,从一个点开始遍历所有点,不重复,求最短路径。

可以用枚举终点,跑流量为2的最小费用,图论来做,时间复杂度为 ​ 费用流已经用到堆优化了。显然点,边较多将无法承受。

如果不要求精确解,使用模拟退火也是一个不错的选择。模型简单,转移很暴力。

先随机生成一些解,然后随机挑两个点,开始试探转移。

这里,几乎是按照退火算法模板写的了,有初始化,有状态转移,有接受准则。

clc, clear
sj0=load('sj.txt');
x=sj0(:,[::]);x=x(:);
y=sj0(:,[::]);y=y(:);
sj=[x y]; d1=[,];
sj=[d1;sj;d1]; sj=sj*pi/;
d=zeros();
for i=:
for j=i+:
d(i,j)=*acos(cos(sj(i,)-sj(j,))*cos(sj(i,))*cos(sj(j,))+sin(sj(i,))*sin(sj(j,)));
end
end
d=d+d';
path=[];long=inf;

rand('state',sum(clock)); %初始化随机数发生器

for j=: %求较好的初始解
path0=[ +randperm(),]; temp=;
for i=:
temp=temp+d(path0(i),path0(i+));
end
if temp<long
path=path0; long=temp;
end
end

e = 0.1^;
L = ;
at = 0.999;
T = ;

for k = :L
c = +floor(*rand(,));
c = sort(c);
c1 = c();
c2 = c(); df=d(path(c1-),path(c2))+d(path(c1),path(c2+))-d(path(c1-),path(c1))-d(path(c2),path(c2+)); if df <
path=[path(:c1-),path(c2:-:c1),path(c2+:)];
long = long+df;
elseif exp(-df/T)>rand
path=[path(:c1-),path(c2:-:c1),path(c2+:)];
long=long+df;
end T = T*at;
if T < e
break;
end
end

xx = sj(path,);
yy = sj(path,);
plot(xx,yy,'-*');

最新文章

  1. [Python] 利用Django进行Web开发系列(一)
  2. IIS 架构解析
  3. SPI总线通信电路设计
  4. 关于Redis的启动过程
  5. Kafka 消息存储及检索(作者:杜亦舒)
  6. c++,windows中的字符问题
  7. Android Drawable 关于selector中state_pressed=&quot;true&quot;的位置顺序
  8. input获取永久焦点
  9. POJ2418——Hardwood Species(map映射)
  10. bzoj 2049: [Sdoi2008]Cave 洞穴勘测 动态树
  11. mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in
  12. 【HDOJ 1086】 模板水过
  13. 初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)
  14. Visual Studio 2010利用libxl读写excel表格数据
  15. 经典Hash函数的实现
  16. 如何在CentOS上创建Kubernetes集群
  17. .net Monitor产生SynchronizationLockException异常的原因
  18. typescript函数类型接口
  19. GitHub fork的使用
  20. Chapter5 (语句) --C++Prime笔记

热门文章

  1. Maven系统学习
  2. ansible 命令详解{图片详解}
  3. bootstrap日历插件地址
  4. 更改CMD默认的初始路径
  5. MsysGit下GUI乱码问题解决
  6. Python正则表达
  7. Ubuntu系统修改Python软链接
  8. TCP/IP、Http、Soap三个基本的通讯协议
  9. Nginx的各种报错总结
  10. artDialog组件应用学习(四)