基于遗传算法解决背包问题(Matlab代码实现)
目录
💥1 概述
通常情况下,我们必须在有限的预算内做出最佳选择,考虑在预算范围内购买杂货;打包行李旅行,同时低于行李重量限额;决定您将在小手提包中携带哪些物品;决定您将以有限的硬盘容量在计算机上保留哪些程序和文档;决定用可用的时间和精力学习哪些主题进行考试!
在商业和工业场景中,这种决策问题的例子也很多——制造工厂选择在有限的工作时间内生产什么;组建一个运动队阵容,为球员提供一些最大的预算;在受货舱最大重量和体积限制的情况下,向运输船舶填充最有利可图的内容物;销售人员将在营销预算有限的情况下访问哪些城镇。
这个谜题有一个数学名称——它被称为背包问题。之所以这么命名,是因为决策问题被想象为用最佳选择的物品填充背包(或背包、背包等)。然而,困难在于所选物品的总重量不得超过背包的最大重量容量(单一约束)。这个问题还可以扩展到两个约束 - 背包具有定义的最大承重能力和最大容积能力。添加的约束越多,找到问题的最佳解决方案就越困难。事实上,这个问题被认为是NP-Hard的找到完美解决方案所需的时间随着项目数量的增加呈指数级增长!
有时,将决策可视化很简单(杂货店购物:项目的货币成本与预算)或更抽象的(制造:花在工作上的小时数与工厂的总运行小时数)——请注意,选择可以是一组项目或一系列操作。如果任务是选择一组可能性中的一些,但不是全部,则可以以这种方式考虑任何决定。
这个问题的一个特殊变体称为0-1背包问题。在这种情况下,我们希望通过检查集合中的每个项目来最大化总利润,并决定是拿走还是离开该项目(但我们不能拿走每个项目中的一个以上)。我们还必须记住遵守以下约束:我们所选物品的总重量小于或等于我们的最大承重能力。
这些问题的约束可以通过容量比来定义——这是最大容量与所有可用项目总重量的比率。换句话说,容量比为 1 意味着您有空间容纳所有可用项目。容量比为 0.5 意味着您的背包只能容纳可用总重量的一半。容量比为 0.1 导致背包只能容纳可用物品重量的 10%。请注意,项目重量和值都不同 - 可用项目总重量的 10% 并不一定意味着可用项目总数的 10%。
📚2 运行结果
🎉3 参考文献
[1]贺毅朝,王熙照,李文斌,张新禄,陈嶷瑛.基于遗传算法求解折扣{0-1}背包问题的研究[J].计算机学报,2016,39(12):2614-2630.
👨💻4 Matlab代码
主函数部分代码:
% GA Parameters
gen_max = 150; % 150 Max generations
pop_size = 50; % Population size of 50
sel_no = 25; % Selection of 20 individuals for mating, each generation
mut_rate = 0.02; % Mutation rate 0<mut_rate<1 where 0.02 = 2%
elite_no = 0; % Not used yet
pen_mode = 0; % Not used yet
sel_mode = 0; % Not used yet
cap_rat = 0.65;
seed = 0; % Use your student number
[profit, weight] = genDataset(seed);
% weight_max = NaN;% Calculate weight_max, with total weight and capacity ratio...!
weight_max = cap_rat*sum(weight);% Calculate weight_max, with total weight and capacity ratio...!
% Imagine, examine, analyse - experiment...!
figure(1)
clf()
hold on
title("Plot for score analysis")
xlabel("Generations")
ylabel("Score")
% Run the GA
% Without validation
with_validation = 0;
[scores] = ga_A(gen_max, pop_size,...
profit, weight, weight_max,...
sel_no, mut_rate, with_validation);
plot(1:gen_max, scores, 'DisplayName', 'Best Scores(Without validate)')
% With validation
with_validation = 1;
[scores] = ga_A(gen_max, pop_size,...
profit, weight, weight_max,...
sel_no, mut_rate, with_validation);
plot(1:gen_max, scores, 'DisplayName', 'Best Scores(With validate)')
legend('location', 'southeast')
hold off
% ...and have fun :)
相关文章
- Matlab中set函数的使用
- Matlab中conj函数用法
- Matlab中end语句
- 基于结点电压法的配电网状态估计matlab仿真
- emlc——让MATLAB的代码进入单片机
- 【MATLAB教程案例25】常用图像变换域的matlab仿真分析——DFT频域,DCT域,小波域等
- 通过MATLAB模拟24个GPS卫星的轨道运行效果
- 【蚁群路径规划】基于MATLAB的蚁群算法的二维路径规划
- 【注水功率分配】注水功率分配算法的MATLAB仿真
- MATLAB的GUI 程序设计
- MATLAB调用USB摄像头的过程记录
- 【Matlab 六自由度机器人】定义标准型及改进型D-H参数建立机器人模型(附MATLAB建模代码)
- 【Matlab算法】MATLAB求解背包问题(附MATLAB代码)
- 【Matlab算法】L-M法求解非线性最小二乘优化问题(附L-M法MATLAB代码)
- 【Matlab算法】修正G-N法求解非线性最小二乘优化问题(附修正G-N法MATLAB代码)
- 生成素数的matlab代码
- MATLAB中的信号短时傅里叶变换获得信号的时频联合分析
- 匹配滤波(脉冲压缩) matlab代码,亲测可用
- matlab制造一个64*64的仿真数据
- matlab simulink笔记04——switch模块
- Matlab 模拟退火算法模型代码
- Matlab 线性规划问题模型代码
- 建立matlab的启动图标
- (原)Matlab的svmtrain和svmclassify
- Matlab代码-遍历文件夹下所有指定格式的图像