GNU 线性编程工具包(线性优化简介)回想一下我们对这个问题的 假设。前三条确定了决策变量和目标函数。第 4 个假设和第 6 个假设说完成士兵的制造需要耗费一定的木工和修整工工时。此处的约束是 Giapetto 并没有无限的木工和修整工工时。这就是约束!下面我们来分析并澄清这个问题。 一个士兵需要 2 小时的修整工时劳动,Giapetto 每周最多有 100 小时的修整工劳动力,因此每周就不能生产超过 50 个士兵。类似地,木工工时的约束也使它不能每周生产超过 80 个士兵。注意第一个约束比第二个约束更为严格。第一个约束实际上是第二个约束的一个子集,因此第二个约束实际上是冗余的。 上面这段描述展示了怎么样对优化问题进行建模,但这只是不完全的一个分析,因为所有必需的变量都还没有充分考虑。这尚不是 Giapetto 问题的彻底解决方案。那么我们应该怎么样解决这个问题呢? 我们首先通过分析约束因素来发现所有的约束条件。首先,到底是什么约束的修整工时?由于士兵和火车都需要修整时间,因此它们都需要考虑在内。假设要制造 10 个士兵和 20 辆火车。这所需要的修整工时是 10 乘以 2 小时(用来生产士兵)加上 20 乘以 1 小时(用来生产火车),总共是 40 小时的修整劳动力。按照决策变量的术语来说,通用的约束为:
现在我们已经知道了修整工时的约束,同样也可以得出木工工时的约束:
现在 GLPK 可以解析这个模型了(由于 GLPK 很擅长解决线性优化问题)。 下面我们来了解以下问题的解析空间。有了这两个决策变量,它就有了两个维度。 ( 正如我们给出的约束一样,这个无限的解析空间达到了边界。有了上面的 不等式 6,结果就更加有趣了。 这个解析空间包含了 ( 在加上 不等式 7 之后,结果就收缩了。
注意,这个解析空间更小。这意味着其中只有更少的 ( 这样解析空间更小了。这个可以满足所有约束的解析空间称为可行域(feasible region)。图 4 给出了 Giapetto 商店的可行域。这个区域中任何 ( 现在的问题是:哪个值能够使得 Giapetto 的收益最大化呢? GLPK 对于解析这个问题来说是一个很好的工具。Giapetto 问题中的数学公式需要使用 GNU MathProg 语言进行编写。需要声明的关键内容有:
下面的代码显示了怎么样使用 MathProg 来解决 Giapetto 问题。代码中的行号都不是代码本身的一部分。添加这些行号只是为了能够方便地对代码进行引用。
|