模擬退火算法解決01揹包問題(matlab實現)

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

我們可以知道這種方法比較適合大量數據的運算,少量數據可直接用動態規劃來做,這種做法最後的最大值也只是逼近最大,很難做到完全最優。




發佈了50 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章