书接上文(MATLAB调用lpsolve的详细介绍帖),我们继续探讨MATLAB调用lpsolve的用法。
列生成算法(column generation method)是一种求解大规模线性规划问题的有效方法。它运用分解方法的基本思想以及线性规划单纯形法的特点把问题变成若干个适应计算机能力的子问题,逐个计算,最后得到原问题的最优解。
这里还是采用大家学习列生成算法常用的例子来讲述:如何用MATLAB调用lpsolve来编写列生成算法,求解卷纸切割问题。
例子:有16米长的卷纸若干卷,现分别需要3m,6m,7m的卷纸25,20,18卷,请问如何对16米长的卷纸进行切割以实现最小化16m长卷纸的消耗。
根据上面的问题描述我们可以建立下列线性规划模型:
模型1:
min z=y1+y2+…+yn
s.t.
a11y1+a12y2+…+a1nyn>=25
a21y1+a22y2+…+a2nyn>=20
a31y1+a32y2+…+a3nyn>=18
关于列生成算法的原理,帖子(原贴链接)已经讲述的很清楚,本文不再赘述。但是细心的童鞋已经发现,在lpsolve上手动输入模型来求解非常繁琐,要是能编写程序自动求解就好了。
这样就引出来本文的重点阐述的内容了,本文要做的就是采用MATLAB调用lpsolve,对上述问题进行求解。
这里还需要一个基础知识,那就是如何用MATLAB调用lpsolve,小编的上一篇帖子(MATLAB调用lpsolve的详细介绍帖)有详细讲解,不懂的童鞋可以回去看看。
在编写列生成算法程序的时候,我们可以采用从特殊到普遍的思路进行编写,下面是具体编写思路:
step1.我们可以将模型1表示的问题限制成如下问题,用RMP1表示,显然RMP1有3种方案,方案1:切割成5卷3m卷纸;方案2:切割成2卷6m卷纸;方案3:切割成2卷7m卷纸;。
RMP1:
min y1+y2+y3
s.t.
5y1+0y2+0y3>=25
0y1+2y2+0y3>=25
0y1+0y2+2y3>=25
我们针对RMP1编写如下程序:
f=[1,1,1];
A=[5,0,0;0,2,0;0,0,2];
b=[25,20,18];
vlb=[0,0,0];
e=[1,1,1];
RMP1=lp_maker(f,A,b,e,vlb,[],[