目录
1.旅行商问题(TSP)描述
给定一组城市及其之间的距离矩阵D,旅行商问题的目标是找出一条访问每个城市恰好一次且最终回到起始城市的最短回路。记n 为城市数量,C 是一个包含n 个城市的排列(即路径顺序),C=(c1,c2,...,cn),那么我们要最小化的目标函数为:
2.禁忌搜索的基本思想
禁忌搜索是一种元启发式优化算法,它克服了传统局部搜索容易陷入局部最优的局限性,通过引入“记忆机制”即禁忌表来鼓励搜索过程跳出局部最优区域。
初始解与邻域结构:
- 初始化一个可行解 S0 和一个初始的禁忌表 T。
- 定义一个邻域构造函数N(S),对于当前解S,它可以生成一组与S 相差一步或多步变换的新解,例如交换两个城市的顺序(2-opt move)、逆序插入等。
禁忌策略:
- 在邻域内找到改进的候选解S′,如果 S′ 不在禁忌表T 中,则接受S′ 作为新解,同时将其加入禁忌表。
- 禁忌表维护着最近经过的解决方案的变化历史,这些变化在一定时间内(禁忌期限)是禁止再次尝试的。
恢复策略:
当遇到没有未被禁忌的改善解时,可以通过某种恢复策略(如早熟撤销、重新开始搜索等)尝试打破停滞状态。
终止条件:
当达到预设的最大迭代次数、达到满意的解质量或者找不到更好的解时,停止搜索,输出当前最佳解。
动态调整:
禁忌搜索通常还包括一些动态调整策略,比如禁忌表长度、 aspiration criterion(允许违反禁忌规则的优秀解)、多样性策略等。
3.数学模型
实际操作中,禁忌搜索还会结合其他机制,如最优保持策略(aspiration criteria)保证即使进入禁忌状态也能接受优于当前全局最优解的候选解。
4.算法流程图示
由于这里是文本环境,无法直接显示流程图,但可以描述一个大致流程:
- 初始化
- 循环直到满足终止条件 a. 计算当前解的邻域 b. 在非禁忌邻域中找到最优解 S∗ c. 更新禁忌表,将本次移动加入禁忌表 d. 检查是否打破禁忌规则(如有必要,采取恢复策略) e. 更新全局最优解BestSolution
- 输出最优解 BestSolution
禁忌搜索算法通过不断探索解空间并避免重蹈覆辙,从而有效地寻求全局最优解。在TSP问题中,它展示了对复杂优化问题的有效处理能力,尤其在大型问题上,虽然计算资源需求较高,但能更好地逃离局部最优陷阱。
5.matlab核心程序
.................................................................................
while (p<StopL+1)
% 计算当前解 S 的旅行商问题成本
ArrS(p)=CalDist(dislist,S);
% 初始化数组 A 存储待交换的城市对,并初始化检查重复的标志变量 isdel
i=1;
A=zeros(l1,2);
% 随机生成 l1 对城市索引
while i<=l1
% 生成两个随机城市索引
M=CityNum*rand(1,2);
M=ceil(M);
if M(1)~=M(2)% 判断城市是否不同,并确保不重复添加相同的交换对
m1=max(M(1),M(2));m2=min(M(1),M(2));
A(i,1)=m1;A(i,2)=m2;
if i==1
isdel=0;
else
for j=1:i-1% 检查新生成的交换对是否已存在于数组 A 中
if A(i,1)==A(j,1)&&A(i,2)==A(j,2)
isdel=1;
break;
else
isdel=0;
end
end
end
if ~isdel
i=i+1;
else
i=i;
end
else
i=i;
end
end
% 生成基于当前解 S 的 l1 个邻域解,并计算它们的成本
for i=1:l1
Si(i,:)=S;
Si(i,[A(i,1),A(i,2)])=S([A(i,2),A(i,1)]);% 执行城市对交换操作
CCL(i,1)=i;% 记录每个邻域解的相关信息
CCL(i,2)=CalDist(dislist,Si(i,:));
CCL(i,3)=S(A(i,1));
CCL(i,4)=S(A(i,2));
end
[fs fin]=sort(CCL(:,2));% 按照成本从小到大排序邻域解
for i=1:cl
CL(i,:)=CCL(fin(i),:);
end
% 更新全局最优解及最优成本
if CL(1,2)<bsf
bsf=CL(1,2);
S=Si(CL(1,1),:);
BSF=S;% 更新已考察城市对的计数器
for m=1:CityNum
for n=1:CityNum
if Tlist(m,n)~=0
Tlist(m,n)=Tlist(m,n)-1;
end
end
end
Tlist(CL(1,3),CL(1,4))=tl;% 更新选定城市对的计数器
else % 若没有找到更优邻域解,则按照一定策略选取未考察完的城市对进行更新
for i=1:cl
if Tlist(CL(i,3),CL(i,4))==0
S=Si(CL(i,1),:);
for m=1:CityNum
for n=1:CityNum
if Tlist(m,n)~=0
Tlist(m,n)=Tlist(m,n)-1;
end
end
end
Tlist(CL(i,3),CL(i,4))=tl;
break;
end
end
end
% 记录每次迭代得到的最优解成本
Arrbsf(p)=bsf;
% 绘制当前最优解对应的TSP路线图
drawTSP(Clist,BSF,bsf,p,0);
p=p+1;
end
% 输出全局最优解和最优成本
BestShortcut=BSF
theMinDistance=bsf
figure(2);
plot(Arrbsf,'r'); hold on;
plot(ArrS,'b');grid;
title('搜索过程');
legend('最优解','当前解');
toc
up4059