introduction
关于lp_solve的介绍、下载可以从
官方网站http://web.mit.edu/lpsolve/doc/了解
或者这个
lp_solve用起来很简单,就几个主要的参数
ARGUMENTS:
The first four arguments are required:
- f: n vector of coefficients for a linear objective function.
- a: m by n matrix representing linear constraints.
- b: m vector of right sides for the inequality constraints.
- e: m vector that determines the sense of the inequalities:
e(i) < 0 ==> Less Than
e(i) = 0 ==> Equals
e(i) > 0 ==> Greater Than - vlb: n vector of non-negative lower bounds. If empty or omitted,
then the lower bounds are set to zero. - vub: n vector of upper bounds. May be omitted or empty.
- xint: vector of integer variables. May be omitted or empty.
- scalemode: Autoscale flag. Off when 0 or omitted.
- setminim: Set maximum lp when this flag equals 0 or omitted.
用lp_solve求解列生成算法
医疗救助中心ERNow正在为小型直升机设计航班,这些小型直升机将用于向受到飓风影响的人们配送医疗、食品和住房物资。下表给出了不同物资重量占飞机可承载重量wi的比列和容量占集装箱容量vi的比例
希望用尽可能少的航班配送次数满足所有物资的需求
%f表示模型的目标系数或者价值系数
f=[1,1,1,1,1,1,1,1];
%A表示模型的消耗系数或者技术系数
A=[10,0,0,0,0,0,0,0,
0,5,0,0,0,0,0,0,
0,0,2,0,0,0,0,0,
0,0,0,3,0,0,0,0,
0,0,0,0,3,0,0,0,
0,0,0,0,0,4,0,0,
0,0,0,0,0,0,5,0,
0,0,0,0,0,0,0,7,];
%b表示模型的资源系数
b=[30,20,12,23,15,30,40,25];
%vlb表示变量的下限,在该模型中变量x,y都是非负变量,所以其下限就是0
vlb=[0,0,0,0,0,0,0,0,0];
%e确定不等式的情况,e(i)<0表示小于,e(i)=0表示等于,e(i)>0表示大于
e=[1,1,1,1,1,1,1,1];
%Subquestion
%A1 equals to the Aij, all this below are matrix
A1=[0.04,0.2,0.4,0.28,0.1,0.16,0.03,0.08
0.1,0.14,0.24,0.32,0.28,0.24,0.18,0.14];
b1=[1,1];
vlb1=[0,0,0,0,0,0,0,0];
e1=[-1,-1];
%loop until subquestion's objective larger than 0
while(1)
MasterQuestion=lp_maker(f,A,b,e,vlb,[],[],[],[1]); %主问题优化
mxlpsolve('solve', MasterQuestion); %求解主问题优化
obj=mxlpsolve('get_objective',MasterQuestion); %求最优值
x=mxlpsolve('get_variables',MasterQuestion); %最优解
dual=mxlpsolve('get_dual_solution',MasterQuestion); %求出最优解的对偶
duals=zeros(1,8); %先创建一个空矩阵
for i=1:8 %将对偶值赋值空矩阵,即duals是子问题目标函数的系数
duals(1,i)=dual(i,1);
end
f1=-duals; %使子问题目标函数系数成负数
subproblem=lp_maker(f1,A1,b1,e1,vlb1,[],[],[],[1]); %子问题优化
mxlpsolve('solve', subproblem); %求解子问题优化
obj=mxlpsolve('get_objective',subproblem) %求最优值
obj1=1+mxlpsolve('get_objective',subproblem); %目标函数1-aijx...
x1=mxlpsolve('get_variables',subproblem);
if (obj1>=0) %子问题求解后带入目标函数,确定最优值是否大于0
break;
end
f=[f,1];
A=[A,x1];
vlb=[vlb,0];
e=[e,1];
end
%优化函数,和之前的一样
MasterQuestion=lp_maker(f,A,b,e,vlb,[],[],[],[1]);
%求解最后一次优化
mxlpsolve('solve', MasterQuestion);
%最优飞行架次
obj=mxlpsolve('get_objective',MasterQuestion)
%矩阵显示所有方案
A
%每种方案所需的飞行架次
x=mxlpsolve('get_variables',MasterQuestion)