LINGO操作------线性规划

作者:落寞红颜玉玫瑰

本文使用软件:LINGO11 免费版


LINGO简介

LINGO是一款专业的规划求解软件,其语言特性偏向于脚本语言;用MODEL:开始,END结束,每条语句用英文状态下的“;”表示结束,注释以英文状态下的“!”开始,以“;”结尾。 

其主要由5个模块构成,分别是SETS、DATA、INIT、CALC以及目标段;内置有与csv接口,excel接口等。


本例背景

本题背景:某公司需采购4种原材料(单位:吨),每种原材料市场规格有三种,其规格和材料价格对应如下:

规格原材料1原材料2原材料3原材料4
规格1200313633490
规格2218300600500
规格3245289650507

每种原材料的需量依次是(1->4):400,300,200,100。

每种规格的原材料需要分开摆放,其仓库最大存储量依次是(1->3):450,250,300。

问:公司应该怎样采购才能在满足需量和仓储的条件下,使总成本最低。


问题分析

目标条件:总成本最低

限制条件:需量,仓储

记:规格为s,原材料为r,需量为q,仓储量为l,材料与规格矩阵为m;

设:采购量为x;

则其条件不等式为:

\sum_{j=1}^{4}\left ( x_{1j} \right )\leqslant 450;\sum_{j=1}^{4}\left ( x_{2j} \right )\leqslant 250;\sum_{j=1}^{4}\left ( x_{3j} \right )\leqslant 300;

\sum_{i=1}^{3}\left ( x_{i1} \right )= 400;\sum_{i=1}^{3}\left ( x_{i2} \right )= 300;\sum_{i=1}^{3}\left ( x_{i3} \right )= 200;\sum_{i=1}^{3}\left ( x_{i4} \right )= 100;

目标函数为:

min=\sum_{i=1}^{3}\sum_{j=1}^{4}\left ( x_{ij}*m_{ij}\right )

下面用LINGO来实现上述表达式。


语句实现

MODEL:
    
    !这是一行注释,其以英文状态下的“!”开始,以“;”结尾;
    title:LINGO 规划求解示例模范,title 可有可无;

    !SETS (集合模块),以 “SETS:” 开始,“ENDSETS” 结尾。;
    !集合段是一个模型的骨骼,其所有的计算依赖与集合名的调用。;
    SETS:

        !集合名不可重复且区分大小写,但其属性可以有多个,集合名用于定位,属性用于计算。;
        !1. 语句格式1:集合名/下标1,下标2,下标3/:属;
        SETS_f/1,2,3/:s;
        
        !2. 语句格式1:当集合元素过多时,用“..”来列出所有元素;
        !SETS_f/1..3/:s;

        !生成一个包含4个元素的集合,命名为SETS_s,其包含2个属性值:l,c;
        SETS_s/1..4/:l,c;

        !3. 用上面的元素生成一个3行4列的矩阵,矩阵的命名与产生如下:;
        !格式为:矩阵名(行数,列数):属性值 [可同时放置多个属;
        MATRIX(SETS_f,SETS_s):m,x;

    ENDSETS

    !DATA (数据模块),以 “DATA:” 开始,“ENDDATA” 结尾。;
    !数据段是一个模型的肌肉,有了数据的注入集合名才有了意义,计算才有了依据。;
    DATA:

        !数据段的数据应与SETS段保持一致,本质是给集合的属性相应的值;
        
        !1. 给s属性3个值,l属性4个值;
        s=450,250,300;
        l=400,300,200,100;

        !2. 给矩阵MATRIX的m属性相应的值,单元素用“,”隔开,行元素用“ ”隔开,块级则用“;”结尾;
        m=200,313,633,490
          218,300,600,500
          245,289,650,507;

    ENDDATA

    !INIT (初始字段),以 “INIT” 开始,“ENDINIT” 结尾。
    !此字段一般用于设置初始迭代值,一个好的初始迭代值可以帮助模型快速找到最优解,不影响数据段;
    INIT:

        !我们给变量x的第一行设置初始值;
         x_1_1=20;
	     x_1_2=25;
	     x_1_3=30;
	     x_1_4=35;

    ENDINIT

    !CALC (计算字段), 以 “CALC” 开始,“ENDCALC” 结尾;
    !需要二次处理的数据可以在此字段计算,并返回值;
    CALC:

        !假设c属性需经过l属性的计算才能得到,则过程如下;
        c1=l1+3;
	    c2=l2*1.5;
	    c3=l3/3;
	    c4=l4-5;


    ENDCALC

    !求解模块,是一个模型的行为,有了它,模型才能动起来;
    !1.目标函数一定要在第一行,其格式为 min=expression 或者 max=expression ;
    !如若没有目标函数,则是解不等式方程组;
    
    !目标函数使用原始表达太长,所以用了函数,后面会介绍;
    [obj] min=@sum(MATRIX(i,j):x(i,j)*m(i,j));

    !限制条件:库存上限,可用循环函数代替;
    !LINGO中 默认 “<” 是 “<=” ;
    [limit_1] x(1,1)+x(1,2)+x(1,3)+x(1,4)<s(1);
    [limit_2] x(2,1)+x(2,2)+x(2,3)+x(2,4)<s(2);
    [limit_3] x(3,1)+x(3,2)+x(3,3)+x(3,4)<s(3);  

    !限制条件:需量,可用循环函数代替;
    [limit_4] x(1,1)+x(2,1)+x(3,1)=l(1);
    [limit_5] x(1,2)+x(2,2)+x(3,2)=l(2);
    [limit_6] x(1,3)+x(2,3)+x(3,3)=l(3);   
    [limit_7] x(1,4)+x(2,4)+x(3,4)=l(4);   

END

模型确认

将上述语句复制到LINGO面板后,按 “CTRL + G” ,或者如下图,依次点击LINGO-Generate-Display model 查看生成的模型,如下:

 MODEL:
 TITLE :LINGO 规划求解示例模范,title 可有可无;
   [OBJ] MIN= 200 * X_1_1 + 313 * X_1_2 + 633 * X_1_3 + 490 * X_1_4 + 218 *
   X_2_1 + 300 * X_2_2 + 600 * X_2_3 + 500 * X_2_4 + 245 * X_3_1 + 289 *
   X_3_2 + 650 * X_3_3 + 507 * X_3_4 ;
   [LIMIT_1] X_1_1 + X_1_2 + X_1_3 + X_1_4 <= 450 ;
   [LIMIT_2] X_2_1 + X_2_2 + X_2_3 + X_2_4 <= 250 ;
   [LIMIT_3] X_2_4 + X_3_1 + X_3_2 + X_3_3 <= 300 ;
   [LIMIT_4] X_1_1 + X_2_1 + X_3_1 = 400 ;
   [LIMIT_5] X_1_2 + X_2_2 + X_3_2 = 300 ;
   [LIMIT_6] X_1_3 + X_2_3 + X_3_3 = 200 ;
   [LIMIT_7] X_1_4 + X_2_4 + X_3_4 = 100 ;
  END


求解模型

如上图所示,依次点击LINGO-solve,或者“CTRL+U”,求解模型,出现界面如下:


其中在Solver Status 中,MODEL表示当前模型是线性规划(LP),State表示目前解是全局最优解。


Global optimal solution found.
  Objective value:                              336200.0
  Infeasibilities:                              0.000000
  Total solver iterations:                             5


  Model Title: :LINGO 规划求解示例模范,title 可有可无

                       Variable           Value        Reduced Cost
                          X_1_1        0.000000            0.000000
                          X_1_2        0.000000            0.000000
                          X_1_3        0.000000            0.000000
                          X_1_4        0.000000            0.000000
                             C1        4.234568            0.000000
                             L1        0.000000            0.000000
                             C2        1.851852            0.000000
                             L2        0.000000            0.000000
                             C3       0.4115226            0.000000
                             L3        0.000000            0.000000
                             C4       -3.765432            0.000000
                             L4        0.000000            0.000000
                          S( 1)        450.0000            0.000000
                          S( 2)        250.0000            0.000000
                          S( 3)        300.0000            0.000000
                          L( 1)        400.0000            0.000000
                          L( 2)        300.0000            0.000000
                          L( 3)        200.0000            0.000000
                          L( 4)        100.0000            0.000000
                          C( 1)        0.000000            0.000000
                          C( 2)        0.000000            0.000000
                          C( 3)        0.000000            0.000000
                          C( 4)        0.000000            0.000000
                       M( 1, 1)        200.0000            0.000000
                       M( 1, 2)        313.0000            0.000000
                       M( 1, 3)        633.0000            0.000000
                       M( 1, 4)        490.0000            0.000000
                       M( 2, 1)        218.0000            0.000000
                       M( 2, 2)        300.0000            0.000000
                       M( 2, 3)        600.0000            0.000000
                       M( 2, 4)        500.0000            0.000000
                       M( 3, 1)        245.0000            0.000000
                       M( 3, 2)        289.0000            0.000000
                       M( 3, 3)        650.0000            0.000000
                       M( 3, 4)        507.0000            0.000000
                       X( 1, 1)        400.0000            0.000000
                       X( 1, 2)        0.000000            34.00000
                       X( 1, 3)        0.000000            43.00000
                       X( 1, 4)        50.00000            0.000000
                       X( 2, 1)        0.000000            8.000000
                       X( 2, 2)        0.000000            11.00000
                       X( 2, 3)        200.0000            0.000000
                       X( 2, 4)        50.00000            0.000000
                       X( 3, 1)        0.000000            35.00000
                       X( 3, 2)        300.0000            0.000000
                       X( 3, 3)        0.000000            50.00000
                       X( 3, 4)        0.000000            7.000000

                            Row    Slack or Surplus      Dual Price
                            OBJ        336200.0           -1.000000
                        LIMIT_1        0.000000            10.00000
                        LIMIT_2        0.000000            0.000000
                        LIMIT_3        0.000000            0.000000
                        LIMIT_4        0.000000           -210.0000
                        LIMIT_5        0.000000           -289.0000
                        LIMIT_6        0.000000           -600.0000
                        LIMIT_7        0.000000           -500.0000

其中,表头有当前条件目标值,为336200;第二部分包含变量名称,变量值以及对应的递减成本;第三部分则是目标条件和约束条件相关。


结果分析

单独分析变量x,以及7个约束条件,首先看变量x,将其整理成表格,如下:

规格原材料1原材料2原材料3原材料4列合计
规格14000050450
规格20020050250
规格303000

0

300
合计4003002001001000

可以看出分配的量是同时满足仓储的限制和量的需求的。

将Reduced Cost整理成以上表格:

规格原材料1原材料2原材料3原材料4
规格1034430
规格281100
规格3350507

其中对应单元格表示递减成本:在当前条件下,增加1单位所对应的原材料会减少的成本(在最大值问题中),在本例中,即增加1单位的对应原材料会增加的成本。比如:增加1单位规格1的原材料2,会使目标值增加34元,其余类似。

这块可用于利润分析,商品价格差异分析,数量控制等。

对7个条件进行分析。

RowSlack or SurplusDual Pric
OBJ336200.0-1.000000
LIMIT_1010.00000
LIMIT_200
LIMIT_300
LIMIT_40-210
LIMIT_50-289
LIMIT_60-600
LIMIT_70-500

第二列是对应不等式的松弛变量和剩余变量。第三列是对偶价格,这部分通常用来灵敏度分析。

在本例中,各项不等式全部是饱和状态(全部满足),故剩余变量和松弛变量都为0。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落寞红颜玉玫瑰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值