lingo基础入门Day 7——lingo应用之运输问题与生产问题总结

lingo基础入门Day 7

文章目录

  • lingo基础入门Day 7
      • lingo应用:运输问题
        • 给常量赋值:
        • 建立目标函数:运费最少
        • 产量约束:
        • 销量约束:
        • 完整模型:
        • 显示结果:
      • 派生集合的构造方法:
        • 格式:
      • 指派问题
      • 指派问题建模与求解
        • 建模代码如下:
      • 生产计划的建模与求解
        • 企业如何安排生产才能总利润最大?
        • 目标函数:利润最大
        • 模型总体实现:
        • 模型结果:
      • 总结

lingo应用:运输问题

糖果公司有三个加工厂,每天生产糖果7 、 4 、9吨,该公司要把糖果分别运送到四个地区的门市部,B1、B2、B3、B4销售,每天的销售量分别是3吨、4吨、5吨、6吨,现在已知从每个加工厂Ai到各个销售门市部运价如下图所示,怎样运送总运费最少?

部门B1部门B2部门B3部门B4产量
工厂A13113107
工厂A219284
工厂A3741059
销量3656
  • 用ai表示第i个加工厂产量

  • 用bj表示第j个部门的销量

  • 用cij表示运价即从第i个工厂到第j个部门运送一吨糖果的运输价格

  • 设置决策变量xij,为从第i个加工厂调动给第j个部门的糖果数量

  • 部门B1部门B2部门B3部门B4产量
    工厂A1X11X12X13X147
    工厂A2X21X22X23X244
    工厂A3X31X32X33X349
    销量3656
  • !建立加工厂集合及产量
    FACTORY/1..3/:A
    !建立部门集合及销量:
    SHOP/1..4/:B
    !建立联系集合及运价和运量:
    LINK(FACTORY,SHOP):C,X;
    

给常量赋值:

DATA:A = 7 4 9;
B = 3 6 5 6;
C = 
3 11 3 10
1 9  2 8
7 4  10 5;ENDDATA

建立目标函数:运费最少

 MIN = @SUM(LINK(I,J):C(I,J)*X(I,J));MIN = @SUM(LINK:C*X);

产量约束:

	@for(FACTORY(I):@SUM(SHOP(J):X(I,J)=A(I));

销量约束:

	@for(SHOP(J):@SUM(FACTORY(I):X(I,J)=B(J));

完整模型:

model:sets:	FACTORY/1..3/:A;SHOP/1..4/:B;LINK(FACTORY,SHOP):C,X;	
endsetsDATA:
A = 7 4 9;
B = 3 6 5 6;
C = 
3 11 3 10
1 9  2 8
7 4  10 5;
ENDDATAMIN = @SUM(LINK:C*X);@for(FACTORY(I):@SUM(SHOP(J):X(I,J))=A(I));@for(SHOP(J):@SUM(FACTORY(I):X(I,J))=B(J));
end

显示结果:

  Global optimal solution found.Objective value:                              85.00000Infeasibilities:                              0.000000Total solver iterations:                             6Elapsed runtime seconds:                          0.07Model Class:                                        LPTotal variables:                     12Nonlinear variables:                  0Integer variables:                    0Total constraints:                    8Nonlinear constraints:                0Total nonzeros:                      36Nonlinear nonzeros:                   0Variable           Value        Reduced CostA( 1)        7.000000            0.000000A( 2)        4.000000            0.000000A( 3)        9.000000            0.000000B( 1)        3.000000            0.000000B( 2)        6.000000            0.000000B( 3)        5.000000            0.000000B( 4)        6.000000            0.000000C( 1, 1)        3.000000            0.000000C( 1, 2)        11.00000            0.000000C( 1, 3)        3.000000            0.000000C( 1, 4)        10.00000            0.000000C( 2, 1)        1.000000            0.000000C( 2, 2)        9.000000            0.000000C( 2, 3)        2.000000            0.000000C( 2, 4)        8.000000            0.000000C( 3, 1)        7.000000            0.000000C( 3, 2)        4.000000            0.000000C( 3, 3)        10.00000            0.000000C( 3, 4)        5.000000            0.000000X( 1, 1)        2.000000            0.000000X( 1, 2)        0.000000            2.000000X( 1, 3)        5.000000            0.000000X( 1, 4)        0.000000            0.000000X( 2, 1)        1.000000            0.000000X( 2, 2)        0.000000            2.000000X( 2, 3)        0.000000            1.000000X( 2, 4)        3.000000            0.000000X( 3, 1)        0.000000            9.000000X( 3, 2)        6.000000            0.000000X( 3, 3)        0.000000            12.00000X( 3, 4)        3.000000            0.000000

派生集合的构造方法:

格式:

派生集合的名字(父集合1,父集合2,...,父集合n)[/元素列表/][:属性列表];

举例:

 FACTORY/A1...A3/;SHOP/B1..B3/;LINK( FACTORY,SHOP);

指派问题

有n项任务要分配给n个人去做,每人只完成一项任务,每个人物也只有一个人完成。

已知第i个人完成第j项任务所需的时间为Cij(称为效率矩阵)

问如何分配任务使完成所有工作所用的总时间最少?

任务A任务B任务C任务D任务E
人员18610912
人员212107159
人员374356
人员4954128
人员54116715

指派问题建模与求解

引入决策变量xij,如果由第i个人来完成第j项任务,则xij=1,否则xij=0.

  • 建立人员集合
  • 建立任务集合
  • 建立联系集合(人员、任务)
  • 在联系集合上定于效用矩阵c和决策变量矩阵X
  • 目标函数:总费用最小
  • 约束1:每个人只完成一件任务
  • 约束2:每个任务只有一个人完成
  • 约束3:矩阵X的每个元素都是0-1变量

建模代码如下:

model:sets:TASK/A B C D E/;WORKER/1..5/;LINK(WORKER,TASK):C,X;
endsetsDATA:C =
8 6 10 9 12
12 10 7 15 9
7 4 3 5 6
9 5 4 12 8
4 11 6 7 15;
ENDDATAMIN=@SUM(LINK: C*X);@FOR(WORKER(I):@SUM(TASK(J):X(I,J))=1
);	
@FOR(TASK(J):@SUM(WORKER(I):X(I,J))=1
);	
@FOR(LINK:@BIN(X)
);	
end

实现结果:

   Global optimal solution found.Objective value:                              28.00000Objective bound:                              28.00000Infeasibilities:                              0.000000Extended solver steps:                               0Total solver iterations:                             0Elapsed runtime seconds:                          0.08Variable           Value        Reduced CostX( 1, A)        0.000000            8.000000X( 1, B)        1.000000            6.000000X( 1, C)        0.000000            10.00000X( 1, D)        0.000000            9.000000X( 1, E)        0.000000            12.00000X( 2, A)        0.000000            12.00000X( 2, B)        0.000000            10.00000X( 2, C)        0.000000            7.000000X( 2, D)        0.000000            15.00000X( 2, E)        1.000000            9.000000X( 3, A)        0.000000            7.000000X( 3, B)        0.000000            4.000000X( 3, C)        0.000000            3.000000X( 3, D)        1.000000            5.000000X( 3, E)        0.000000            6.000000X( 4, A)        0.000000            9.000000X( 4, B)        0.000000            5.000000X( 4, C)        1.000000            4.000000X( 4, D)        0.000000            12.00000X( 4, E)        0.000000            8.000000X( 5, A)        1.000000            4.000000X( 5, B)        0.000000            11.00000X( 5, C)        0.000000            6.000000X( 5, D)        0.000000            7.000000X( 5, E)        0.000000            15.00000

生产计划的建模与求解

某企业计划生产甲乙两种产品,两种产品都要在ABCD四种不同的设备上加工,生产每种产品在各个设备上的加工时间、各设备的总生产能力和每种产品的单位丽人如右表所示:

产品甲产品乙生产力
设备A2212
设备B128
设备C4016
设备D0412
单位利润(元/件)23

企业如何安排生产才能总利润最大?

  • 定义设备集合及设备能力属性
  • 定义产品结合及单位产品利润、产量属性
  • 定义每种产品在每个设备上的加工时间集合以及属性加工时间
EQUIPMENT/A..D/:CAPACITY;
PROUDCT/P,Q/:PRICE,X;
WORKHOUR(PRODUCT,EQUIPMENT):T;

目标函数:利润最大

约束条件:每个设备对各个产品的加工时间不能超过能力

MAX = @SUM(PRODUCT:X*PRICE);
@FOR (EQUIPMENT(J):@SUM(PRODUCT(I):X(I)*T(I,J))<=CAPACITY(J)
);

模型总体实现:

model:sets:EQUIPMENT/A..D/:CAPACITY;PRODUCT/P,Q/:PRICE,X;WORKHOUR(PRODUCT,EQUIPMENT):T;
endsetsdata:
PRICE = 2 3;
CAPACITY = 12 8 16 12;
T = 2 1 4 02 2 0 4;
ENDDATAMAX = @SUM(PRODUCT:X*PRICE);@FOR (EQUIPMENT(J):@SUM(PRODUCT(I):X(I)*T(I,J))<=CAPACITY(J)
);end

模型结果:

  Global optimal solution found.Objective value:                              14.00000Infeasibilities:                              0.000000Total solver iterations:                             1Elapsed runtime seconds:                          0.07Model Class:                                        LPTotal variables:                      2Nonlinear variables:                  0Integer variables:                    0Total constraints:                    5Nonlinear constraints:                0Total nonzeros:                       8Nonlinear nonzeros:                   0Variable           Value        Reduced CostCAPACITY( A)        12.00000            0.000000CAPACITY( B)        8.000000            0.000000CAPACITY( C)        16.00000            0.000000CAPACITY( D)        12.00000            0.000000PRICE( P)        2.000000            0.000000PRICE( Q)        3.000000            0.000000X( P)        4.000000            0.000000X( Q)        2.000000            0.000000T( P, A)        2.000000            0.000000T( P, B)        1.000000            0.000000T( P, C)        4.000000            0.000000T( P, D)        0.000000            0.000000T( Q, A)        2.000000            0.000000T( Q, B)        2.000000            0.000000T( Q, C)        0.000000            0.000000T( Q, D)        4.000000            0.000000Row    Slack or Surplus      Dual Price1        14.00000            1.0000002        0.000000            0.0000003        0.000000            1.5000004        0.000000           0.12500005        4.000000            0.000000

总结

本小节主要讲了lingo定义派生集合的构造方法,以及给矩阵常量赋值的方法,还有通过举例来实现有关集合遍历函数的嵌套使用的方法,需要重点掌握。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部