问题:工作指派问题可以描述如下:n 个工作将要指派给 n 个工人分别完成,工人 i 完成工作 j 的时间为 dij,问如何安排可使总的工作时间达到最
小?请设计一种 SA 算法来解决上述指派问题。
假设 n=100,要求随机产生 dij;
matlab代码如下:
function main()
%TSP问题的模拟退火算法malab程序
%wangs编写
d=rand(100,100);
[~,n]=size(d);
t0=100; %t0初始温度=100K
t=t0;
tf=1; %tf最终温度=100K
x=1:n; %领域初始解表示第i个人做i个事
xbest=x; %领域最优解
c=1;
fmin=fun(d,x);%将初始可行解下的目标函数设为当前最优目标值
while t>tf
for k=1:5000; %内循环停止准则5000次
y=xbest;
t=y©;
y©=y(c+1); %两个交换
y(c+1)=t; %xbest中两个元素进行交换
x=y;
c=c+1; %可行解2-opt顺序交换。
if c>99 %说明c=99时,状态表达为x=[2 3…99 1],
c=1;
end %c>99强制新一轮顺序交换,以保证所有元素被交换到
fx=fun(d,x); %计算新解的函数值。
fb=fx-fmin;
if fb<=0
xbest=x;
fmin=fx; %无条件跳转,取最优值与最优解。
elseif fb>0
p=exp(-fb/t);
if p>rand
xbest=x;
fmin=fx; %有条件跳转,取最优值与最优解。
elseif p<=rand
x=x; %不处理
end
end
end
t=0.98*t; %模拟退火操作
end
fmin
xbest
function fmin=fun(d,x)
fmin=0;
n=length(x);
for i=1:n
fmin=fmin+d(i,x(i)); %计算第i个人做x(i)任务时总时间。
end
TSP matlab
原文作者:蚁群算法
原文地址: https://blog.csdn.net/weixin_43214046/article/details/82931133
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/weixin_43214046/article/details/82931133
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。