Lingo-稠密集合和稀疏集合-(0/1规划)

Lingo-稠密集合和稀疏集合

1.1简介:

我们把派生集合 MATCH 的元素定义为 DEMAND 和 SUPPLY 的笛卡儿积,这种派生集 合称为稠密集合(简称稠集)。其实在 LINGO 中,派生集合的元素可以只是这个笛卡儿积的 一个真子集合,这种派生集合称为稀疏集合(简称疏集)。

1.2例题:

最短路问题 在复杂的公路网中,货车司机希望找到一条从一个城市到另一个城市的最短 路. 假设图 4-17 表示的是该公路网, 节点表示货车可以停靠的城市,弧上的权表示两个城市之 间的距离(百公里)。货车从城市 S 出发到达城市 T,如何选择行驶路线,使所经过的路程最短?
Lingo-稠密集合和稀疏集合-(0/1规划)_第1张图片

1.3分析:

假设从S到T的最优行驶路线 P 经过城市C1, 则P中从S到C1的子路也一定是从S到 C1的最优行驶路线;
假设 P 经过城市C2, 则P中从S到C2的子路也一定是从S到C2的最优 行驶路线.
因此, 为了得到从 S 到 T 的最优行驶路线, 我们只需要先求出从 S 到 Ck(k=1,2)的最 优行驶路线, 就可以方便地得到从 S 到 T 的最优行驶路线.
为了求出从 S 到 Bj(j=1,2)的最 优行驶路线, 只需要先求出从S到Ai(i=1,2,3)的最优行驶路线.
而S到Ai(i=1,2,3)的最优行驶路 线是很容易得到的(实际上, 此例中 S 到 Ai(i=1,2,3)只有唯一的道路).
d(Y,X)为城市 Y 与城市 X 之间的直接距离(若这 两个城市之间没有道路直接相连,则可以认为直接距离为无穷大),用L(X)表示城市 S 到城市 X 的最优行驶路线的路长
则:

L(S)=0; L(X)=min{L(Y)+d(Y,X)}, Y≠X

1.3.1对本例的具体问题,可以直接计算如下:

X ≠S
L(A1)=6, L(A2)=3, L(A3)=3;
L(B1)=min{ L(A1)+6, L(A2)+8, L(A3)+7}= 10 = L(A3)+7,
L(B2)=min{ L(A1)+5, L(A2)+6, L(A3)+4}= 7 = L(A3)+4;
L(C1)=min{ L(B1)+6, L(B2)+8}= 15 = L(B2)+8,
L(C2)=min{ L(B1)+7, L(B2)+9}= 16 = L(B2)+9;
L(T)=min{ L(C1)+5, L(C2)+6}= 20 = L(C1)+5.

所以, 从S到T的最优行驶路线的路长为20. 进一步分析以上求解过程, 可知从S到T的
最优行驶路线为 S→ A3→ B2→ C1 → T. 这种方法称为动态规划(Dynamic Programming)。 作为一个例子,我们用 LINGO 来解这个最短路问题。
我们可以编写 LINGO 程序。

model:
    sets:
        citys/s,a1,a2,a3,b1,b2,c1,c2,t/:L;
        roads(citys,citys)/s,a1 s,a2 s,a3 
                    a1,b1 a1,b2 a2,b1 a2,b2 a3,b1 a3,b2
                    b1,c1 b1,c2 b2,c1 b2,c2
                    c1,t c2,t/:d;
    endsets

    data:
        d=6 3 3
        6 5 8 6 7 4
        6 7 8 9
        5 6;
        l=0,,,,,,,,;  ! 第一个值为0,其他的未知;
    enddata

    @for(citys(i)|i#gt#@index(s):  ! @index(s)表示s的索引,这里面索引从一开始;
        l(i)=@min(roads(j,i):l(j)+d(j,i)););
end

集合段定义的 CITIES 是一个基本集合(元素通过枚举给出),L 是其对应的属性变量(我 们要求的最短路长);ROADS 是由 CITIES 导出的一个派生集合(请特别注意其用法),由于 只有一部分城市之间有道路相连,所以我们进一步将其元素通过枚举给出,这就是一个稀疏
集合。D 是 ROADS 对应的属性变量(给定的距离)。
从模型中还可以看出:这个 LINGO 程序可以没有目标函数,这在 LINGO 中是允许的,
可以用来找可行解(解方程组和不等式组)。此外,在数据段我们对 L 进行了赋值,但只有 L (S)=0 是已知的,所以后面的值为空(但位置必须留出来,即逗号“,”一个也不能少,否 则会出错)。如果这个语句直接写成“L=0;”,语法上看也是对的,但其含义是 L 所有元素的 取值全部为 0,所以也会与题意不符。

从这个例子还可以看出,虽然集合 CITIES 中的元素不是数字,但当它以 CITIES(I)的 形式出现在循环中时,引用下标 I 却实际上是正整数,也就是说 I 指的正是元素在集合中的位 置(顺序),一般称为元素的索引(INDEX)。我们在@for 循环中故意用了一个函数“@index”, 其作用是返回一个元素在集合中的索引值,这里@index(S )=1,所以逻辑关系式 “I#GT#@index(S )”可以直接等价地写成“I#GT#1”。这里@index(S )实际上还是 @index(CITIES,S )的简写,即返回 S 在集合 CITIES 中的索引值。

1.4结果:

可以看出, 从 S 到 T 的最优行驶路线的路长为 20 (进一步分析,可以得到从 S 到 T 的最优行驶路线为 S→ A3→ B2→ C1 → T)。
上面这个例子中定义稀疏集合 ROADS 的方法是将其元素通过枚举给出,有时这还是太麻 烦了,用起来不方便。

Total solver iterations:                             0

  Model Class:                                     . . .

  Total variables:                      0
  Nonlinear variables:                  0
  Integer variables:                    0

  Total constraints:                    0
  Nonlinear constraints:                0

  Total nonzeros:                       0
  Nonlinear nonzeros:                   0

                                                    Variable           Value
                                                       L( S)        0.000000
                                                      L( A1)        6.000000
                                                      L( A2)        3.000000
                                                      L( A3)        3.000000
                                                      L( B1)        10.00000
                                                      L( B2)        7.000000
                                                      L( C1)        15.00000
                                                      L( C2)        16.00000
                                                       L( T)        20.00000
                                                   D( S, A1)        6.000000
                                                   D( S, A2)        3.000000
                                                   D( S, A3)        3.000000
                                                  D( A1, B1)        6.000000
                                                  D( A1, B2)        5.000000
                                                  D( A2, B1)        8.000000
                                                  D( A2, B2)        6.000000
                                                  D( A3, B1)        7.000000
                                                  D( A3, B2)        4.000000
                                                  D( B1, C1)        6.000000
                                                  D( B1, C2)        7.000000
                                                  D( B2, C1)        8.000000
                                                  D( B2, C2)        9.000000
                                                   D( C1, T)        5.000000
                                                   D( C2, T)        6.000000

                                                         Row    Slack or Surplus
                                                           1        0.000000
                                                           2        0.000000
                                                           3        0.000000
                                                           4        0.000000
                                                           5        0.000000
                                                           6        0.000000
                                                           7        0.000000
                                                           8        0.000000

你可能感兴趣的:(L,建模算法,Lingo)