背包问题的模拟退火算法

下面来介绍一下非常经典的背包问题及其用模拟退火算法实现的程序:

基本的背包向题,更复杂一些的比如:物品允许部分带走或者每类物品有多个等情况,在这个背包的例子中,假设有12件物品,质量分别为2磅、4磅、11磅、13磅、8磅、5磅、10磅、4磅、7磅、17磅、9磅、6磅,价值分别为8元、12元、3元、14元、9元、5元、6元、10元、7元、16元、17元、11元,包的最大允许质量是46磅。求解的方法如下:

1、在MATLAB的主界面编辑器中写入下列代码:

a = 0.85
k = [8;12;3;14;9;5;6;10;7;16;17;11];
k = -k;	% 模拟退火算法是求解最小值,故取负数
d = [2;4;11;13;8;5;10;4;7;17;9;6];
restriction = 46;
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=fin
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术小咖龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值