lingo学习(三):运算符与内置函数
运算符
——算数运算符
- 这道题使用matlab求解效果最好,使用lingo则需要将他转化为方程
x=2;
y=3*x^10+6/(15-@sqrt(x));或y=3*x^10+6/(15-x^(1/2));
——关系运算符
- 关系运算符往往用在约束条件中,用来指定约束条件左右两边必须满足的关系
- lingo只有等于、>=、<=三种关系运算符,当输入>或<时,lingo也不会报错,因为他默认为大于等于或小于等于
- 若要严格表达a大于b,则使用以下形式
B=10;
e=0.0001;
A-e>B;
——逻辑运算符
- 逻辑运算符唯一出现的位置
a、for循环与sum循环中
b、if判断中
例题
法1
model:
sets:
fac/1..6/:a;
endsets
data
a=6,5,4,3,2,1;
enddata
a(5)+a(5)=y;
end
法2
model:
sets:
fac/1..6/:a;
endsets
data
a=6,5,4,3,2,1;
enddata
y=@sum(fac(i)| i#ge#5 :a(i));或y=@sum(fac(i)| i#gt#5 :a(i));
end
model:
sets:
fac/1..6/:a;
endsets
min=@sum(fac(i):a(i));
@for(fac(i)|i#le#2 #or# i#ge#5:a(i)>5);或者@for(fac(i)|i#ne#3 #and# i#ne#4:a(i)>5);
end
model:
sets:
fac/1..3/: ;
coo(fac,fac):a;
endsets
data:
a=1,2,3
4,5,6
7,8,9;
enddata
y=@sum(coo(i,j)|i#le#j:a(i,j));
end
内置函数
——if判断
- lingo默认所有变量不为负数,故应先进行定义域*化
- if函数语法简单
@free(x);
@free(y);
x=-10;!给x一个随机的初值;
y=@if( x#ge#0,x+10,x-10);
- if函数通常仅仅在分段函数处出现,一般其出现频率、使用次数非常低
- lingo中的if函数必须自带一个else,即上图中黑色色块处的语句
——变量定界函数
一些例题
- 出现i=1,2,3……这种的就要用for循环
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:b*x)<15;
@for(fac:@bin(x));
end
- 因为是整数规划,所以需要限定变量为整数,但又由于a,d,c都已经有了数值,所以只限定没有数值的x即可
- 注意最后一个约束条件的处理方式
- 该题无解
model:
sets:
fac/1..6/:a,x;
pat/1..5/:b;
coo(fac,pat):c;
endsets
data:
a=2.1,1.0,1.8,1.2,2.0,1.2;
b=5,125,12500,345,5;
c=0.45,20,415,22,0.3
0.45,28,4065,5,0.35
0.65,40,850,43,0.6
0.4,25,75,27,0.2
0.5,26,76,48,0.4
0.5,75,235,8,0.6;
enddata
max =@sum(fac(i):a(i)*x(i));
@for(pat(j):@sum(fac(i):c(i,j)*x(i))<b(j));
@sum(fac:x)=14;
x(2)<=3;
x(4)<=2;
@for(fac(i)| i#ne#2 #and# i#ne#4 : @bnd(1,x(i),4) );
@for( fac: @gin(x) );
end
——数学函数
——集合操作函数
- @max与@min均为函数,与max或min不同,不能表示目标函数
model:
sets:
factory / 1..6 / : a;
endsets
data:
a = 6,5,4,3,2,1;
enddata
prod = @prod(factory : a);
greater = @max(factory : a);
less = @min(factory : a);
in = @in(factory,5);
size = @size(factory);
end