分组背包问题Matlab实现——之基本背包扩展贪心解法
2016-07-28 11:16
537 查看
2016年7月28日星期四
T.s.road总结笔记:分组背包问题Matlab实现——之基本背包扩展贪心解法
项目源码:https://github.com/Tsroad/KnapsackProblemSeries
作者说明:
When running thisprogramme, the author’s PCsetting is:
Microsoft Windows 7 (SP1) + Matlab R2010b+CPU i5-4590 + RAM 4.0GB.
(LabSX309; Check by Keung Charteris or T.s.road CZQ)
题目
N个数,分成两组,要求两组数的和的差值最小。
基本思路
这是背包问题(上一篇博客介绍了基本背包问题)的变形,背包容量C为Sum/2。第i个数字的价值与重量都等于数字大小。现制定贪心策略,从贪心算法角度思考。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
1.建立数学模型来描述问题
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步
do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解。
% 问题描述:
% 20个数,分成两组,要求两组数的和的差值最小。
% 问题分析
% 1. 对这组数进行排序;
% 2. OrderMax1放第一组,OrderMax2放第二组;
% 3. 依次取数,放在和最小的一组;
% 4. 重复3.
clc; %清除所有
clear all;%清除变量
close all;%关闭图片
FirstGroup=[];
SecondGroup=[];
BagNumberPoints=[38,82,54,36,94,88,56,63,59,21,31,48,24,85,20,23,18,23,44,32];
% 1. 对这组数进行排序;
BagNumberPointsOrder= fliplr(sort(BagNumberPoints));
% 2. OrderMax1放第一组,OrderMax2放第二组;
FirstGroup=BagNumberPointsOrder(1);
SecondGroup=BagNumberPointsOrder(2);
% 3. 依次取数,放在和最小的一组;
for FlagTemp=3:length(BagNumberPointsOrder)%FlagTemp为临时标志
if(sum(FirstGroup)>sum(SecondGroup))
SecondGroup=[SecondGroup,BagNumberPointsOrder(FlagTemp)];
else
FirstGroup=[FirstGroup,BagNumberPointsOrder(FlagTemp)];
end
end
disp('两组数的和分别为:');
[sum(FirstGroup);sum(SecondGroup)]
disp('第一组为');
FirstGroup
disp('第二组为');
SecondGroup
FirstGroup
运行结果:
T.s.road总结笔记:分组背包问题Matlab实现——之基本背包扩展贪心解法
项目源码:https://github.com/Tsroad/KnapsackProblemSeries
作者说明:
When running thisprogramme, the author’s PCsetting is:
Microsoft Windows 7 (SP1) + Matlab R2010b+CPU i5-4590 + RAM 4.0GB.
(LabSX309; Check by Keung Charteris or T.s.road CZQ)
题目
N个数,分成两组,要求两组数的和的差值最小。
基本思路
这是背包问题(上一篇博客介绍了基本背包问题)的变形,背包容量C为Sum/2。第i个数字的价值与重量都等于数字大小。现制定贪心策略,从贪心算法角度思考。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
1.建立数学模型来描述问题
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步
do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解。
% 问题描述:
% 20个数,分成两组,要求两组数的和的差值最小。
% 问题分析
% 1. 对这组数进行排序;
% 2. OrderMax1放第一组,OrderMax2放第二组;
% 3. 依次取数,放在和最小的一组;
% 4. 重复3.
clc; %清除所有
clear all;%清除变量
close all;%关闭图片
FirstGroup=[];
SecondGroup=[];
BagNumberPoints=[38,82,54,36,94,88,56,63,59,21,31,48,24,85,20,23,18,23,44,32];
% 1. 对这组数进行排序;
BagNumberPointsOrder= fliplr(sort(BagNumberPoints));
% 2. OrderMax1放第一组,OrderMax2放第二组;
FirstGroup=BagNumberPointsOrder(1);
SecondGroup=BagNumberPointsOrder(2);
% 3. 依次取数,放在和最小的一组;
for FlagTemp=3:length(BagNumberPointsOrder)%FlagTemp为临时标志
if(sum(FirstGroup)>sum(SecondGroup))
SecondGroup=[SecondGroup,BagNumberPointsOrder(FlagTemp)];
else
FirstGroup=[FirstGroup,BagNumberPointsOrder(FlagTemp)];
end
end
disp('两组数的和分别为:');
[sum(FirstGroup);sum(SecondGroup)]
disp('第一组为');
FirstGroup
disp('第二组为');
SecondGroup
FirstGroup
运行结果:
相关文章推荐
- 从源码安装Mysql/Percona 5.5
- php7 扩展类的写法[2]
- php7 类的方法传参[3]
- php7 读取php.ini[4]
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Windows Powershell扩展类型系统
- 浅析Ruby的源代码布局及其编程风格
- C#、ASP.NET通用扩展工具类之LogicSugar
- C#使用回溯法解决背包问题实例分析
- SQL Server下几个危险的扩展存储过程
- jQuery 学习第七课 扩展jQuery的功能 插件开发
- 运行Node.js的IIS扩展iisnode安装配置笔记
- 基于MySql的扩展功能生成全局ID
- jquery通过扩展select控件实现支持enter或focus选择的方法
- 关于背包问题的一些理解和应用
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- 一个扩展时间段的dir命令的vbs脚本
- php7扩展安装奇葩事