function [maxvalue,result]=SA_bag(value,weight,maxweight)%maxvalue爲最大價值,result爲最終的物體選取向量,value爲價值向量,weight爲重量向量,maxweight爲重量限制
[m,n]=size(value);
TF=0.000001;a=0.9;T=100;res=100*n;%初始化,TF爲截止溫度,a爲退火因子,T爲初始溫度,res爲迭代次數
t=T;
result=ceil(rand(m,n)-0.5);
while 1
if sum(sum(result.*weight))<=maxweight
break
else
result=ceil(rand(m,n)-0.5);
end
end
curesult=result;
maxvalue=sum(sum(curesult.*value));
cuvalue=maxvalue;%隨機初始值
while t>TF
for i=1:res
temp=ceil(n*rand);%隨機選取一個物體
if ~result(temp)
curesult(temp)=1;%如果這個物體沒有在揹包中,就把這個物體放進揹包
else
add=ceil(n*rand);
while ~result(add)
add=ceil(n*rand);
end
curesult(add)=1;
curesult(temp)=0;%如果這個物體在揹包中,就把這個物體拿出揹包,並放入另一個物體
end
if sum(sum(curesult.*weight))>maxweight
continue%如果這種情況重量過大,就繼續迭代
else
cuvalue=sum(sum(curesult.*value));
if(cuvalue>maxvalue)
result=curesult;
maxvalue=cuvalue;%如果新的情況比之前的價值要大,就移動到這種狀態上
else
f=cuvalue-maxvalue;
if(exp(f/t)>rand)
result=curesult;
maxvalue=cuvalue;%如果新的情況沒之前大,就根據公式隨機是否移動
end
end
end
end
t=t*a;%降溫
end
我們可以知道這種方法比較適合大量數據的運算,少量數據可直接用動態規劃來做,這種做法最後的最大值也只是逼近最大,很難做到完全最優。