Lingo 的基本使用

== 哎,什么都得自学……学校课程欠缺好大…… ==

lingo 的语法

/
^

lingo 不区分大小写,eg:mmm、Mm、mMMm 都视为同一个变量。(Spss 也不区分哦)

lingo、Matlab 中变量的命名不要使用驼峰式,使用下划线,且字母在首位。

lingo 不读取空格

model:end

Lingo 17 有时候会报一些语法错误,但是明明没有错误……

注意:Lingo 中的代码表示的是方程组,这点很重要。不能将计算机语言中的一些默认特性带入 Lingo。比如:Lingo 中不可以 “给同一个变量赋不同的值”。(之所以打双引号是因为 Lingo 中的都是方程,用变量赋值来说,在数学上不准确)

错误实例:

c = 1;
c = 2;

Lingo 会提示异常,c 的结果也不对:image-20200716162419117

image-20200717165642076

没有被赋初始值的变量,可能默认不是 0,亦有可能是 1.234568。你可以手动覆盖,问题不大。出现这种情况可能是因为内部实现使用了不同的算法。

image-20200716162640578

lingo也可以用来解普通方程

image-20200716150043115

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
  1. 不是所有矩阵都要被赋值,有些矩阵正是我们要求解的变量(如 解向量 x)。

  2. Lingo 矩阵赋值是,你就老实写数字,不要写 一个算式,不要打算让 Lingo 帮你先求解在给矩阵赋值:

  3. image-20200716164320613

    image-20200716164345283

for 循环

当一个数学式子需要手写好几个代码行的时候就可以使用for循环代替

image-20200716165213984

image-20200716165031272

这个式子,手写需要 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) 这样也行;
  1. for 循环,执行整行语句,因为 S = ai * xi , i = 1, 2, …, 5 相当于 5 个约束条件
  2. for 循环内部,先写工厂,以告诉 for 循环几次,之后再上接约束条件。
  3. for 循环中的 i 可以替换成其他变量,随意。
  4. **这个 for 循环中 i 甚至可以省略,这是因为不会造成歧义。**这是特殊情况。二维工厂出现后必须要带 i。

sum

image-20200716170318014

暴力Lingo:image-20200716170346167

sum Lingo:image-20200716170403900

for 与 sum 出现的标志

  1. 约束条件后面有 i=1,2,...,ni = 1, 2, ...,ni=1,2,...,n ,一定在最外层 套上 for。
  2. 约束条件前面是 i=1nX i \sum_{i=1}^{n}X~i~∑i=1n​X 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

例题

image-20200716174309569

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

结果:image-20200716180822828

参考视频