用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<x<=1000

1500+2x,x>1000

if函数的嵌套功能

x=1500;
y=@if(x#le#500,4*x,@if(x#gt#1000,1500+2*x,500+3*x));

变量定界函数

@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的最小值

@free(x);
@free(y);
min=(x+2)^2+(y-2)^2;

【**@bnd**】求函数y=2x在(1,3)的最大值

@bnd(1,x,3);
max=2*x;

【**@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

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

【**@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=[]

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

数学函数

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