lingo入门-集合和矩阵

lingo入门-集合和矩阵

    • 例题引入
    • 矩阵工厂
    • 矩阵的赋值
    • 函数循环与求和
    • 二维矩阵
    • 练习

跟着B站的学习记录:传输门

例题引入

lingo入门-集合和矩阵_第1张图片
解法【暴力枚举法】
lingo入门-集合和矩阵_第2张图片
lingo入门-集合和矩阵_第3张图片

矩阵工厂

测试代码

sets:
factory /1..6/ : a,b;
plant /1..3/ : x,y;
endsets

lingo入门-集合和矩阵_第4张图片
lingo入门-集合和矩阵_第5张图片
① 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表示矩阵赋值的起止。

函数循环与求和

lingo入门-集合和矩阵_第6张图片

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

lingo入门-集合和矩阵_第7张图片
lingo入门-集合和矩阵_第8张图片
lingo入门-集合和矩阵_第9张图片
使用矩阵工厂创建后,整个程序用modelend包起来

二维矩阵

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 也是随便起的。

练习

lingo入门-集合和矩阵_第10张图片

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));

输出结果
lingo入门-集合和矩阵_第11张图片

你可能感兴趣的:(2021数学建模)