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

GNU线性编程中的中间问题

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

第 8 行和第 9 行定义了两个集合:FOODNEED,但是这两个集合的元素都是在第 28 行和 29 行的数据部分声明的。FOOD 集合中包含了前面给出的 4 种食物约束。

由于空格字符被用来分隔集合中的元素,因此 Ice cream 元素(这里没有使用 icecream)需要在名字两边使用双引号括起来。如果我们希望在 MathProg 名字中使用非 ASCII 字符,那么即使名字中间没有空格,也应该使用双引号将它们括起来。

现在我们回到模型部分上来。NEED 集合中保存了 4 种饮食的需要。第 12、13 和 14 行定义了问题的参数:NeedCostNutrTable(营养表)。每个 FOOD 都有一个成本值。对于 NEED 集合中的每种营养都有一定的需求量。我们可以试图为每个集合使用不同的命名索引变量;这是一个好主意,尤其是在进行调试时更为突出。在这种情况中,FOOD 集合使用 i,而 NEED 集合使用 j。数据部分中的 CostNeed 参数是在 37 行到 47 行进行定义的。

在 12 行上定义的营养表和在 31 到 35 行给出的数据有两个维度,这是因为每种食物都提供了多种营养价值。因此,营养表 NutrTable 就是 FOODNEED 集合之间的一个映射。注意行和列的次序与元素在每个集合中的顺序是相同的,索引变量名在第 12、13 和 14 行是一致的。

在这个练习中,i 轴是行,j 轴是列,这符合大部分数学专才的习惯。这个两维参数声明(最多 N 列 M 行)的语法如下:


清单 2. 两维参数声明的语法

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 行的目标函数要对食物的总体成本实现最小化,该值是每个决策变量(食物数量)乘以每单位食物成本的结果。注意 iFOOD 集合的索引。

第 23 行声明了所有这 4 种食品的约束。这是采用非常精简的风格来编写的,因此需要特别注意!冒号 : 左边的定义告诉 GLPK 为 NEED 集合中的每种需要创建一个约束: const[Calorie]const[Chocolate]const[Sugar]const[Fat]。每个约束都要有自己的营养需求,每种食品的数量乘以每单位该食品所提供的营养需要的总和就是这种营养的总量;这个总和应该大于或等于日常饮食对该种营养的最小需求。

展开之后,这个声明应该如下所示(i 会遍历整个 FOOD 集合):


Equation 7

Equation 8

Equation 9

Equation 10

清单 3. 这个问题中 glpsol 的输出

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)

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