matlab用lp_solve求解列生成算法

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)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值