第 8 行和第 9 行定义了两个集合:FOOD 和 NEED,但是这两个集合的元素都是在第 28 行和 29 行的数据部分声明的。FOOD 集合中包含了前面给出的 4 种食物约束。
由于空格字符被用来分隔集合中的元素,因此 Ice cream 元素(这里没有使用 icecream)需要在名字两边使用双引号括起来。如果我们希望在 MathProg 名字中使用非 ASCII 字符,那么即使名字中间没有空格,也应该使用双引号将它们括起来。
现在我们回到模型部分上来。NEED 集合中保存了 4 种饮食的需要。第 12、13 和 14 行定义了问题的参数:Need、 Cost 和 NutrTable(营养表)。每个 FOOD 都有一个成本值。对于 NEED 集合中的每种营养都有一定的需求量。我们可以试图为每个集合使用不同的命名索引变量;这是一个好主意,尤其是在进行调试时更为突出。在这种情况中,FOOD 集合使用 i,而 NEED 集合使用 j。数据部分中的 Cost 和 Need 参数是在 37 行到 47 行进行定义的。
在 12 行上定义的营养表和在 31 到 35 行给出的数据有两个维度,这是因为每种食物都提供了多种营养价值。因此,营养表 NutrTable 就是 FOOD 和 NEED 集合之间的一个映射。注意行和列的次序与元素在每个集合中的顺序是相同的,索引变量名在第 12、13 和 14 行是一致的。
在这个练习中,i 轴是行,j 轴是列,这符合大部分数学专才的习惯。这个两维参数声明(最多 N 列 M 行)的语法如下:
param label : J_SET_VAL_1 J_SET_VAL_2 ... J_SET_VAL_N := I_SET_VAL_1 param_1_1 param_1_2 ... param_1_N I_SET_VAL_2 param_2_1 param_2_2 ... param_2_N ... ... ... ... ... I_SET_VAL_M param_M_1 param_M_2 ... param_M_N; |
不要忘记第一行末尾的 :=以及最后一行末尾的 ; 符号。
第 17 行声明了决策变量,并声明每个决策变量都不能是负数。这是一个非常简单的定义,因为数组 x 是使用 FOOD 集合中的元素自动定义的。
第 20 行的目标函数要对食物的总体成本实现最小化,该值是每个决策变量(食物数量)乘以每单位食物成本的结果。注意 i 是 FOOD 集合的索引。
第 23 行声明了所有这 4 种食品的约束。这是采用非常精简的风格来编写的,因此需要特别注意!冒号 : 左边的定义告诉 GLPK 为 NEED 集合中的每种需要创建一个约束: const[Calorie]、 const[Chocolate]、 const[Sugar] 和 const[Fat]。每个约束都要有自己的营养需求,每种食品的数量乘以每单位该食品所提供的营养需要的总和就是这种营养的总量;这个总和应该大于或等于日常饮食对该种营养的最小需求。
展开之后,这个声明应该如下所示(i 会遍历整个 FOOD 集合):
Problem: diet
Rows: 5
Columns: 4
Non-zeros: 18
Status: OPTIMAL
Objective: z = 0.9 (MINimum)
No. Row name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 z B 0.9
2 const[Calorie]
B 750 500
3 const[Chocolate]
NL 6 6 0.025
4 const[Sugar] NL 10 10 0.075
5 const[Fat] B 13 8
No. Column name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 x[Brownie] NL 0 0 0.275
2 x['Ice cream']
B 3 0
3 x[soda] B 1 0
4 x[cake] NL 0 0 0.5
Karush-Kuhn-Tucker optimality conditions:
KKT.PE: max.abs.err. = 1.82e-13 on row 2
max.rel.err. = 2.43e-16 on row 2
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 3
max.rel.err. = 4.27e-17 on column 3
High quality
KKT.DB: max.abs.err. = 0.00e+00 on row 0
max.rel.err. = 0.00e+00 on row 0
High quality
End of output
上一篇:面向普通人的 PHP 加密 下一篇:在Unix下用命令行中完成所有的工作(3) 更多相关文章
|
推荐文章
精彩文章
|