学了几天,感觉还是对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');
enddata
end
这里给出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;
enddata
end
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.0000
Total solver iterations: 3
Variable Value Reduced Cost
DESKS 2.000000 0.000000
TABLES 0.000000 5.000000
CHAIRS 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
“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的使用。