利用LINDO软件计算家畜日粮配方点滴体会
徐夕水 何伟华
利用微机进行家畜日粮配方计算,是在满足家畜营养需要的前提下,既能解决多种原料、多种指标的复杂计算问题,又能获得最低饲料成本的一种现代计算技术。利用原料单价、原料营养会计含量、营养需要量、原料约束条件多时求解问题比较复杂,手工运算几乎不可能完成,但若用微机处理,只要会调用、操作现有软件即可。
LINDO
是Linear Interclctive and Discrete Optiomize字母的缩写形式,是由Linus Schrage于1986年开发的优化软件包,可以用来求解线性规划(LP-Linear Programing),整数规划(IP-Interger Programing)和二次规划(QP-Quatratic Programing)问题。LINDO易于规划问题的输入、求解和分析,程序执行速度很快,最多可求解200个变量和100个约束的规划问题。
笔者旨在介绍利用目前国内外已流行开来的求解线性规划问题的
LINDO软件筛选家畜日粮配方(示例)的体会,并针对LINDO软件在求解出决策变量值后求考虑显示线性规划方程组右边实际达到值(即饲料配方中的营养指标值等)缺陷,特编写给出“现有日粮配方营养检测”的BASIC程序。
- 示例
首先根据种种的营养成分(营养介值)、原料价格、营养需要量或包括饲料约束量等数据建立出完整的线性规划方程组(见下所示)。
F=0.23x1+0.46x2
→min(即求饲料本方成本为最小值)
- 78x1+0.56x2≥66
s.t 0.12x1+0.45x2≥18
x1+10x2≥300
注:上列线性规划问题系引自农业出版社
1979年出版、东北农学院主编的《家畜饲养学》第296页,在下述中,凡涉及该模型进,目标函数为第1行,第一个约束条件乏为第2行,第十个约束条件称为第3行,……依此类推。
简介及其应用步骤 LINDO
LINDO
求解机制
LINDO
的求解过程采用单纯型法,一般是首先寻求一个可行解,之后再寻求最优解。用LINDO求解一个LP问题会等到如下的几种结果:不可行(No feasible solution)功楞行(Feasible),可行时又可分为:有最优解(Optinal solution)和解无界(Unbounded solution)两种情况,所以使用者就检查是否少了一个约束条件或有其他印刷错误。
2.2
启动LINDO
当我们启动
DOS系统后,把带有LINDO.EXE的程序盘插入驱动器中并键入LINDO即可进入LINDO的工作环境(也可事先将LINDO.EXE拷入硬盘的某个子目录下,再执行LINDO),屏幕左上角显示版权等信息,并有LINDO提示符:出现(则表示LINDO软件已启动正常,等待用户输入命令),详见下民示。
LINDO
/PC5.02(4 MAR 92)STUDENT VERSION FOR EDUCATIONAL USE
ONLY
SINGLE USER LICENSE FOR EDUCATIONAL
USE ONLY
DISTRIBUTED WITH TEXTBOOKS FOR
WADSWORTH PUBLISHING
:
2.3
输入线性规划问题当有
LINDO提示符:出现时,则表示使用者可输入线性规划问题中的具体数据(原始形式输入,元需标准化,在输入约束条件时,因键盘上没有“≤”或“≥”,故分别用“<”或“>”来代替=。格式如下::
min 0.23x1+0.46x2(CR)(CR表明键回车键,此行输入的系指明目标函数及其类型,注:当求目标函数为最大值时,则将min改为max)?
S.T(CR)(指明后面输入的是约束条件)?
0.78x1+0.56x2>66(CR)?0.12x1+0.45x2>18(CR)
?1x1+10x2>300(CR)
?end
(表明输入问题结束,并回到等待命令状态)当问题输入后,确认准确无误后,打入GO即可求得其最优解,具体操作及所得结果如下:
:
go (CR求解当前问题)(注:上述符号“:”和“?”都系软件的提示符,用户不用输入。下面为输出结果,如果输出到打印机,则先按
[CTRL]+P)。LP OPTIMUM FOUND AT STEP 2
(经过2次迭代后达到最优)OBJECTIVE FUNCTION VALUE
(
目标函数值)
26.303870(表示最优目标值为26.303870即所求低饲料配方成本)。
|
VARIABLE |
VALUE |
REDUCED COST |
|
(变量名) |
最优解中各变量的值 |
(缩减成本) |
|
X1 |
67.955800 |
.000000 |
|
X2 |
23.204420 |
.000000 |
|
ROW |
SLACK OR SURPLUS |
DJAL PRICES |
|
(行) |
(松驰或剩余变量) |
(景子价格) |
|
2 |
.000000 |
-.254144 |
|
3 |
.596685 |
.000000 |
|
4 |
.000000 |
-.031768 |
NO.ITERATIONS=2
(表示用单纯形法进行了2次迭代(旋转))
DO RANGE(SENSITIVITY) ANALYSIS?
(是否进行范围(灵敏度)分析)?Y(回答Y或
y进行,否则结束退出)RANGES IN WHICH THE BASISIS VisV UNCHANGED:
(在下面的范围内基不变)
OBJ COEFFICENT RANGES
(
目标函数系数范围)
VARIABLE CURRENT ALLOWABLE ALLOWABLE
COEF INCREASE DECREASE
(
变量名) (当前系数) (允许增加) (允许减少)X1 .230000 .410714 .184000
X2 .460000 1.840000 .294872
RIGHTHAND SIDE RANGES
(
右边值范围)
ROW CURRENT ALLOWABLE ALLOWABLE
RHS ICCREASE DECREASE
(
行) (当前右边值) (允许增加) (允许减少)2
66.000000 168.000000 5.7599973 18.000000 .596685 INFINITY
4 300.000000 878.571400 15.221980
如果想将刚才输入的数据文件进行存盘,可在“:”提示符下键入“
SAVE<路径>文件名”即可。如果想重新看看刚才的模型,可键入LOOK命令,LINDO会询问具体的行号(ROW),例如应答为2,则结果相应地会显示出第2行。如果想删除指定的约束条件即数据模型的某一行,可键入“DEL<行号>”,则相应行的数据均会被删除。还可用EXIT命令-可增加一个新的约束行、APPC命令-可增加一个新列增一个新的变量。若想修改模型,可键入ALTER(可简化为:ALT命令,其基本格式是:
ALT
行号 变更
其中:行号是要修改的行号,变量有三种情况:或者是某一个变量名;或者是右边值;或者是修改其方向。例如(1)要将上面问题中第二个约束条件的方向由≥改为≤(4)并查看一下修改后的模型,则其具体的修改操作过程如下:
:
ALT 2X1(CR)(将上面问题中第二个约束条件的右边值,由18改为20)NDW COEFFICIENT:
20(CR)
:ALT 3 DIR (CR)(
将上面问题中第十个约束条件的方向由≥改为≤)NDW COEFFICIENTl
? <(CR)
:LOOK ALL
(查看修改后的模型)MIN min 0.23x1+0.46x2
SUBJCT TO
2)0.77X1+0.56X2>66
3)0.12X1+0.45X2<203
4)1X1+10X2>300
END
:GO
求解修改后的LP模型(和前述类同,故略)。:QUIT
表示键入退出命令(即退出LINDO工作环境)。这里需特别补充说明的是输入、查看和修改整个
LP模型更方便的方法是利用LINDO软件本身具有的全屏幕编辑器“EDIT”功能,即:EDIT CR(读者不妨一试)。如果想调入数据文件进行运算,可在“:”提示符下健入“
RETR”,然后移动光标选定所需数据文件即可。如果想将计算结果直接输出到某个文件中,可在
GO命令前先使用DIVERT命令,LINDO会提示你输入该文件的文件名,此后键入GO命令,屏幕上会显示最优的目标函数值,其他结果都将存入输出文件。GO命令执行后,LINDO会问你是否需要做灵敏性分析(DO RANGE (SENSITIVITY) ANLY-SIS?),如果你不需要,你应回答“N”(NO),回到提示符“:”下。为便于读者理解以上运行结果,这里不妨将有关缩减成本(
Reduced cost)和约束条件的影子价格、目标函数系数可变范围及方程右边约束值可变范围等灵後度分析的内容简介如下:
(Reduced cost)的含意:
- 缩减成本
下面我们将介绍线性规划问题中每个约束条件有相应的影子价格,其实每个决策也有相应的影子价格,称为缩减成本
RGj。“
REOUCED COST”给出最优单纯形表中第0行中变量的系数(min型问题),在最优解存在的条件下,RCj就是终单纯表中目标函数行的第j列元素,其中变量的Reduced cost值应为0,对于非基变量,相应的Reduced cost值表示当该非基变量增加一个单位时(其他非基变量保持不变)目标函数增加的量。RCj说明在饲料数量条件不变的情况下,第j种饲料的数量在最优解基础上增加一个单位时,目标成本的增加量,即说明在最优解的基础上,进行调整对目标函数影响的大小。(
2)约束条件的影子价格,即在现行基本解保持最佳时,当某约束条件的右端项每增(或减)1个单位时,所引起目标函数增收或减)的改变量。举例来说,如果约束方程(
1)中右端约束值减少:66-64=2,由于其影子价格为-.254144,所以目标函数值为:26.303870-2×.254144=25.7956。
(
3)目标函数系数可变范围,即指在不改变最优解的情况下,目标函数中每个系数值Ci能够变化的范围。人而反映了配方对原料市场价格波动的应变能力。只要单价在所求值域范围内就没有必要重新筛选配方。举例来说:当决策变量(原料)
X2的单价(元/千克)在区间.1651≤C2≤2.3内取值时最优解Xi值同前解(当然此时目标函数会发生变化),这里0.1651由.460000-.294872所得,2.3由.460000+1.840000所得。(
4)方程右边约束值可变范围,即指最优基不变(当然最优解及目标函数值可能会变化)并保持所有其他条件不变的情况下,某个约束方程的右端约束值可变化的范围。这一点对饲料生产者掌握所需原料种类有指导意义。而且只有约束值在所求范围内调整,目标函数值与约束值的既定函数关系(影子价格)才成立。
BASIC程序清单:
- “现有日粮配方营养检测”的
CLS:PRINT TAB(22):PRINT“欢迎使用该营养检测简化程序”:PRINT
20 PRINT TAB(22):INPUT
“请输入数据文件名”;X $ :OPEN X $ FOR INPUT VasV #2:INPUT#2,M,N:N=N+1:PRINT#2,X(I,J):Z(J,I)=X(I,J):NEXT J,I
“饲料总重=”;INT(Z*100+.5)/100:PRINT:NEXTI:PRINT TAB(28)
:L(I)=L(I)+Z(I,J)*B(J):NEXT J
- PRINT TAB(22):PRINT“第(“;I;”)个检测指标值=”;INT(L(I)*100+5)/100:NEXT I:
PRINT TAB(2):PRINT“编制者;徐夕水等(单位:广东省海市佛山科技学院农牧分院)
电话(0757)6324406”
本示例“营养检测”BASIC程序调用的数据文件形式:
- 4
0.78,0.12,1,0.23
0.56,0.45,10,0,46
67.9558,23,20442
(本示例的“现有日粮配方营养检测
结果分别为;能量=66 蛋白质=18.6 核黄素=300 单价=26.3)。
- 结语
综上所述INDO软件操作简便,输入、修改及保存“最低饲料成本”的原始线性规划数学模型也很方便。不存在系统维护问题即只要一个LINDO软件虽存在有当求解出决策变量值后未考虑显示线性规划方程组右边实际达到即饲料配方中的营养指标值等缺陷,但这一问题可有上列给出的“现有日粮配方营养检测”的BASIC程序来解决,尽管上述过程可能不免有点麻烦。不足甚至错误之处,敬请有关专家指正。