lingo基础


1.变量定界函数

  • @bin(x):x为0或1
  • @gin(x):x为整数
  • @free(x):x为实数
  • @bnd(l,x,u):x为[l,u]之间的实数

lingo默认范围为非负实数,不区分大小写,一般使用小写。

以!开头,;结尾的语句是注释语句

举例

要求x为-5到5之间的整数

@free(x);
@bnd(-5,x,5);
@gin(x);

2.lingo快速入门

1).求解线性规划

一个线性规划中只含有一个目标函数,两个以上是多目标线性规划,lingo无法直接求解。

求目标函数的最大值或最小值分别用max = 和min = 来表示

求解如下问题


min 2x1+3x2
s.t.
x1+x2>=350
x1>=100
2*x1+x2<=600
x1,x2>=0


min = 2*x1+3*x2;
x1+x2>=350;
x1>=100;
2*x1+x2<=600;
x1>=0;
x2>=0;

输出结果

x1=250,x2=100

2).解方程

x1+x2=3;
x1-x2=4;
@free(x1);
@free(x2);

输出结果

x1=3.5,x2=-0.5

注意lingo默认变量为非负实数,所以要用@free函数,不然不能正确求解

3.lingo的集

1).sets

通过sets: endsets来创建集,即矩阵

sets:
T1 /1..5/: a;
endsets

意义:工厂T1生产1 * 6的矩阵,a是一个1 * 6的矩阵。

sets:
T1 /1..5/: a,x;
T2 /1..4/: b;
T3(T1,T2):c;
endsets

意义:工厂T3生产5 * 4的矩阵,c是一个5 * 4的矩阵。

2).data

通过data: enddata来赋初值

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

data:
a=1,2,3,4,5;
enddata

其中矩阵a为赋值后的数据,矩阵b为默认值。

4.常用函数

1).for

@for(factory(i): 语句);

factory表示循环的次数

factory的属性从1到5,则循环5次,i的值从1到5。

例s=ai*xi 其中i=1,2,3,4,5

可表示为

@for(T1(i):s=a(i)*x(i));

其中T1为生产矩阵a和x的factory

2).sum

求矩阵x(i)的和:@sum(T1(i):x(i))

其中T1为生产矩阵x的factory

3).if

y=@if(x#ge#0,x+10,x-10)

上式表示当x大于等于0时,y=x+10

当x小于0时,y=x-10

lingo中的if必须带else

if一般不用

3).例题

例题1

sets:
T1 /1..6/: a;
T2 /1..8/: d;
T3(T1,T2): c,x;
endsets

data:
a = 60,55,51,43,41,52;
d = 35,37,22,32,41,32,43,38;
c = 6,2,6,7,4,2,5,8
    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;
enddata

min = @sum(T3(i,j):c(i,j)*x(i,j));
@for(T1(i):@sum(T2(j):x(i,j))<=a(i));
@for(T2(j):@sum(T1(i):x(i,j))=d(j));

输出结果 664

注意min=函数那一行不能用for循环,因为for循环相当于多条语句,而不是累加。

5.运算符

1).算数运算符

加: +

减: -

乘: *

除: /

幂: ^

根号: @sqrt

2).关系运算符

只有三种: =,>=,<=

若想表示>或<则可用下列方法

e=0.00001;
a-e<=2;

用在约束条件中,指定约束条件左右两边必须满足的关系。

3).逻辑运算符

a.两个数字之间:

  • #eq#:两个运算对象相等为真
  • #ne#:两个运算对象不想等为真
  • #gt#:左边大于右边为真
  • #ge#:左边大于等于右边为真
  • #lt#:左边小于右边为真
  • #le#:左边小于等于右边为真

b.两个逻辑表达式之间

  • #not#:单目运算符,表示取反
  • #and#:左右两边均正确为真
  • #or#:左右两边均错误为假

c.逻辑运算符出现的位置:

  • for和sum函数里面
model:

sets:
T1 /1..5/: a;
endsets

data:
a=1,2,3,4,5;
enddata

y=@sum(T1(i)|i#gt#1 #and# i#lt#5:a(i));

end
  • if判断中
y=@if(x#le#500,4*x,@if(x#gt#1000,1500+2*x,500+3*x))

6.数学函数

1).三角函数

  • @sin(x) 正弦
  • @cos(x) 余弦
  • @tan(x) 正切

2).指数函数

@log(x) 自然对数

@exp(x) e的x次幂

3).其他

  • @abs(x) 绝对值
  • @sigh(x) 符号值,x>=0为1,x<0为-1
  • @floor(x) 整数部分,向0方向取整

4).比较大小

  • @smax(x1,x2,…xn) 返回最大值
  • @smin(x1,x2,…xn)返回最小值

7.集合操作函数

  • @for(factory:a>0) 循环
  • @sum(factory: a) 求和
  • @prod(factory : a) 求积
  • @max(factory: a) 求最大值
  • @min(factory: a) 求最小值
  • @in(factory,c) 判断常数c是否在集合中
  • @size(factory) 返回工厂可生产的矩阵长度

文章作者: 易安
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 易安 !
评论
  目录