学习LNS的一个代码,旅行商问题,路径最短的单目标

% @作者:随心390
% @微信公众号:优化算法交流地

clear
clc
load CityPosition4.mat X %城市坐标
h=pdist(X);%计算距离
D=squareform(h);
n=size(X,1);
init_solution=1:n;
destroy_num=ceil(n/2); %0-n/2之间的随机数
init_length=PathLength(D,init_solution);
str1=['初始总路线长度 = ’ num2str(init_length)];
disp(str1)
Sbest=init_solution;
best_length=PathLength(D,Sbest);
while i<100
[ sequence_destroy,sequence_remain] = destroy( init_solution,destroy_num );
[ sequence_repair,sequence_repair_length] = repair( sequence_destroy,sequence_remain,D );
if sequence_repair_length<init_length
init_solution=sequence_repair;
end
if sequence_repair_length<best_length
Sbest=sequence_repair;
end
i=i+1;
end
length_LNS=PathLength(D,Sbest);
str2=['搜索完成! 最优路线总长度 = ’ num2str(length_LNS)];
disp(str2)
disp(‘最优访问城市序列如下:’)
disp(Sbest)
save(‘LNS_outcome.mat’)

1 D = pdist(X) 计算 X 中各对行向量的相互距离(X是一个mxn的矩阵). 这里 D 要特别注意,D 是一个长为m(m–1)/2的行向量。可以这样理解 D 的生成:首先生成一个 X 的距离方阵,由于该方阵是对称的,令对角线上的元素为0,所以取此方阵的下三角元素,按照Matlab中矩阵的按列存储原则,此下三角各元素的索引排列即为(2,1), (3,1), …, (m,1), (3,2), …, (m,2), …, (m,m–1)。通俗一点就是第一个点一次到其他个点的距离,然后是第二个点到之后个点的距离,依次类推。可以用命令 squareform(D) 将此行向量转换为原距离方阵.(squareform函数是专门干这事的,其逆变换是也是squareform。)

x=[2,3;4,5;6,3;5,9];h=pdist(x);%计算距离
D=squareform(h);

在这里插入图片描述
在这里插入图片描述
D = pdist(X,distance) 使用指定的距离.distance可以取下面圆括号中的值,用红色标出!
D = pdist(X, ‘minkowski’)
2 ceil函数:朝正无穷大方向取整
3 PathLength是调用的自编代码,将每个城市间的距离取出
4 disp 是去除输出中的单引号

参考
https://blog.csdn.net/you23hai45/article/details/13093989
https://jingyan.baidu.com/article/3c343ff7df8db60d37796316.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值