跟着B站的学习记录:传输门
测试代码
sets:
factory /1..6/ : a,b;
plant /1..3/ : x,y;
endsets
① factory 和 plant 都是制造矩阵的工厂,但它们是两家不同的工厂。
② factory 工厂后面的 /1…6/ 说明它专门生产 1 × 6 1\times6 1×6 的矩阵。factory 工厂最后面出现的 a 和 b,都是 1 × 6 1\times6 1×6 的矩阵。
③ plant 工厂后面的 /1…3/ 说明它专门生产 1 × 3 1\times3 1×3 的矩阵。plant 工厂最后面出现的 x 和 y,都是 1 × 3 1\times3 1×3 的矩阵。
④ 矩阵工厂的名字 factory 是随便起的,工厂所生产行矩阵的名字 a 和 b 也是随便起的。
⑤ 以上这四句话,本质是定义了四个行矩阵的大小,矩阵工厂只是中介。
⑥ 生产完矩阵后,工厂和矩阵之间将脱开联系。
⑦ Lingo 不是一行一行读代码的,所以用 sets:和 endsets 表示矩阵工厂生产流程的起止。
sets:
factory /1..6/ : a,b;
plant /1..3/ : c,x;
endsetsdata:
a = 1, 2, 3, 4, 5, 6;
b = 6.0, 5.0, 4.0, 3.0, 2.0, 1.0;
c = 10, 20, 30;
enddata
以上程序对应以下知识点:
①不是每个矩阵都要赋值,有些矩阵正是我们要求解的变量。
②需要赋值的矩阵必须赋满,不能给6个元素的矩阵只赋3个数值。
③Lingo中可以给矩阵赋整数,也可以赋小数,但是不能赋值分数。
④Lingo不是一行一行读代码的,所以用data:和enddata表示矩阵赋值的起止。
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
sets:
factory /1..6/ : a;
plant /1..8/ : d;
Cooperation(factory,plant) : c, x;
endsets
data:
c=6,2,6,7,4,2,5,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;
enddata
以上程序可以得到以下结论:
① Cooperation 大工厂是由 factory 和 plant 两家小工厂合并而办,可生产 6 × 8 6\times8 6×8 的矩阵。 ② a 是 1 × 6 1\times6 1×6 的矩阵,d 是 1 × 8 1\times8 1×8 的矩阵,c 和 x 都是 6 × 8 6\times8 6×8 的矩阵。
③ 如果将 Cooperation(factory,plant)中的 factory 与 plant 调换位置,则生产 8 × 6 8\times6 8×6 的矩阵。
④ 工厂合并的名字 Cooperation 是随便起的,矩阵的名字 c 和 x 也是随便起的。
model:
sets:
factory /1..6/ : a;
plant /1..8/ : d;
coo(factory,plant) : c, x;
endsets
data:
a=60,55,51,43,41,52;
d=35,37,22,32,41,32,43,38;
c=6,2,6,7,4,2,5,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;
enddata
min=@sum(coo(i,j):c(i,j)*x(i,j));
!min=@sum(factory(i):@sum(plant(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));