数学建模
假设问题的信息包括各节点,各边,各边上的权值和节点v1到其它各节点的最短路径值被依次存储在文本文件file1.ldt(后缀ldt为Lingo数据文件的扩展名)中,其内容如下:
v1,v2,v3,v4,v5,v6,v7,v8~ v1,v2 v1,v3 v1,v4
v2,v4 v2,v5 v3,v4 v3,v7 v4,v5 v4,v6 v4,v7 v5,v6 v5,v8 v6,v7 v6,v8 v7,v8~
2 1 8 6 1 7 9 5 1 2 3 9 4 6 3~
0,,,,,,,
在Lingo模型窗口编写Lingo模型如下:
model: sets:
cities/@file(file1.ldt)/:L;!从file1.ldt中导入集cities的成员,即各节点的信息;
roads(cities,cities)/@file(file1.ldt)/:d;! 从file1.ldt中导入集roads的成员,即各边的信息; endsets data:
d=@file(file1.ldt); !从file1.ldt中从导入各边的权值赋值给变量d;
L=@file(file1.ldt); !从file1.ldt中导入各最短路径值赋值给变量L; @text('C:\\file2.txt')=L !将L的计算结果导出至文件C:\\file2.txt中; enddata
@for(cities(i)|i#GT#@index(v1):L(i)=@min(roads(j,i):L(j)+d(j,i));); end
在上述Lingo模型的集段和数据段中两次用到@file函数(每次从文件中读取一个记录,记录之间用“~”分开),当输入变量和数据改变时,只需在file1.ldt中作些修改即可,无须对程序作改动,实现了程序与数据分离的目的.
B4.2 Lingo软件与Excel电子表格文件的接口技术
Lingo软件也可与电子表格文件实现数据传输,所用的接口函数为@ole函数.与@file函数一样,该函数只能在Lingo模型的集段、数据段和初始段使用,其使用格式可分为一下几种类型:
(1)变量名1,变量名2=@ole(?文件名?,?数据块名称1?,?数据块名称2?)
从指定的Excel文件读取数据,文件名可以包括扩展名,也可以包含文件路径,如果都没有则默认为当前路径.
(2)变量名1,变量名2=@ole(?文件名?,?数据块名称?);
左边的两个变量必须定义在同一个集中,Excel中的数据块应当包含类型相同的两列数据,第一列赋值给变量1,第二列赋值给变量2.
(3)变量名1,变量名2=@ole(?文件名?);
当Excel文件的数据块名称与变量名同名时,可使用上述格式.
计算结果导出到Excel中时,也应用@ole函数,其用法类似,只需将三种类型的左右两边互换即可.
例B13以例B4的最短路径问题为例,介绍@ole函数的用法.
首先在D盘建立一个Excel文件:myfile.xls,见附图2.4.建立数据文件时,需先对此文
258
数学建模
件中的数据进行命名,具体做法为:用鼠标选中这个表格的A1:A8单元,然后选择Excel的菜单命令“插入|名称|定义“,在弹出的对话框中输入名称cities,同理将B1:C15单元命名为roads(其中B1:B15输入起点,C1:C15输入终点),将D1:D15单元命名为dis.
附图2.4 Excel文件存放数据图
再在D盘建立一个Excel文件:file.xls,并按照上面步骤将第1列命名为ld,用于存放Lingo模型的求解结果,最后建立Lingo模型如下:
model: sets:
cities/@ole('D:\\myfile.xls','cities')/:L;
roads(cities,cities)/@ole('D:\\myfile.xls','roads')/:d; endsets data:
d=@ole('D:\\myfile.xls','dis');
L=0,,,,,,,;
@ole('D:\\file.xls','ld')=L; enddata
@for(cities(i)|i#GT#@index(v1):L(i)=@min(roads(j,i):L(j)+d(j,i));); end
运行得问题的最短路径,并将相应的L值输出到文件“D:\\file.xls“中.
B5灵敏度分析
对一个实际问题建立线性规划模型时,所搜集的数据一般存在误差,此外,由于市场的影响,这些数据经常会发生改变.因此需要一种方法研究与分析模型的输出变化对模型参数或周围条件变化的敏感程度,这种方法称为灵敏度分析.灵敏度分析不仅可用于分析原始数据不准确或发生变化时最优解的稳定性,还可以决定哪些参数对模型有较大的影响.
B5.1 灵敏度分析的Lingo实现
应用Lingo软件求解线性规划时可直接对模型进行灵敏度分析,相应的指令可参考例B14.
例B14 求解下面线性规划,并进行灵敏度分析。
259
数学建模
max z?60x1?30x2?20x3 s.t. 8x1?6x2?x3?486 4x1?2x2?1.5x3?20 2x1?1.5x2?0.5x3?8 x2?5 xi?0,i?1,2,3解:在Lingo指令窗中输入下面指令:
model: sets:
row/1..4/:b; col/1..3/:c,x; matrix(row,col):A; endsets
max=@sum(col:c*x); @for(row(i):@sum(col(j):A(i,j)*x(j))<=b(i)); data:
c=60,30,20;b=48,20,8,5; A=8,6,1 4,2,1.5 2,1.5,0.5 0,2,0; enddata
end
运行后得主要结果如下:
Global optimal solution found at iteration: 3 Objective value: 280.0000 Variable Value Reduced Cost X( 1) 2.000000 0.000000 X( 2) 0.000000 5.000000 X( 3) 8.000000 0.000000 Row Slack or Surplus Dual Price 1 280.0000 1.000000 2 24.00000 0.000000 3 0.000000 10.00000 4 0.000000 10.00000
5 5.000000 0.000000
由第1~6行可知:Lingo模型求得了问题的全局最优解,为x?(2,0,8),相应最优值为280.
在第3行中,“Reduced Cost”列对应的值,表示当非基变量增加一个单位时,目标函数值减少的量(max型问题).本例中,变量x2对应的Reduced Cost为5,表示当x2的值从0变为1时(假定其它非基变量保持不变),最优的目标函数值从280变为275. 在第7行中,“Row”表示线性规划的行,本例中共有5行,其中第1行是目标函数行,第2
T 260
数学建模
行对应第1个约束条件,依次类推.
“Slack or Surplus”给出各种资源在最优解下的剩余量.如第1个约束条件中的资源量还剩余24,即仅仅使用了462.
“Dual Price”表示对偶价格(在经济学中也称为影子价格),表示当对应约束有微小变动时,目标函数的变化率.若其数值为p,则表示对应约束中不等式右端项若增加1个单位,目标函数将增加p个单位(max型问题).显然,若在最优解处约束正好取等号(称为紧约束),其对偶价格才可能不是0.本例中,第Row 3和Row 4是紧约束,对应的Dual Price为10,即当不等式右端项增加1时,目标函数将增加10.
按Ctrl+r键,可得附图2.5的灵敏度分析报告,此报告可用来研究当前目标函数的系数和约束右端项在什么范围变化(假定其它系数保持不变)时,最优基保持不变.
附图2.5 灵敏度报告
报告包括两方面的灵敏性分析内容:
(1)目标函数中系数变化的范围(Objective Coefficient Range)
本例中,x1变量当前的系数(Current Coefficient)=60,允许增加(Allowable Increase)=20,允许减少(Allowable Decrease)=4,即当此系数在[56,80]范围内变化时,最优基保持不变.其它变量可类似解释.由于此时约束没有变化,只是目标函数中某个系数发生变化,所以最优解不变,而最优值一般会变.
(2)约束右端项变化的范围(Righthand Side Ranges) 本例中,第2行约束中当前右端项(Current RHS)=48,允许增加(Allowable Increase)=INFINITY(无穷),允许减少(Allowable Derease)=24,说明当它在[48-24,48+?]=[24, ?]范围变化时,最优基保持不变,其它行可类似解释.此时由于约束发生变化,虽然最优基保持不变,但最优解和最优值一般会发生变化.
B5.2 灵敏度分析实例
例B15 农作物种植问题
某农场有625亩的土地可以用来种植农作物.可以种植的农作物有玉米、小麦和高粱.预计有1000亩-尺的灌溉用水可用,农场农民每周可以投入的时间为300小时.这三种农作物每亩的收益分别为400元,200元和250元.每亩农作物所需的资源见附表2.7.试确定各种农作物的种植量,使得农场的获益最大.进一步讨论以下3个问题:
(1)若用50元可以买到1亩-尺的灌溉用水,应否做此项投资?若投资最多每周购买多少亩-尺的灌溉用水?
(2)若可以购买土地增加种植面积,购买1亩土地的费用最多是多少元?
261
数学建模
(3)由于市场需求变化,每亩高粱的获利增加到300元,应否改变生产计划?
附表2.7 农场每亩农作物所需的资源数据
所需资源(每亩) 玉米 小麦 高粱
灌溉用水(亩-尺) 3.0 1.0 1.5 劳动时间(小时/周) 0.8 0.2 0.3
1.问题的分析
这是一个简单的线性规划问题,后面三个问题需要根据其灵敏度分析报告加以解决. 2.模型的建立
设xi(i?1,2,3)表示种植第i种农作物的亩数,记V,M,T分别表示土地,灌溉用水和劳动时间的最大供给量,ai,bi,ci(i?1,2,3)分别表示种植第i种农作物所需的灌溉用水量和劳动时间以及每亩的收益,则容易建立线性规划模型如下
min f??cixii?13s.t. ?xi?V i?133 ?axii?13i?1i?M
?bixi?T xi?0 i?1,2,33.模型的求解
建立Lingo模型如下:
model: sets:
var/1..3/:x,a,b,c; col/1/:V,M,T; endsets data:
a=3.0,1.0,1.5;b=0.8,0.2,0.3;c=400,200,250;V=625;M=1000;T=300; enddata
max=@sum(var(i):c(i)*x(i)); @sum(var(i):x(i))<=V(1); @sum(var(i):a(i)*x(i))<=M(1); @sum(var(i):b(i)*x(i))<=T(1); end
运行得最优方案为:种植玉米41.6667亩,种植小麦0亩,种植高粱583.3333亩,最大收益为162500元.
对Lingo模型进行灵敏度分析可得下面报告:
(1)土地和灌溉用水这两种资源全部用完,而劳动时间这种资源还剩余91.6667; (2)土地、灌溉用水和劳动时间的影子价格分别为100元、100元和0元,即增加1
262