📄 untitled2.m
字号:
%模拟退火解决0-1背包问题
clear;
a=[92,4,43,83,84,68,92,82,6,44,32,18,56,83,25,96,70,48,14,58]; %体积
c=[44,46,90,72,91,40,75,35,8,54,78,40,77,15,61,17,75,29,75,63]; %价值
n=length(a);
b=878; % 背包容量
x=zeros(1,n); % 初始解
t0=20; % 初始温度
tf=0.5; % 最终温度
t=t0;
alpha=0.5; % 衰减系数
Lk=100*n; % 马氏链长
f=0;
m=0;
for i=1:n
f=f+a(i)*x(i); % 总体积
m=m+c(i)*x(i); % 总价值
end
w=0; % 计算外循环迭代次数
while t>tf
w=w+1;
t=t*alpha;
end
mq=zeros(1,5);
for i=1:w
for p=1:Lk
for q=1:5
i=round(rand*(n-1))+1;
if x(i)==0
if f+a(i)<=b
x(i)=1;m=m+c(i);f=f+a(i);
else f+a(i)>b
j=round(rand*(n-1))+1;
while x(j)==0
j=round(rand*(n-1))+1;
end
da=a(i)-a(j);
dc=c(i)-c(j);
if f+da<=b % 接受准则
if dc>0
x(i)=1;x(j)=0;f=f+da;m=m+dc;
else exp(dc/t)>rand;
x(i)=1;x(j)=0;f=f+da;m=m+dc;
end
end
end
else x(i)==1
j=round(rand*(n-1))+1;
while x(j)==1
j=round(rand*(n-1))+1;
end
da=a(j)-a(i);
dc=c(j)-c(i);
if f+da<=b % 接受准则
if dc>0
x(i)=0;x(j)=1;f=f+da;m=m+dc;
else exp(dc/t)>rand
x(i)=0;x(j)=1;f=f+da;m=m+dc;
end
end
end
mm(p)=m; % 记录某一温度下的最优解
xx(p,:)=x;
end
mj=0;
for i=1:Lk
if mj<mm(i)
mj=mm(i);
end
end
mq(1:5)=mj;
end
mmax=0;
for i=1:w % 记录全局最优解
if mmax<mq(i)
mmax=mq(i);xper=xq(i,:)
end
end
mmax % 输出全局最优解
xper % 输出挑选结果
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -