多维多背包问题Matlab实现
来源:互联网 发布:java 热部署 框架 编辑:程序博客网 时间:2024/05/16 09:33
2016年8月25日星期四
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)
题目
2014年研究生数学建模E题,问题一求解。
% 思路:转化为多重多背包问题% 步骤:% 1. 先求出轿运车排列组合,作为备选轿运车;% 2. 首先按背包循环,对每个背包动态规划;M[i,u,v,w]=M[i-1,u,v,w] or M[i,u,v,w]= M[i-1,u-ui,v-vi,w-wi]+Wi;% 3. 规划完一个背包,要记录消耗掉的轿运车,在下次规划前更新可装的轿运车表,逐一记录备忘录;% 4. 重复3;% 5. 找出组合。
%% @authors Keung Charteris & T.s.road CZQ% @file "QuestionOne14E.m"% @version 1.0 ($Revision$)% @date 18/8/2016 $LastChangedDate$% @addr. GUET, Gui Lin, 540001, P.R.China% @contact : cztsiang@gmail.com% @date Copyright(c) 2016-2020, All rights reserved.% This is an open access code distributed under the Creative Commons Attribution License, which permits % unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. function QuestionOne14E% 问题分析% 思路:转化为多重多背包问题% 步骤:% 1. 先求出轿运车排列组合,作为备选轿运车;% 2. 首先按背包循环,对每个背包动态规划;M[i,u,v,w]=M[i-1,u,v,w] or M[i,u,v,w]= M[i-1,u-ui,v-vi,w-wi]+Wi;% 3. 规划完一个背包,要记录消耗掉的轿运车,在下次规划前更新可装的轿运车表,逐一记录备忘录;% 4. 重复3;% 5. 找出组合。clc; %清除所有clear all; %清除变量close all; %关闭图片Capacity= [104 72]; % 背包的容量% Weight= [4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;4 4;...% 4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;...% 5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;5 4;...% 5 5;5 5;5 5;5 5;5 5;5 5;5 5;5 5;5 5;5 5;5 5;5 5;5 5;...% 5 10;5 10;5 10;5 10;5 10;5 10;...% 5 12;5 12;5 12;5 12;5 12;...% 6 10;6 10;6 10;6 10;6 10;6 10;...% 6 12;6 12;6 12;6 12;6 12]; Weight= [8 0;8 0;8 0;8 0;8 0;8 0;8 0;8 0;8 0;8 0;8 0;8 0;... ...4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;4 5;... 0 10;0 10;0 10;0 10;0 10;0 10;... 15 0;15 0;15 0;15 0;15 0;15 0;... 5 12;5 12;5 12;5 12;5 12;... 10 6;10 6;10 6;10 6;10 6;10 6;... 0 18;0 18;0 18 ]; % 轿运车的装载方式 。NumberOfObject =length(Weight); % n为轿运车的种类Value= zeros(NumberOfObject,1)+1;% 轿运车对应的数量。% 轿运车对应的数量。TransferMatrix=[]; % 定义状态转移矩阵ObjectState=[]; % 乘用车里轿运车的状态%1.判断第一个轿运车放或不放;for FlagTemp2=1:Capacity(2) for FlagTemp1=1:Capacity(1) if Weight(NumberOfObject,1)<FlagTemp1&&Weight(NumberOfObject,2)<FlagTemp2 TransferMatrix(NumberOfObject,FlagTemp1,FlagTemp2)=Value(NumberOfObject) ; else TransferMatrix(NumberOfObject,FlagTemp1,FlagTemp2)=0; end endend%2.判断下一个轿运车是放还是不放;不放时:M[i,u,v,w]=M[i-1,u,v,w] ;放时: M[i,u,v,w]= M[i-1,u-ui,v-vi,w-wi]+Wi;%3.重复2.for FlagTempExternal=NumberOfObject-1:-1:1 for FlagTemp2=1:Capacity(2) for FlagTemp1=1:Capacity(1) if Weight(FlagTempExternal,1)>=FlagTemp1 || Weight(FlagTempExternal,2)>=FlagTemp2 TransferMatrix(FlagTempExternal,FlagTemp1,FlagTemp2)=TransferMatrix(FlagTempExternal+1,FlagTemp1,FlagTemp2); else if TransferMatrix(FlagTempExternal+1,FlagTemp1,FlagTemp2)>TransferMatrix(FlagTempExternal+1,FlagTemp1-Weight(FlagTempExternal,1),FlagTemp2-Weight(FlagTempExternal,2))+Value(FlagTempExternal) TransferMatrix(FlagTempExternal,FlagTemp1,FlagTemp2)=TransferMatrix(FlagTempExternal+1,FlagTemp1,FlagTemp2); else TransferMatrix(FlagTempExternal,FlagTemp1,FlagTemp2)=TransferMatrix(FlagTempExternal+1,FlagTemp1-Weight(FlagTempExternal,1),FlagTemp2-Weight(FlagTempExternal,2))+Value(FlagTempExternal); end end end endend% TransferMatrix%4.找出这些轿运车。 FlagTempExternal=Capacity;for FlagTemp=1:NumberOfObject-1 if TransferMatrix(FlagTemp,FlagTempExternal(1),FlagTempExternal(2))==TransferMatrix(FlagTemp+1,FlagTempExternal(1),FlagTempExternal(2)) ObjectState(FlagTemp)=0; else ObjectState(FlagTemp)=1; FlagTempExternal=FlagTempExternal-Weight(FlagTemp,:); endendif TransferMatrix(NumberOfObject,FlagTempExternal)==0 ObjectState(NumberOfObject)=0;else ObjectState(NumberOfObject)=1;enddisp '14年E题'disp '问题一装载方式:'ObjectState;ObjectCar=Weight(find(ObjectState==1),:);CarEquat=ObjectCar'disp '问题一各类型轿运车数量:'[Car,Total]=QuestionTwoSelect(ObjectCar)
结果显示:
0 0
- 多维多背包问题Matlab实现
- 多维多选的背包问题
- 模拟退火算法解决01背包问题(matlab实现)
- 【转】再谈Matlab的多维数组问题
- 旅游背包(多维有界的背包问题)
- matlab 实现多维作图函数(slice)
- 分组背包问题Matlab实现——之基本背包问题
- 分组背包问题Matlab实现——之基本背包变形
- 分组背包问题Matlab实现——之基本背包扩展贪心解法
- [usaco]4.1.3 Fence Rails 多维背包问题,dfsid
- 一种高效率的排序方法-归并排序的实现(主要解决matlab中多维数组排序的问题)
- MDS(多维尺度法)的原理及MATLAB实现
- ProjectEuler 201,多维背包
- DP 多维背包
- hdu4501(多维背包)
- hlg2146【多维背包】
- hdu 4501 多维背包
- 背包问题-java实现
- LinearLayout布局的解析
- 关于Logstash中grok插件的正则表达式例子
- Android音频开发:基础知识
- 1044 火星数字
- android-application-plug-ins-frame-work
- 多维多背包问题Matlab实现
- 【bzoj1085】[SCOI2005]骑士精神
- 如何在局域网内使用mac通过SSH协议远程访问linux
- Json请求重定向问题
- PHP 命名空间 解惑
- 计算几何 求n个点中最大四边形
- 计算机视觉资源整理
- Java的byte数组、16进制字符串、字符串
- 50 个高级 jQuery 代码开发技巧