Lingo-基本集合和派生集合

Lingo-基本集合和派生集合

1.例题:

这里写图片描述
当使用现有临时料场时,决策变量只有 cij,是 LP 模型;当为新建料场选址时决策变量为 cij 和xj , yj ,由于目标函数 f 对xj , yj 是非线性的,所以在新建料场时是 NLP 模型。我们现
在先解 NLP 模型,而把现有临时料场的位置作为初始解告诉 LINGO.

输入后的程序如图 4-13 所示。我们在集合段定义了三个集合,其中 DEMAND 和 SUPPLY 集合的及其属性的含义与上一个例子类似,而 LINK 则是在前两个集合的基础上定义的一个集 合。LINK 中的元素就是 DEMAND 和 SUPPLY 的笛卡儿积,也就是
LINK={(S,T)|S∈DEMAND,T∈SUPPLY}

因此,其属性 C 也就是一个 6*2 的矩阵(或数组)。正是由于这种表示方式,LINGO 建模语 言也称为矩阵生成器(MATRIX GENERATOR)。DEMAND 和 SUPPLY 这种直接把元素列举 出来的集合,称为基本集合(primary set,也可译为“原始集合”),而把 LINK 这种基于基 本集合构造的集合称为派生集合(derived set, 也可译为“导出集合”)。

model:
    title: location problem;
    sets:
        demand/1..6/:a,b,d;
        supply/1..2/:x,y,e;
        link(demand,supply):c;  ! 将基于集合构造的集合,叫做派生集合;
    endsets
    data:
        ! 需求点位置;
        a = 1.25,8.75,0.5,5.75,3,7.25;
        b = 1.25,0.75,4.75,5,6.5,7.75;
        ! a,b 还可以这样赋值
            a,b=1.25,1.25,8.75,0.75,0.5,4.75,5.75,5,3,6.5,7.25,7.75;
        ! 供需量;
        d = 3,5,4,7,6,11;
    enddata

    init:
        ! 初始点;
        x,y=5,1,2,7;
        ! x,y 还可以这样赋值
            注意其顺序:
        ! x = 5,2;
        ! y = 1,7;
        ! 错误:
        ! x = 5,1;
        ! y = 2,7;

    endinit

    ! 目标;
    [obj] min = @sum(link(i,j):c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2)); 
         ! 对目标行([OBJ]) 和两类约束(DEMAND_CON、SUPPLY_CON)分别进行了命名(请特别注意这里约束命名的 特点)
         ! LINK 中的元素就是 DEMAND 和 SUPPLY 的笛卡儿积
    ! 需求约束;
    @for(demand(i):[DEMAND_CON]@sum(supply(j):c(i,j)) = d(i);); 
    ! 供应约束;
    @for(supply(i):[SUPPLY_CON]@sum(demand(j):c(j,i)) = e(i););
    @for(supply:@free(x);@free(y));  ! 解除非负限制
end 

知识点

1.1.1

我们在集合段定义了三个集合,其中 DEMAND 和 SUPPLY 集合的及其属性的含义与上一个例子类似,而 LINK 则是在前两个集合的基础上定义的一个集 合。LINK 中的元素就是 DEMAND 和 SUPPLY 的笛卡儿积,也就是LINK={(S,T)|S∈DEMAND,T∈SUPPLY}因此,其属性 C 也就是一个 6*2 的矩阵(或数组)。
正是由于这种表示方式,LINGO 建模语 言也称为矩阵生成器(MATRIX GENERATOR)。DEMAND 和 SUPPLY 这种直接把元素列举 出来的集合,称为基本集合(primary set,也可译为“原始集合”),而把 LINK 这种基于基 本集合构造的集合称为派生集合(derived set, 也可译为“导出集合”)。

1.1.2

本模型中包括了初始段,请特别注意其中“X Y =5,1,2,7;”语句的实际赋值顺序是 X=(5,2), Y=(1,7), 而不是X=(5,1), Y=(2,7)。也就是说,LINGO对数据是按列赋值的,而不是 按行。当然,你直接写成两个语句“X=5,2; Y=1,7;”也是等价的。同样道理,数据段中对 常数数组A,B的赋值语句也可以写成
A, B=1.25 1.25 8.75 0.75 0.5 4.75 5.75 5 3 6.5 7.25 7.75; 请注意我们前面说过,这时空格与逗号“,”或“回车”的作用是等价的。

1.1.3

由于新建料场的位置可以是任意的,所以我们在约束的最后(模型最后的END上面一行) 用@free 函数取消了变量 X、Y 非负限制。此外,我们用 TITLE 语句对这个模型取了一个标题 “LOCATION PROBLEM”(见模型开始的“MODEL:”下面一行);并且对目标行([OBJ]) 和两类约束(DEMAND_CON、SUPPLY_CON)分别进行了命名(请特别注意这里约束命名的 特点)。

1.2 结果:

局部最优解 X(1)=7.249997, X(2)=5.695940,Y(1)=7.749998, Y(2)=4.928524,C(略),最 小运量=89.8835(吨公里)。

Local optimal solution found.
  Objective value:                              85.69652
  Infeasibilities:                              0.000000
  Total solver iterations:                           104

  Model Class:                                       NLP

  Total variables:                     18
  Nonlinear variables:                 16
  Integer variables:                    0

  Total constraints:                    9
  Nonlinear constraints:                1

  Total nonzeros:                      42
  Nonlinear nonzeros:                  16


  Model Title: : location problem
                                Variable           Value        Reduced Cost
                                   A( 1)        1.250000            0.000000
                                   A( 2)        8.750000            0.000000
                                   A( 3)       0.5000000            0.000000
                                   A( 4)        5.750000            0.000000
                                   A( 5)        3.000000            0.000000
                                   A( 6)        7.250000            0.000000
                                   B( 1)        1.250000            0.000000
                                   B( 2)       0.7500000            0.000000
                                   B( 3)        4.750000            0.000000
                                   B( 4)        5.000000            0.000000
                                   B( 5)        6.500000            0.000000
                                   B( 6)        7.750000            0.000000
                                   D( 1)        3.000000            0.000000
                                   D( 2)        5.000000            0.000000
                                   D( 3)        4.000000            0.000000
                                   D( 4)        7.000000            0.000000
                                   D( 5)        6.000000            0.000000
                                   D( 6)        11.00000            0.000000
                                   X( 1)        1.763258            0.000000
                                   X( 2)        7.084841            0.000000
                                   Y( 1)        5.207022            0.000000
                                   Y( 2)        7.053503            0.000000
                                   E( 1)        13.00000            0.000000
                                   E( 2)        23.00000            0.000000
                                C( 1, 1)        3.000000            0.000000
                                C( 1, 2)        0.000000            4.239412
                                C( 2, 1)        0.000000            1.767584
                                C( 2, 2)        5.000000            0.000000
                                C( 3, 1)        4.000000            0.000000
                                C( 3, 2)        0.000000            5.632733
                                C( 4, 1)        0.000000            1.542894
                                C( 4, 2)        7.000000            0.000000
                                C( 5, 1)        6.000000            0.000000
                                C( 5, 2)        0.000000            2.332947
                                C( 6, 1)        0.000000            5.331591
                                C( 6, 2)        11.00000            0.000000

                                     Row    Slack or Surplus      Dual Price
                                     OBJ        85.69652           -1.000000
                          DEMAND_CON( 1)        0.000000           -3.990170
                          DEMAND_CON( 2)        0.000000           -6.519732
                          DEMAND_CON( 3)        0.000000           -1.343388
                          DEMAND_CON( 4)        0.000000           -2.449220
                          DEMAND_CON( 5)        0.000000           -1.789224
                          DEMAND_CON( 6)        0.000000          -0.7158107
                          SUPPLY_CON( 1)        0.000000            0.000000
                          SUPPLY_CON( 2)        0.000000            0.000000

猜你喜欢

转载自blog.csdn.net/qq_39481214/article/details/81781973