番外篇: 从线性规划作业说起

《运筹学》系列文章:

  1. 初识运筹学
  2. 线性规划与单纯形法
  3. 番外篇: 从线性规划作业说起

实践是检验真理的唯一标准

番外篇: 从线性规划作业说起_第1张图片
植树实践

导言:国庆期间老师布置了十道线性规划的大题,题目要求是利用软件来求解这些问题。

不得不说老师的这种安排,非常的具有开拓性。一般而言,日后如果我们碰到线性规划的问题,肯定不会再拿一张纸然后手工计算半天,毕竟现在是在信息时代。况且我们已经读研究生了,我觉得也没有必要遵循守旧的照着课本来。之前用Octave写过的程序完全可以在此次实践中查漏补缺,使程序更加完善。注意本次实验是利用了改进单纯形法(即单纯型法的矩阵描述)

而确实实际的情况是通过这次作业,之前的代码更改了很多,程序变得更加稳健!

1. 题目:

《运筹学》课本:
p55 2.1 1-4 2.2 1 2.3 1-2 p56 2.6 1-2 p87 3.1 1-2 p88 3.3 1-2 p90 3.9 1-2 3.10 p113-114 4.3 4.4

2. 解题思路:

  1. 首先利用Octave(GLPK) 求解了线性规划的相关习题。
  2. 之后利用《运筹学》中单纯型法的矩阵描述(改进单纯型法),自编函数实现在单纯型法的的求解运算,同时还编写了化标准型,图解法等子程序。将该算法用解释型程序设计语言Octave 进行了具体的实现。
  3. 将自带函数运行结果,自编函数运行结果与手算结果进行比较。

程序主体见github网站

3.针对题目的总结

通过Octave开源软件便捷地计算了各个题目的解,同时自编函数实现了矩阵描述的单纯形法子程序及其它的一些配套子程序(关于程序的编写思路请看个人的一个博客http://www.jianshu.com/p/9965e111537e)。同时为了使本报告不至于太臃肿,现将大段的代码放于github。在求解题目的过程中我有如下的感受:

  1. 通过求解P56:2.6-(2)等有无穷多解的题目,我发现一般而言程序时无法告知你题目有无穷多解的。因为一般而言计算机求解多用不断迭代的算法,寻找到一个最优解后便会停止迭代。但是通过自编子程序,借助于《运筹学》课本上的判断条件,可以报告出有无穷多解的信息。
  2. 已有的线性规划求解软件一般比较成熟,会比自己编写的子程序稳健很多。自我编写的程序在出现“无界解”的情况时还会进入死循环;同时对于不易寻找初始解的标准型,还需要人工对增广矩阵进行初等行变换以符合求解条件。
  3. 开源软件或许有自己的不足之处。题目P55:2.3-(1)形式如同P55:2.3-(2)但是经过多次的尝试,发现软件一直说无最优解。但是运行自编程序却存在最优解。
  4. 对于p113-114 4.4这里的灵敏性分析问题,在技术上可以将要查看灵敏度变化的值作为自变量,将输出的解作为因变量。然后利用一个for循环,改变自变量的值之后查看因变量是否会变化。从而找到题目的解。当然也可以在理论上,借助于检验数计算。

4.针对实验内容的总结

使用软件的一个最主要的优点是:你可以完全不知道自己的原理,只要会使用就行。本实验主要的难点在于看懂课本上的单纯形法的矩阵描述,然后自编函数实现这个过程。因为数学其实是一门语言,尽管可以费时间看懂这整个过程,但是将整个矩阵表述编写为程序还是有些困难。但是经过不断地尝试还是可以写出一个稳健度不高的程序出来。
本次报告利用了开源版的Matlab替代软件Octave,因为Matlab需要购买版权才能使用。通过这次尝试,可以证明处理这些问题,开源软件完全可以胜任。
实践出真知:只有将自己写的程序真正做过题目你才知道自己的程序是不是够稳健!同时写过程序你才知道课本中很多话的真正含义,比如课本P45页无可行解的判定条件,我以为是x的最终的解不为0,原来是sigma不为零。

5.实验结果:

题目 Octave(glpk) 程序运行情况 Octave自己编程运行情况 手算
P55:2.1-(1) 有最优解(2 4)’ 有最优解(2 4)’ 同前
P55:2.1-(2) 有最优解(3/2 1/2)’ 有最优解(3/2 1/2)’ 同前
P55:2.1-(3) No dual feasible solution. 程序显示出“无界解” 无界解
P55:2.1-(4) No primal feasible solution. 无解 无解
P55:2.2-(1) 有最优解(0 8 0 -6)’ 在不引入人工变量M 的情况下,先将原等 式用化标准型子程序 化为标准型。再人工 对增广矩阵进行初等 行变换,使其符合函 数输入要求 。 新问题转化后计算得 无穷多解,将解人工转化后同前 -
P55:2.3-(1) 运行出错:No dual feasible solution. 很奇 怪,开源软件有其不 足之处。 经人工转换得初始 解,在带入自编函数。 求得最优解(6.8 0 0 1.4) -
P55:2.3-(1) 求得最优解(0.4 0 2.2 0)’ - -
P56:2.6-(1) 得最优解(6.43,0.57,0)’ 需要手工进行初始行 变换得最优解。 -
P56:2.6-(2) 得最优解 (0.8,1.8,0)’但 是不能得出无穷多解 程序结果不符合,不 能直接用单纯形法 存在无穷多解
p87:3.1-(1) 得最优解 (4 6 0)’ 得到最优解 -
p87:3.1-(1) 得最优解(0.6 1.2)’ 需要手工进行初始行 变换得最优解。 -
p88:3.3-(1) 得最优解(0 2/3 0)’ 程序结果不符合,不 能直接用单纯形法 -
p88:3.3-(2) No dual feasible solution 进入死循环 -
p90:3.9-(1) 得最优解(1.61538 0.76923)’ - -
p90:3.9-(2) 得最优解(3 0 0 0)’ 程序结果不符合,不 能直接用单纯形法 -

__ 题目:p113-114 4.4(1) __
计算最优解同上。对于第一小题c22的单位运价的范围,本文采用一个for循环,将每次 计算所得的值与原题的最优解比较。逐步变更范围,从而确定最终答案。 因为运价肯定大于0,所以先设定单位运价的范围为0~15,此时发现运价从10开始最优 解的发生变化,故确定范围为0<=c22<10,当c22等于10时,将新解与原解比较,发现 问题有多解,故确定范围为0<=c22<=10,经手工计算c22应大于等于3,但是当 0<=c22<=3时,用闭合回路进行调整时,发现闭合回路中含有0,故还是原来解最优。

__ 题目:p113-114 4.4(2) __
同样采用for循环,c24为非基变量,当c24下降当一定程度时必引起检验数小于零,使 解发生变化。当其不断上升时,检验数增大解不再发生变化,中间有一个点是两者的分 界线,故通过for循环来查找这个点。突变点在c24是17的位置。故当其为17使得到无 穷多最优方案。

你可能感兴趣的:(番外篇: 从线性规划作业说起)