第 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 时”。对于其他约束来说全部类似。
== 逻辑比较符也可以在这些表达式中使用。
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 的输出对整型情况的结果稍有不同:
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) 更多相关文章
|
推荐文章
精彩文章
|