== 哎,什么都得自学……学校课程欠缺好大…… ==
lingo 的语法
/
^
lingo 不区分大小写,eg:mmm、Mm、mMMm 都视为同一个变量。(Spss 也不区分哦)
lingo、Matlab 中变量的命名不要使用驼峰式,使用下划线,且字母在首位。
lingo 不读取空格
model:end
Lingo 17 有时候会报一些语法错误,但是明明没有错误……
注意:Lingo 中的代码表示的是方程组,这点很重要。不能将计算机语言中的一些默认特性带入 Lingo。比如:Lingo 中不可以 “给同一个变量赋不同的值”。(之所以打双引号是因为 Lingo 中的都是方程,用变量赋值来说,在数学上不准确)
错误实例:
c = 1;
c = 2;
Lingo 会提示异常,c 的结果也不对:
没有被赋初始值的变量,可能默认不是 0,亦有可能是 1.234568。你可以手动覆盖,问题不大。出现这种情况可能是因为内部实现使用了不同的算法。
lingo也可以用来解普通方程
lingo 用于解线性规划
Objective value
x^2 + y^2 + 2*x = 103;
!sdfdsfds;
2*x + y = 12;
y > 5;![2, 2; 2 3];
矩阵工厂
矩阵工厂就是集合的意思, 用来生产一维矩阵。
A(i)
sets:factory/1..6/:a,b;plant/1..3/:x,y;
endsets
sets:endsets
矩阵的赋值
data:enddatasets:endsets
-
不是所有矩阵都要被赋值,有些矩阵正是我们要求解的变量(如 解向量 x)。
-
Lingo 矩阵赋值是,你就老实写数字,不要写 一个算式,不要打算让 Lingo 帮你先求解在给矩阵赋值:
for 循环
当一个数学式子需要手写好几个代码行的时候就可以使用for循环代替
这个式子,手写需要 5 行。
使用 for 循环表示如下:
sets:col_1/1..5/:a,x;
endsetsdata:a = 1 2 3 4 5;
enddatamax S;@for( col_1(i): a(i)*x(i) = s);
!for( col_1 : a*x = s) 这样也行;
- for 循环,执行整行语句,因为 S = ai * xi , i = 1, 2, …, 5 相当于 5 个约束条件
- for 循环内部,先写工厂,以告诉 for 循环几次,之后再上接约束条件。
- for 循环中的 i 可以替换成其他变量,随意。
- **这个 for 循环中 i 甚至可以省略,这是因为不会造成歧义。**这是特殊情况。二维工厂出现后必须要带 i。
sum
暴力Lingo:
sum Lingo:
for 与 sum 出现的标志
- 约束条件后面有 i=1,2,...,n ,一定在最外层 套上 for。
- 约束条件前面是 ∑i=1nX i 一定要在外层 加上 sum。
工厂合并
工厂合并 : 生产二维矩阵
既然是合并,那显然,首先必须要有两个生产一维矩阵的工厂
sets:factory /1..6/ : a;plant /1..8/ : d;Matrix(factory, plant) : c,x;
endsets
Matrix 是生产 6*8 二维矩阵的工厂。
二维工厂也可以用于表示 for 循环。例题中会体现
二维工厂的赋值
data:Matrix = 1 2 3 4 ...balabala... 48; !一共需要64个元素;
enddata
例题
model:sets:row/1..6/:ro, a;col/1..8/:co, d;Matrix(row, col):x, c;endsetsdata:a = 60 55 51 43 41 52;d = 35 37 22 32 41 32 43 38;c = 6 2 6 7 4 2 5 84 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddata!目标函数; !min = @sum( row(i): @sum( col(j):c(i,j)*x(i,j) ) )完全等价于下式; min = @sum( Matrix(i,j) : c(i,j)*x(i,j) );!约束条件; @for( row(i) : @sum( col(j) : x(i,j) ) <= a(i) );@for( col(j) : @sum( row(i) : x(i,j) ) = d(j) );end
结果:
参考视频