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).例题
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) 返回工厂可生产的矩阵长度