Daibingh Less is more, slow is fast.

lingo 基础

2019-09-10
hdb

基本示例

  • lingo 中没有严格的大于和小于关系, “<”, “>” 的含义其实是包含等号的
  • 在默认情况下, LINGO 规定变量是非负的,也就是说下界为 0,上界为 +∞。 @free 取消了默认的下界为 0 的限制,使变量也可以取负值。 @bnd 用于设定一个变量的上下界,它也可以取消默认下界为 0 的约束
model: 
! 钢管下料问题:规定至多三种模式,不用提前设计模式,完全用符号代替;
sets:
mode/1..3/:x;
pro/1..4/:b,p;
links(pro,mode):r;	! r(i,j)表示第j种模式下能截到的第i种产品的根数;
endsets

data:
b=50 10 20 15;
p=4 5 6 8;
enddata

min=@sum(mode:x);

@for(pro(i):@sum(mode(j):r(i,j)*x(j))>b(i));	! 大于需求;
@for(mode(j):@sum(pro(i):r(i,j)*p(i))>16);	! 切割合理,即不超过原料的长度;	
@for(mode(j):@sum(pro(i):r(i,j)*p(i))<19);	! 也不余料过多;
@for(links:@gin(r));
@for(mode:@gin(x));
@for(mode(i)|i#ne#3:x(i)>=x(i+1));		! 人为添加的约束;

end

核心概念:集

集实际上是创建一个指定大小的变量的结构体。在集的基础上可以实例化变量

集分为原始集和派生集

  • 创建原始集并实例化变量
      ! 创建一个长度为 3 的集,并实例化两个变量
      set1/1..3/:x,y;  ! 成员隐式罗列
      set2/a b c/:x,y;  ! 成员显式罗列
    
  • 创建派生集
    • 派生集包含稠密集和稀疏集
    • 稠密集是从多个原始集派生得到(笛卡尔积)
    • 稀疏集可以显示列举或稠密集过滤得到
        set1/1..3/:x,y;  ! 创建 rank=1, len=3 集
        subset1(set1):z;  ! 从 set1 派生一个相同形状的集(稠密集)
        subset2(set1,set1):w;  ! 从 set1 派生一个 set1xset1 rank=2 的集(稠密集)
      

      原始集类似于一维数组;由多个原始集派生的集类似于多维数组,多维变量在赋值时以向量方式赋值,顺序是 右侧 index 变化的快的原则

集的创建、派生和赋值示例:

model:

sets:
set1/1..3/:x1,x2;
set2/a b/:y1,y2;

dset1(set1):z1;
dset2(set1,set2):z2;  ! dense derived set;
dset3(set1,set2)/1 a, 1 b, 2 a, 2 b/:z3;  ! sparse derived set by enumeration;
dset4(set1,set2)|x1(&1) #gt# 1 #and# y2(&2) #lt# 5:z4;  ! sparse derived set by filter;
endsets

data:
alpha=0.5;  ! fixed parameter;
beta=?;  ! real-time parameter;

x1=1 2 3;  ! single assignment;
x2=1 2 3;
y1,y2=4 4 5 5;  ! multiple assignment;
z1=1 1 1;
z2=1 2 3 4 5 6;
z3=1 ,, 3 4;  ! undeterminated value use ,,;
enddata

end
                                                    Variable           Value
                                                       ALPHA       0.5000000
                                                        BETA        12.00000
                                                      X1( 1)        1.000000
                                                      X1( 2)        2.000000
                                                      X1( 3)        3.000000
                                                      X2( 1)        1.000000
                                                      X2( 2)        2.000000
                                                      X2( 3)        3.000000
                                                      Y1( A)        4.000000
                                                      Y1( B)        5.000000
                                                      Y2( A)        4.000000
                                                      Y2( B)        5.000000
                                                      Z1( 1)        1.000000
                                                      Z1( 2)        1.000000
                                                      Z1( 3)        1.000000
                                                   Z2( 1, A)        1.000000
                                                   Z2( 1, B)        2.000000
                                                   Z2( 2, A)        3.000000
                                                   Z2( 2, B)        4.000000
                                                   Z2( 3, A)        5.000000
                                                   Z2( 3, B)        6.000000
                                                   Z3( 1, A)        1.000000
                                                   Z3( 1, B)        0.000000
                                                   Z3( 2, A)        3.000000
                                                   Z3( 2, B)        4.000000
                                                   Z4( 2, A)        0.000000
                                                   Z4( 3, A)        0.000000

常用函数

数学运算

@abs(x) 返回 x 的绝对值
@sin(x) 返回 x 的正弦值, x 采用弧度制
@cos(x) 返回 x 的余弦值
@tan(x) 返回 x 的正切值
@exp(x) 返回常数 e 的 x 次方
@log(x) 返回 x 的自然对数
@lgm(x) 返回 x 的 gamma 函数的自然对数
@sign(x) 如果 x<0 返回-1;否则,返回 1
@floor(x) 返回 x 的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回不低于 x 的最大整数。
@smax(x1,x2,…,xn) 返回 x1, x2, …, xn 中的最大值
@smin(x1,x2,…,xn) 返回 x1, x2, …, xn 中的最小值

逻辑运算

#not# 否定该操作数的逻辑值,#not#是一个一元运算符
#eq# 若两个运算数相等,则为 true;否则为 flase
#ne# 若两个运算符不相等,则为 true;否则为 flase
#gt# 若左边的运算符严格大于右边的运算符,则为 true;否则为 flase
#ge# 若左边的运算符大于或等于右边的运算符,则为 true;否则为 flase
#lt# 若左边的运算符严格小于右边的运算符,则为 true;否则为 flase
#le# 若左边的运算符小于或等于右边的运算符,则为 true;否则为 flase
#and# 仅当两个参数都为 true 时,结果为 true;否则为 flase
#or# 仅当两个参数都为 false 时,结果为 false;否则为 true

变量界定函数

变量界定函数实现对变量取值范围的附加限制,共 4 种:

@bin(x) 限制 x 为 0 或 1
@bnd(L,x,U) 限制 L≤x≤U
@free(x) 取消对变量 x 的默认下界为 0 的限制,即 x 可以取任意实数
@gin(x) 限制 x 为整数

集循环函数

@for()
@sum()
@min()
@max()

示例:

model:

sets:
set1/1..3/:x1,x2;
set2/a b/:y1,y2;

dset1(set1):z1;
dset2(set1,set2):z2;  ! dense derived set;
dset3(set1,set2)/1 a, 1 b, 2 a, 2 b/:z3;  ! sparse derived set by enumeration;
dset4(set1,set2)|x1(&1) #gt# 1 #and# y2(&2) #lt# 5:z4;  ! sparse derived set by filter;
endsets

data:
alpha=0.5;  ! fixed parameter;
!beta=?;  ! real-time parameter;

x1=1 2 3;  ! single assignment;
x2=1 2 3;
y1,y2=4 4 5 5;  ! multiple assignment;
z1=1 1 1;
z2=1 2 3 4 5 6;
z3=1 ,, 3 4;  ! undeterminated value use ,,;
enddata

s1=@sum(dset1:z1);
s2=@sum(dset2:z2);
s3=@sum(dset2(i,j)|x1(i)#gt#1 #and# y2(j)#lt#5: z2(i,j));
s4=@sum(dset3:z3);

end
                                                    Variable           Value
                                                       ALPHA       0.5000000
                                                          S1        3.000000
                                                          S2        21.00000
                                                          S3        8.000000
                                                          S4        8.000000
                                                      X1( 1)        1.000000
                                                      X1( 2)        2.000000
                                                      X1( 3)        3.000000
                                                      X2( 1)        1.000000
                                                      X2( 2)        2.000000
                                                      X2( 3)        3.000000
                                                      Y1( A)        4.000000
                                                      Y1( B)        5.000000
                                                      Y2( A)        4.000000
                                                      Y2( B)        5.000000
                                                      Z1( 1)        1.000000
                                                      Z1( 2)        1.000000
                                                      Z1( 3)        1.000000
                                                   Z2( 1, A)        1.000000
                                                   Z2( 1, B)        2.000000
                                                   Z2( 2, A)        3.000000
                                                   Z2( 2, B)        4.000000
                                                   Z2( 3, A)        5.000000
                                                   Z2( 3, B)        6.000000
                                                   Z3( 1, A)        1.000000
                                                   Z3( 1, B)        0.000000
                                                   Z3( 2, A)        3.000000
                                                   Z3( 2, B)        4.000000
                                                   Z4( 2, A)        0.000000
                                                   Z4( 3, A)        0.000000

数据 IO

从文本读取数据

model:

sets:
set1/1..5/:a,b;
endsets

data:
a=@file('data.txt');
b=@file('data.txt');
enddata

end

data.txt

! a;
1, 3, 5, 7, 9 ~
! b;
0 2 4 6 8

保存数据到文本

model:

sets:
set1/1..5/:a,b;
endsets

data:
a=@file('data.txt');
b=@file('data.txt');
@text('out.txt')=set1 a b;
@text('out2.txt')=a 'hhhh' b;
enddata

end

out.txt

 1        1.000000        0.000000
 2        3.000000        2.000000
 3        5.000000        4.000000
 4        7.000000        6.000000
 5        9.000000        8.000000

out2.txt

        1.000000 hhhh        0.000000
        3.000000 hhhh        2.000000
        5.000000 hhhh        4.000000
        7.000000 hhhh        6.000000
        9.000000 hhhh        8.000000

上一篇 pytorch How tos

Comments

Content