用lingo解方程
1)每个方程都以;结束
2)lingo的加减乘除分别是+、-、*、/
2*x+2*y+1=5;
3*x-5*y+5=3;
lingo变量
1)lingo默认所有变量为大于等于0的数字,因而非负的条件不必多写。
2)如果变量小于0,用free函数,来使其定义域为R
3)lingo不区分大小写,所以mmm、MMm、MMM、为同一个变量
4)变量名称均由字母、数字、下划线组成
x^2+y^2+2*x=103;
2*x+y=12;
x>0;默认条件可以不用写
y>5;
线性规划基础
1)一个线性规划中只含一个目标函数(两个以上是多目标线性规划,lingo无法直接解)
2)求目标函数的最大值或最小值分别用max=或min=来表示
3)以!开头,以;表示结尾表注释,
4)线性规划与非线性规划的本质区别是目标函数是否线性,其余一致,故不需要区分
(非线性规划的求解十分困难,基本得不到全局最优解,所以先把非线性转化为线性)
max=200*x1+300*x2;目标函数
x1<=100;约束条件1
x2<=120;约束条件2
x1+2*x2<=160;约束条件3
Objective value: 29000.00
Variable Value
X1 100.0000
X2 30.00000
暴力枚举法
a1=1;a2=2;a3=3;a4=4;a5=5;
max=s;
s=a1*x1;
s=a2*x2;
s=a3*x3;
s=a4*x4;
s=a5*x5;
x1+x2+x3+x4+x5=5000;
矩阵工厂:生产一维矩阵
sets:
factory/1..6/:a,b;
plant/1..3/:x,y;
endsets
//a,b为一行六列的矩阵
//x,y为一行3列的矩阵
factory和plant都是制造矩阵的工厂,但他们是两家不同的工厂
factory工厂/1..6/说明它专门生产1x6的矩阵,factory后面的a,b都是1x6的矩阵
plant工厂/1..3/说明它专门生产1x3的矩阵,plant后面的x,y都是1x3的矩阵
矩阵工厂的名字factory都是随便起的,工厂所生产行矩阵的名字a,b也是随便起的
以上本质是定义了四个行矩阵的大小,矩阵工厂只是中介
生产完矩阵后,工厂和矩阵之间将脱离关系
lingo不是一行一行读代码的,所以用sets:和endsets表示矩阵工厂生产流程的起止
矩阵工厂不能只生产矩阵,还要给矩阵赋初值才行,例子如下:
sets:
factory/1..6/:a,b;
plant/1..3/:c,x;
endsets
data:
a=1,2,3,4,5,6;
b=6.0,5.0,4.0,3.0,2.0,1.0;
c=10,9,8;
enddata
以上程序对应的知识点:
1)、不是每个矩阵都要赋值,有些矩阵正是我们要求解的变量
2)、需要赋值的矩阵必须赋满,不能给6个元素的矩阵只赋3个数值
3)、lingo中可以给矩阵赋整数,也可以赋小数
4)、lingo不是一行一行读代码的,所以用data:和enddata表示矩阵赋值的起止
循环与求和
sets:
gc/1..5/:a,x;
endsets
data:
a=1,2,3,4,5;
enddata
max =s;
@for(gc(i):s=a(i)*x(i));
@sum(gc(i):x(i))=5000;
**@for(gc(i):s=a(i)*x(i));**
1)、for循环,括起整行语句,因为s=a(i)x(i) i=1,2,3,4,5相当于5个约束条件
2)、for循环内部,先写工厂,以告诉for循环几次,之后在街上约束条件
3)、此处的i可带可不带,也可换成j、k或m等等
4)、二维矩阵工厂出现后,同时会出现**i**和**j**,**i**和**j**必须同时带上
**@sum(gc(i):x(i))=5000;**
1)、sum求和,不可括起完整的约束条件,因为一般的求和结构是x1+x2+x3+x4=5000
2)、sum求和内部,先写工厂,以告诉sum求和几次,之后再接上约束条件
3)、此处的i可带可不带
4)、二维矩阵工厂出现后,同时会出现**i**和**j**,**i**和**j**必须同时带上
**for和sum出现的标志**
1)约束条件后面有i=1,2,3,4,...7,一定要在最外层套上for
2)约束条件前面有求和符号,一定在中间加上sum
程序如下:
model:
sets:
gc/1..5/:a,x;
endsets
data:
a=1,2,3,4,5;
enddata
max =s;
@for(gc(i):s=a(i)*x(i));
@sum(gc(i):x(i))=5000;
end
PS:使用了矩阵工厂创建矩阵后,整个程序需用model:和end包起来
工厂合并---生产二维矩阵
sets:
factory/1..6/:a;
plant/1..8/:d;
Cooperation(factory,plant):c,x;
endsets
1)、Cooperation大工厂是由factory和plant两家小工厂合并而办,可生产6x8的矩阵
2)、a是1x6的矩阵,d是1x8的矩阵,c和x都是6x8的矩阵
3)、如果将Cooperation(factory,plant)中的factory和plant调换位置,则生产8x6的矩阵
4)工厂合并的名字Cooperation是随便起的,矩阵的名字c和x也是随便起的
矩阵的赋值
data:
c=1,2,3,4,5,6,7,8
2,3,4,5,6,7,8,9
3,4,5,6,7,7,8,9
1,2,3,3,3,3,3,4
2,2,4,5,6,7,8,8
1,2,3,3,3,3,3,4;
enddata
运算符
x=2;
y=3*x^10+6/(15-x^(1/2));
关系运算符
1)、关系运算符往往用在约束条件中,用来指定约束条件左右两边必须满足的关系
2)、lingo只有三种关系运算符:=、>=、<=
没有单独的>和<,若出现,lingo视为省略了=
若想严格表达A大于B,可以用一下方式:
B=10;
c=0.0001;
A-e>B;
逻辑运算符
运算符:
#eq# equal 两个运算对象相等为真
#ne# not equal 两个运算对象不相等为真
#gt# greater than 左边大于右边为真
#ge# greater equal 左边大于等于右边为真
#lt# less than 左边小于右边为真
#le# less equal 左边小于等于右边为真
#not# 非 取反
#and# 与 左右两边均正确才为真
#or# 或 左右两边均错误才为假
model:
sets:
fac/1..6/:a;
endsets
data:
a=6,5,4,3,2,1;
enddata
@sum(fac(i)|i#ge#5:a(i));i大于等于5
end
**Lingo内置函数**
if判断
1)lingo默认所有变量不为负数,故应先进行定义域自由化
@free(x);
@free(y);x和y定义域自由化
x=-10;x为初值
y=@if(x#ge#0,x+10,x-10);x大于等于0,y=0,否则y=-20
用lingo表达分段函数
y=
4x,0<=x<=500
500+3x,500 1500+2x,x>1000 if函数的嵌套功能 变量定界函数 @bin(x) 限制x只能取0或1,0-1规划中特别有用 @gin(x) 限制x为整数,在整数规划中特别有用 @bnd(a,x,b) 限制a<=x<=b,推荐直接替换两个约束条件 @free(x) 取消对变量x非负的限制,使其定义域自由 【**@free**】求函数z=(x+2)^2+(y-2)^2的最小值 【**@bnd**】求函数y=2x在(1,3)的最大值 【**@bin**】a=[2,9,3,8,10,6,4,10]以及b=[1,3,4,3,3,1,5,10],求以下线性规划: max z=求和(8,i=1)a(i)x(i) 求和(8,i=1)b(i)x(i)<=15 x(i)=1或0,i=1,2,...n 【**@gin**】已知a=[2.1 1.0 1.8 1.2 2.0 1.2]以及b[6 125 12500 345 5],求整数规划 max z=求和(6,i=1)a(i)x(i) 求和(6,i=1)c(i,j)x(i)<=b(j),j=1,2...5 求和(6,i=1)x(i)=14 x2<=3,x4<=2 1<=x(i)<=4,i=1,3,5,6 c=[] 数学函数 @sin(x) 返回x值的正弦值 @cos(x) 返回x的余弦值 @tan(x) 返回x的正切值 @log(x) 返回x的自然对数值 @exp(x) 返回e的x次方 @abs(x) 返回x的自然对数值 @sigh(x) 返回x的符号值,x>=0为1,x<0为-1 @floor(x) 返回x的整数部分,向靠近0的方向取整 @smax(x1,x2,x3,......xn) 返回其中的最大值 @smin(x1,x2,x3,.......xn) 返回其中的最小值 集合操作函数 设factory 工厂生产6个元素的矩阵: @for(factory:a>0) 循环 @sum(factory:a) 求和 @prod(factory:a) 求积 @max(factory:a)求最大值 @min(factory:a)求最小值 @in(factory,c) 判断常数c是否在集合中 @size(factory) 返回工厂可生产矩阵的长度x=1500;
y=@if(x#le#500,4*x,@if(x#gt#1000,1500+2*x,500+3*x));
@free(x);
@free(y);
min=(x+2)^2+(y-2)^2;
@bnd(1,x,3);
max=2*x;
model:
sets:
fac/1..8/:a,b,x;
endsets
data:
a=2,9,3,8,10,6,4,10;
b=1,3,4,3,3,1,5,10;
enddata
max=@sum(fac(i):a(i)*x(i));
@sum(fac(i):b(i)*x(i))<=15;
@for(fac(i):@bin(x(i)));
end
model:
sets:
factory/1..6/:a,x;
plant/1..5/:b;
coo(factory,plant):c;
endsets
data:
a=2.1 1.0 1.8 1.2 2.0 1.2
b=
c=
enddata
max=@sum(factory(i):a(i)*x(i))
@for(plant(j):@sum(c(i,j)*x(i))<=b(j))
@sum(factory:x(i))=14;
x(2)<=3;
x(4)<=4
@for(factorg(i):i#ne#2 #and# i#ne#4:@bnd(1,x(i),4))
@for(factory(i):@gin(x))
end