Lingo和Matlab,都是数学建模中经常用到的编程软件,但Lingo相对于Matlab,在解决线性规划、非线性规划类问题时相对于Matlab更为简单直观
lingo程序的基本模板
model:
sets:
//相关变量的声明
endsets
data:
//相关变量数据的设置
enddata
//约束条件,目标函数的构建
end
model与end sets与endsets data与enddata 这些关键词都是成对出现的
lingo程序的默认操作
- lingo默认所有的变量都大于等于0的数字,因而非负的条件不必多写,如果要将其设为R(实数域),利用@free函数
例:@free(a) 将变量a设为实数域
-
m与M是等价的lingo不区分大小写,所以mmm、mMm、MMM被视为同一变量,
在lingo的使用过程中,建议全部使用小写; -
lingo中只有三种关系运算符 = >= <=
-
lingo中添加注释的操作 ! 注释内容 ;
lingo在解决线性,非线性规划问题时经常使用的语句
1.一维矩阵,二维矩阵的创建
例:
sets:
factory /1…6 / : b; 建立1*6的矩阵 b
plant /1…8 / : c; 建立1*8的矩阵 c
coo (factory,plant):x,y; 将factory与plant矩阵合并,生成新6*8的二维矩阵 x,y
factory,plant,coo不是lingo里面的关键字,由用户自己设定
2.一维矩阵,二维矩阵数据的设置
例:
将 1*6的矩阵a进行数据的设置(即数据的初始化)
a=60,55,51,43,41,52;
将 6*8的 矩阵c进行数据的设置 (即数据的初始化)
c=1,2,3,4,5,6,7,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;
注意:在对二维矩阵进行初始化时最后一行有分号,其它行没有分号
数据的设置都在data enddata之间进行
3.@sum(求和函数)与 @for(for循环的运用)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H3nOxUH4-1626597380385)(C:\Users\hk’s computer\Desktop\XZ_K6R3F6839JP1P{7ZM8SE.png)]
lingo代码
model:
sets:
factory /1..6/ : a;
plant /1..8/ : d;
coo(factory,plant):x,c;//创建两个6*8的矩阵
endsets
data:
//相关数据的初始化
a=1,2,3,4,5,6;
d=1,2,3,4,5,6,7,8;
x=1,2,3,4,5,6,7,8
9,10,11,12,13,14,15,16
17,18,19,20,21,22,23,24
25,26,27,28,29,30,31,32
33,34,35,36,37,38,39,40
41,42,43,44,45,46,47,48;
c=1,2,3,4,5,6,7,8
9,10,11,12,13,14,15,16
17,18,19,20,21,22,23,24
25,26,27,28,29,30,31,32
33,34,35,36,37,38,39,40
41,42,43,44,45,46,47,48;
enddata
min=@sum(coo(i,j) : c(i,j)*x(i,j));//目标函数
//约束条件
@for(factory(i) : @sum(plant(j): x(i,j))<=a(i));
@for(plant(j) : @sum(factory(i): x(i,j))=d(j));
end
该题的数据由博主自己设置,求目标函数的最小值也是由博主自己设置
@sum @for函数使用的总结
1.sum函数一般用于出现求和符号的情况,如果有多个求和符号则要使用@sum函数的嵌套
2.for循环一般用于 i=1…n 类似于这样的式子,且for循环一般在最外层,需要优先考虑
3.lingo中默认将所有的变量的范围看成大于等于,在编写约束条件时需要进行考虑