简学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');
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的使用。

 

 

 

 

 

 

你可能感兴趣的:(数学建模,LINGO)