模拟退火算法 0-1背包问题

matlab R2017a 人工智能算法 张德丰编著 P246

0-1背包问题 

假设每件物品分别有不同的质量和价值,背包能带走的物品质量有限,我们需要在背包总质量约束下求得携带物品的方案,以使带走的物品价值最高。由于可以用1表示带走该物品,0表示不带,所以称之为0-1背包问题。

可以用模拟退火算法求解此类问题。模拟退火算法理论上是一种全局最优算法,能应用到求最小值问题的优化过程。

用matlab实现模拟退火算法,解决书上问题:

clc,clear
a=0.95;
v=[5 10 13 4 3 11 13 10 8 16 7 4]';%每件物品的价值,换为列向量后面求和更方便
v=-v;                              %模拟退火求解最小值,取负数
w=[2 5 18 3 2 5 10 4 11 7 14 6]';%每件物品的质量
w_upbound=46;%包最大容许质量
num=12;%物品件数
%初始化
sol_new=ones(1,num);%物品是否带走,带1,不带0
E_current=inf;%物品总价值
E_best=inf;%物品总价值(最大),储存该最优值
sol_current=sol_new;%当前解,物品携带矩阵
sol_best=sol_new;%储存最优时,物品携带矩阵
%模拟退火控制系数
t0=97;%初始温度
tf=3;%最终温度
t=t0;%当前温度,越高,接受劣新解的概率越高,搜索范围大,反之越低,越小
p=1;
while t>=tf        %一直降温,直至温度低于最终温度
    for r=1:100
        r
        tmp=ceil(rand*num);%ceil向上取整,在1-12间随机取数
        sol_new(1,tmp)=~sol_new(1,tmp);%该值置为0,~表示非
        %检查是否满足约束
        while 1
            q=(sol_new*w<=w_upbound);%小于质量上限,q=1,反之取0
            if ~q %如果上步q取0(没有满足质量约束),这步为1(真),构造新解
              p=~p;%交替循环0,1
              tmp=find(sol_new==1);
              if p                    %交错着将携带矩阵第一个1和最后一个1置0                                        
                  sol_new(1,tmp(1))=0;
              else
                  sol_new(1,tmp(end))=0;
              end
            else
                break; %终止for或while循环
            end
        end
        %ji算背包中物品价值
        E_new=sol_new*v;%物品总价值
        if E_new<E_current %不断更新较好的新解
            E_current=E_new;
            sol_current=sol_new;
            if E_new<E_best %储存最好得到解
                E_best=E_new;
                sol_best=sol_new;
            end
        else
            if rand<exp(-(E_new-E_current)./t)%以一定概率接受劣解
                E_current=E_new;
                sol_current=sol_new;
            else
                sol_new=sol_current;
            end
        end
    end
    t=t*a;%降温系数r
end
disp('最优解携带矩阵为:')
sol_best
disp('物品总价值为:')
val=-E_best
disp('背包中物品重量为:')
disp(sol_best*w)

结果如下: 

 

 最优携带矩阵有多种情况,每次运行可能结果不一,但物品总价值最大为76是一定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值