分组背包问题Matlab实现——之基本背包变形

来源:互联网 发布:js 表单如何拼接字符串 编辑:程序博客网 时间:2024/05/21 14:43

2016年7月28日星期四

T.s.road总结笔记:分组背包问题Matlab实现——之基本背包扩展

 项目源码:https://github.com/Tsroad/KnapsackProblemSeries


作者说明:

Whenrunning thisprogramme, the author’s PC setting is:

MicrosoftWindows 7 (SP1) + Matlab R2010b +CPU i5-4590 + RAM 4.0GB.

 (Lab SX309; Check by Keung Charteris or T.s.roadCZQ)

 

题目

N个数,分成两组,要求两组数的和的差值最小。

 

基本思路

这是背包问题(上一篇博客介绍了基本背包问题)的变形,背包容量C为Sum/2。第i个数字的价值与重量都等于数字大小。

 

%  问题描述:%  20个数,分成两组,要求两组数的和的差值最小。%  问题分析%  1. 判断第一个数放或不放;%  2. 判断下一个数是放还是不放;M[i,c]=M[i-1,c] or M[i,c]= M[i-1,c-w(i)]+v(i);%  3. 重复2;%  4. 找出这些数。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];Capacity=ceil(sum(BagNumberPoints)/2)+1;% 背包的容量Weight=BagNumberPoints;% 数字的重量Value=BagNumberPoints;% 数字对应的价钱。NumberOfObject =length(Weight);% 数字的个数TransferMatrix=[];%定义状态转移矩阵ObjectState=[];%背包里数字的状态%1.判断第一个数字放或不放;for FlagTemp=1:Capacity        if Weight(NumberOfObject)<FlagTemp                TransferMatrix(NumberOfObject,FlagTemp)=Value(NumberOfObject) ;        else                TransferMatrix(NumberOfObject,FlagTemp)=0;        endend% %2.判断下一个数字是放还是不放;不放时:F[i,v]=F[i-1,v];放时:F[i,v]= F[i-1,v-C_i]+w_i;% %3.重复2.for FlagTempExternal=NumberOfObject-1:-1:1        for FlagTemp=1:Capacity                if FlagTemp<=Weight(FlagTempExternal)                        TransferMatrix(FlagTempExternal,FlagTemp)=TransferMatrix(FlagTempExternal+1,FlagTemp);                else                        if TransferMatrix(FlagTempExternal+1,FlagTemp)>TransferMatrix(FlagTempExternal+1,FlagTemp-Weight(FlagTempExternal))+Value(FlagTempExternal)                                TransferMatrix(FlagTempExternal,FlagTemp)=TransferMatrix(FlagTempExternal+1,FlagTemp);                        else                                TransferMatrix(FlagTempExternal,FlagTemp)=TransferMatrix(FlagTempExternal+1,FlagTemp-Weight(FlagTempExternal))+Value(FlagTempExternal);                        end                end        endend% TransferMatrix%4.找出这些数字。FlagTempExternal=Capacity;for FlagTemp=1:NumberOfObject-1        if TransferMatrix(FlagTemp,FlagTempExternal)==TransferMatrix(FlagTemp+1,FlagTempExternal)                ObjectState(FlagTemp)=0;        else                ObjectState(FlagTemp)=1;                FlagTempExternal=FlagTempExternal-Weight(FlagTemp);        endendif TransferMatrix(NumberOfObject,FlagTempExternal)==0        ObjectState(NumberOfObject)=0;else        ObjectState(NumberOfObject)=1;        endfor FlagTemp=1:NumberOfObject                if ObjectState(FlagTemp)==1                FirstGroup=[FirstGroup,BagNumberPoints(FlagTemp)];        else                SecondGroup=[SecondGroup,BagNumberPoints(FlagTemp)];        endenddisp('两组数的和分别为:');[sum(FirstGroup);sum(SecondGroup)]disp('第一组为');FirstGroupdisp('第二组为');SecondGroup


运行结果:



0 0
原创粉丝点击