模拟退火算法解决01背包问题(matlab实现)

来源:互联网 发布:桶装水软件 编辑:程序博客网 时间:2024/06/01 09:09
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);    endendcuresult=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

我们可以知道这种方法比较适合大量数据的运算,少量数据可直接用动态规划来做,这种做法最后的最大值也只是逼近最大,很难做到完全最优。




2 0
原创粉丝点击