模拟退火背包问题求解

本文介绍了如何运用模拟退火算法来解决经典的背包问题。通过MATLAB实现,详细阐述了算法步骤和代码实现,探讨了算法在优化求解过程中的性能和效果。
clear;
clc;
%物品价值
earn=[5;10;13;4;3;11;13;10;8;16;7;4];
earn=-earn;%模拟退火算法求解最小值,故取负数
cost=[2;5;18;3;2;5;10;4;11;7;14;6];
num=12;
restriction=46;%包最大允许质量
sol_new=ones(1,num);
sol_current=sol_new;
sol_best=sol_new;
E_current=inf;
E_best=inf;
t0=97;
tf=3;
t=t0;
p=1;
a=0.95;
while t>tf
    for i=1:1000
        %产生随机扰动
        temp=ceil(rand*12);
        sol_new(1:temp)=~sol_new(1:temp);
        %约束条件判断
        while sol_new*cost>restriction
            %随机找到一个1逆转为0
            temp=find(sol_new==1);
            %if p
            %    sol_new(1,temp(1))=0;
            %   p=~p;
            %else
             %   sol_new(1,temp(end))=0;
              %  p=~p;
            %end
            temp1=ceil(rand*size(temp));
            sol_new(1,temp(temp1))=0;
        end

        E_new=sol_new*earn;
        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;
end

disp('最优解为:')
disp(sol_best);
disp('物品总价值')
val=-E_best;
disp(val);
disp('背包重量物品总重量')
disp(sol_best*cost)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值