背包问题的模拟退火算法MATLAB实现

该博客介绍了如何使用MATLAB实现模拟退火算法解决经典的0-1背包问题。问题背景为12件物品,每件物品有质量、价值,且背包有46磅的最大承重限制。通过算法求解能最大化总价值的物品组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这个0-1背包的例子中,假设有12件物品,质量分别为2磅、5磅、18磅、3磅、2磅、5磅、10磅、4磅、11磅、7磅、14磅、6磅,价值分别为5元、10元、13元、4元、3元、11元、13元、10元、8元、16元、7元、4元,包的最大允许质量是46磅。

clear
clc
a = 0.95;
k = [5;10;13;4;3;11;13;10;8;16;7;4];        %价值
k = -k;         %模拟退火算法是求解最小值,故取负值
d = [2;5;18;3;2;5;10;4;11;7;14;6];          %质量
restriction = 44;
num = 12;
sol_new = ones(1,num);          %生成初始解
E_current = inf;
E_best = inf;
%E_current是当前解对应的目标函数值(即背包中物品总价值)
%E_new是新解的目标函数值
%E_best是最优解
sol_current = sol_new;
sol_best = sol_new;
t0 = 97;
tf = 3;
t = t0;
p = 1;

while t >= tf
    for r = 1:100
        %产生随机扰动
        tmp = ceil(rand*num);
        sol_new(1,tmp) = ~sol_new(1,tmp);
        %检查是否满足约束
        while 1
            q = (sol_new * d <= restriction);
            if ~q
                p = ~p;             %实现交错着逆转头尾的第一个1
                tmp = find(sol_new == 1);
                if p
                    sol_new(1,tmp(1)) = 0;
                else
                    sol_new(1,tmp(end)) =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值