简学lingo(二)——基础篇

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

 

2.1 输入和输出函数

输入函数和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。

(1)@file函数

该函数用从外部文件输入数据,可以放在模型中的任何部分。该函数的语法格式是:

[plain]  view plain  copy
  1. <span style="font-size:18px;">@file('filename')</span>  

这里filename是文件名,可以采用相对路径和绝对路径来表示。下面给出一个例子

[plain]  view plain  copy
  1. model:  
  2.  !6发点8收点运输问题  
  3. sets:  
  4.   warehouses/@file('1_2.txt'):capacity;  
  5.   vendors/@file('1_2.txt')/:demand;  
  6.   links(warehouses,vendors):cost,volume;  
  7. endsets  
  8. !目标函数  
  9.   min=@sum(links:cost*volume);  
  10. !需求约束;  
  11.   @for(vendors(J):  
  12.         @sum(warehouses(I):volume(I,J))=demand(J));  !这里其实是一个约束条件,即找出所有sum(volume(I,J)=demand(J)的volume矩阵  
  13.   @for(warehouses(I):  
  14.          @sum(vendors(J):volume(I,J)<=capacity));    !这里同理找出满足条件的volume矩阵  
  15.   
  16. !这里是数据;  
  17. data:  
  18.   capacity=file('1_2.txt');  
  19.   demand=@file('1_2.txt');  
  20.   cost=@file('1_2.txt');  
  21. enddata  
  22. end  
  23.     


 这里给出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函数

该函数被用在数据部分用来把解输出到文本文件中。它可以输出集成员和集属性值。其语法为

[plain]  view plain  copy
  1. @text(['filename'])  

我们把接口函数产生输出的数据声明称为输出操作。输出操作仅在求解器求解完模型后才执行,执行次序取决于骑在模型中出现的先后次序。

这里借用之间的代码说明@text的用法

[plain]  view plain  copy
  1. model:  
  2.  !6发点8收点运输问题  
  3. sets:  
  4.   warehouses/@file('1_2.txt'):capacity;  
  5.   vendors/@file('1_2.txt')/:demand;  
  6.   links(warehouses,vendors):cost,volume;  
  7. endsets  
  8. !目标函数  
  9.   min=@sum(links:cost*volume);  
  10. !需求约束;  
  11.   @for(vendors(J):  
  12.         @sum(warehouses(I):volume(I,J))=demand(J));  !这里其实是一个约束条件,即找出所有sum(volume(I,J)=demand(J)的volume矩阵  
  13.   @for(warehouses(I):  
  14.          @sum(vendors(J):volume(I,J)<=capacity));    !这里同理找出满足条件的volume矩阵  
  15.   
  16. !这里是数据;  
  17. data:  
  18.   capacity=file('1_2.txt');  
  19.   demand=@file('1_2.txt');  
  20.   cost=@file('1_2.txt');  
  21.   @text(;d:\out.xt')=volume'最少需要的运输费用' start;  
  22. enddata  
  23. end  

 

3.辅助函数

语法规则为

[plain]  view plain  copy
  1. @if(logical_condition,true_result,false_result)</span>  


@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                                             //请原谅我吧,值能这样写了

这里给出代码


 

[plain]  view plain  copy
  1. model:  
  2.   min=fx+fy;  
  3.   fx=@if(x#gt#0,100,0)+2*x;  
  4.   fy=@if(y#gt#0,60,0)+3*y;  
  5.   x+y>=30;  
  6. end  


4.结果的分析和说明

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

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

若要求桌子的产量不超过5件,问如何安排三种产品的生产可使利润最大?

这里给出求解的模型

[plain]  view plain  copy
  1. max60*desks+30*tables+20*chairs;  
  2. 8*desks+6*tables+chairs<=48;  
  3. 4*desks+2*tables+1.5*chairs<=20;  
  4. 2*desks+2*tables+1.5*chairs<=8;  
  5. tables<=5;  


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

 

[plain]  view plain  copy
  1. Global optimal solution found.  
  2. Objective value:                              280.0000  
  3. Total solver iterations:                             3  
  4.   
  5.   
  6.                     Variable           Value        Reduced Cost  
  7.                        DESKS        2.000000            0.000000  
  8.                       TABLES        0.000000            5.000000  
  9.                       CHAIRS        8.000000            0.000000  
  10.   
  11.                          Row    Slack or Surplus      Dual Price  
  12.                            1        280.0000            1.000000  
  13.                            2        24.00000            0.000000  
  14.                            3        0.000000            10.00000  
  15.                            4        0.000000            10.00000  
  16.                            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的使用。

转:https://blog.csdn.net/yzu_120702117/article/details/38444485

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/80329198