Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

GNU线性编程中的中间问题

来源:IBM DW中国 作者:Rodrigo Ceron  时间:2007-04-22 点击: [收藏] [投稿]

第 9 行声明了一个名为 DAYS 的集合,其元素(本周中的天数,从周一开始)是在数据部分的第 32 行中声明的。

第 12 行为 DAYS 中的每天都声明了 Need 参数。第 34 行到 41 行定义了这个参数的值:每周的每天都所需要的最少员工数。

第 15 行将决策变量声明为一个数组,它有七个变量,索引在 DAYS 集合中定义;分别表示从该天开始工作的员工数目。

第 22 行到 28 行为每周的每天定义了一个约束。注意编写 7 个不等式作为 5 个不必有序的决策变量的和太过繁琐了,因为在某些约束中,索引可能会覆盖索引值 7。 GNU MathProg 为编程者提供了 表达式 来简化这个问题。

每个约束都是所有这些决策变量中除去那两天不工作的特殊日期之外(而不是直接包括工作的这 5 天)的综合结果。这个表达式在花括号({})中使用,它定义了和的索引。表达式的语法如下:

{index_variable in your_set: your_expression}

这个表达式可以使用逻辑比较操作。在本例中,Monday 约束使用了:i<>'Tue' 和 i<>'Wed',这表示 “当 i 不等于 Tue 并且 i 不等于 Wed 时”。对于其他约束来说全部类似。

== 逻辑比较符也可以在这些表达式中使用。


清单 5. 这个问题在 glpsol 中的解答

Problem:    post
Rows:       8
Columns:    7
Non-zeros:  42
Status:     OPTIMAL
Objective:  z = 22.33333333 (MINimum)

   No.   Row name   St   Activity     Lower bound   Upper bound    Marginal
------ ------------ -- ------------- ------------- ------------- -------------
     1 z            B        22.3333
     2 mon          NL            17            17                    0.333333
     3 tue          B             15            13
     4 wed          NL            15            15                    0.333333
     5 thu          NL            19            19                    0.333333
     6 fri          NL            14            14                       < eps
     7 sat          NL            16            16                    0.333333
     8 sun          B        15.6667            11

   No. Column name  St   Activity     Lower bound   Upper bound    Marginal
------ ------------ -- ------------- ------------- ------------- -------------
     1 x[Mon]       B        1.33333             0
     2 x[Tue]       B        5.33333             0
     3 x[Wed]       NL             0             0                       < eps
     4 x[Thu]       B        7.33333             0
     5 x[Fri]       NL             0             0                    0.333333
     6 x[Sat]       B        3.33333             0
     7 x[Sun]       B              5             0

Karush-Kuhn-Tucker optimality conditions:

KKT.PE: max.abs.err. = 3.55e-15 on row 6
        max.rel.err. = 2.37e-16 on row 6
        High quality

KKT.PB: max.abs.err. = 0.00e+00 on row 0
        max.rel.err. = 0.00e+00 on row 0
        High quality

KKT.DE: max.abs.err. = 5.55e-17 on column 1
        max.rel.err. = 2.78e-17 on column 1
        High quality

KKT.DB: max.abs.err. = 5.55e-17 on row 6
        max.rel.err. = 5.55e-17 on row 6
        High quality

End of output

咳,等会儿!没有人可以让 1.33333 个员工在周一开始工作!记住前面说过的用常识检查,这就是其中的一个例子。

GLPK 必须要将这些决策变量全部当作整型变量进行考虑。幸运的是,MathProg 有一种很好的方法来声明整型变量。我们只需要将第 15 行修改成下面的形式:

var x {i in DAYS} >=0, integer;

这相当简单。glpsol 的输出对整型情况的结果稍有不同:


清单 6. glpsol 对整型约束邮局问题的输出结果

Reading model section from post-office-int.mod...
Reading data section from post-office-int.mod...
50 lines were read
Generating z...
Generating mon...
Generating tue...
Generating wed...
Generating thu...
Generating fri...
Generating sat...
Generating sun...
Model has been successfully generated
lpx_simplex: original LP has 8 rows, 7 columns, 42 non-zeros
lpx_simplex: presolved LP has 7 rows, 7 columns, 35 non-zeros
lpx_adv_basis: size of triangular part = 7
      0:   objval =   0.000000000e+00   infeas =   1.000000000e+00 (0)
      7:   objval =   2.600000000e+01   infeas =   0.000000000e+00 (0)
*     7:   objval =   2.600000000e+01   infeas =   0.000000000e+00 (0)
*    10:   objval =   2.233333333e+01   infeas =   0.000000000e+00 (0)
OPTIMAL SOLUTION FOUND
Integer optimization begins...
Objective function is integral
+    10: mip =     not found yet >=              -inf        (1; 0)
+    19: mip =   2.300000000e+01 >=   2.300000000e+01   0.0% (9; 0)
+    19: mip =   2.300000000e+01 >=     tree is empty   0.0% (0; 17)
INTEGER OPTIMAL SOLUTION FOUND
Time used:   0.0 secs
Memory used: 0.2M (175512 bytes)
lpx_print_mip: writing MIP problem solution to `post-office-int.sol'...


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:面向普通人的 PHP 加密   下一篇:在Unix下用命令行中完成所有的工作(3)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号