数学建模|简学lingo(二)——基础篇

学了几天,感觉还是对lingo一直半解,感觉好郁闷啊。。。没办法,接着搞呗。算算日子,都来学校快十天,自己到底学了点什么呢。还记得自己来的时候对自己定下的目标,你的三级要怎么办呢?坚持一下啊

2.1 输入和输出函数
输入函数和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。
(1)@file函数
该函数用从外部文件输入数据,可以放在模型中的任何部分。该函数的语法格式是:

@file('filename')

这里filename是文件名,可以采用相对路径和绝对路径来表示。下面给出一个例子
model: !6发点8收点运输问题sets:warehouses/@file('1_2.txt'):capacity; vendors/@file('1_2.txt')/:demand; links(warehouses,vendors):cost,volume; endsets!目标函数min=@sum(links:cost*volume); !需求约束;@for(vendors(J):@sum(warehouses(I):volume(I,J))=demand(J)); !这里其实是一个约束条件,即找出所有sum(volume(I,J)=demand(J)的volume矩阵@for(warehouses(I):@sum(vendors(J):volume(I,J)<=capacity)); !这里同理找出满足条件的volume矩阵!这里是数据;data:capacity=file('1_2.txt'); demand=@file('1_2.txt'); cost=@file('1_2.txt'); enddataend


这里给出1_2.txt的数据,其中~为数据的结束标记。如果没有结束标记,则吧整个文件看做一个整体
!warehouses成员;
WH1 WH2 WH3 WH4 WH5 WH6 WH7 WH8~

!vendors成员;
V1 V2 V3 V4 V5 V6 V7 V8~

!产量;
60 55 51 43 41 52~

!销量;
35 37 22 32 41 32 43 38~

!单位运输费用矩阵
6 2 6 7 4 2 5 9
4 9 5 3 8 5 8 2
5 2 1 9 7 4 3 3
7 6 7 3 9 2 7 1
2 3 9 5 7 2 6 5
5 5 2 2 8 1 4 3

2. @text函数
该函数被用在数据部分用来把解输出到文本文件中。它可以输出集成员和集属性值。其语法为
@text(['filename'])

我们把接口函数产生输出的数据声明称为输出操作。输出操作仅在求解器求解完模型后才执行,执行次序取决于骑在模型中出现的先后次序。
这里借用之间的代码说明@text的用法
model: !6发点8收点运输问题sets:warehouses/@file('1_2.txt'):capacity; vendors/@file('1_2.txt')/:demand; links(warehouses,vendors):cost,volume; endsets!目标函数min=@sum(links:cost*volume); !需求约束;@for(vendors(J):@sum(warehouses(I):volume(I,J))=demand(J)); !这里其实是一个约束条件,即找出所有sum(volume(I,J)=demand(J)的volume矩阵@for(warehouses(I):@sum(vendors(J):volume(I,J)<=capacity)); !这里同理找出满足条件的volume矩阵!这里是数据;data:capacity=file('1_2.txt'); demand=@file('1_2.txt'); cost=@file('1_2.txt'); @text(; d:\out.xt')=volume'最少需要的运输费用' start; enddataend


3.辅助函数
语法规则为
@if(logical_condition,true_result,false_result)


@if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_result,否则返回false_result。这里给出例子
求解最优化问题
min=f(x)+g(y)
s.t.
f(x)=100+2x,x>0
2x,x<=0
g(y)=60+3y,y>0
2y,y<=0
x+y>=30
x,y>=0//请原谅我吧,值能这样写了
这里给出代码


model:min=fx+fy; fx=@if(x#gt#0,100,0)+2*x; fy=@if(y#gt#0,60,0)+3*y; x+y>=30; end


4.结果的分析和说明
这里先给出一个例子及代码,然后对其产生的结果进行分析

每个书桌 每个餐桌 每个椅子 现有资源
木料 8单位 6单位 1单位 48单位
漆工 4单位 2单位 1.5单位 20单位
木工 2单位 1.5单位 0.5单位 8单位
成本单价 60单位 30单位 20单位

若要求桌子的产量不超过5件,问如何安排三种产品的生产可使利润最大?
这里给出求解的模型
max60*desks+30*tables+20*chairs; 8*desks+6*tables+chairs<=48; 4*desks+2*tables+1.5*chairs<=20; 2*desks+2*tables+1.5*chairs<=8; tables<=5;


这里我们打开灵敏性分析来查看报告窗口


Global optimal solution found.Objective value:280.0000Total solver iterations:3VariableValueReduced CostDESKS2.0000000.000000TABLES0.0000005.000000CHAIRS8.0000000.000000RowSlack or SurplusDual Price1280.00001.000000224.000000.00000030.00000010.0000040.00000010.0000055.0000000.000000

“Global optional solution found at iteration:3"表示3次迭代后得到全局最优解;
”Objecttive value:280.000“表示最优解目标值为280;
”value“给出最优解中个变量的值
”Slack or Surplus"给出松弛变量的值
“Reduced Cost"列出最优单纯形表中判别数所在行的变量的系数。其中基变量的reduced cost为0,对于非基变量,相应的reduced cost值表示当某个变量X增加一个单位时
,目标函数减少的量。比如在本例中:变量tables对应的尾5,当非基变量的值从0变为1时,最有的目标函数=280-5=275.
”DUAL PRICE“表示对应约束有微小性变化时,目标函数的变化率。从输出结果中对应于每一个约束有一个对偶价格。如第三行的约束条件加一变为21时,目标函数值会加10,为290.

lingo的基本学习就先到这里结束了,在下篇我会举几个综合的例子和经典的模型来加深对lingo的使用。





【数学建模|简学lingo(二)——基础篇】

    推荐阅读