矩阵工厂
一维矩阵
语法:
!创建矩阵;
!说明:
factory1代表工厂名字
/1..6/代表1*6的一维矩阵
a,b,c,d代表矩阵名字
;
sets:
factory1 /1..6/:a,b;
factory2 /1..3/:c,d;
endsets
!设置数据;
data:
a=1,2,3,4,5,6;
c=1.0,2,3.0;
enddata
【说明】:
- 矩阵生产完毕后,工厂与矩阵之间就无关联;
sets: endsets
表示工厂生产流程的起止;- 默认矩阵的值为:0;
- 若给矩阵赋值必须全部赋值,不可以只给一个矩阵中部分赋值;
- 赋值可以赋整数,小数;
data: enddata
表示矩阵赋值的起止。
二维矩阵
语法:
sets:
factory1 /1..6/:a,b;
factory2 /1..3/:c,d;
factory3(factory1,factory2):e; !6*3;
factory4(factory2,factory1):f; !3*6;
endsets
data:
e=1,2,3,4,5,6
7,8,9,10,1.1,2.2
3.3,4.4,5.5,6.6,7.7,8.8;
enddata
for循环
语法:
sets:
factory /1..6/:a,b;
endsets
data:
a=1,2,3,4,5,6;
b=1,1,1,1,1,1;
enddata
!说明:
factory(i)代表循环几次
a(i)*b(i)=s代表数组a和数组b数据一一相乘后的结果s
;
@for(factory(i):a(i)*b(i)=s);
【说明】:
i
在一维数组中可有可无;但在二维数组中必须指明i
和j
。
sum求和
语法:
sets:
factory /1..6/:a,b;
endsets
data:
a=1,2,3,4,5,6;
b=1,1,1,1,1,1;
enddata
!说明:
factory(i)代表循环几次
整体表示数组a中所有数据相加等于100
;
@sum(factory(i):a(i))=100;
【说明】:
i
在一维数组中可有可无;但在二维数组中必须指明i
和j
。
线性规划基础
- 一个线程规划只有一个目标函数,若有多个目标需要建模转换成一个目标;
- 目标函数的最大/最小用
max
/min
表示; - 线性规划求解基本可以得到全局最优解,而非线性规划求解基本无法得到。
例题
例一
max=200*x1+300*x2;
x1<=100;
x2<=120;
x1+2*x2<=160;
例二
max=s;
sets:
factory01 /1..5/:a,x;
endsets
data:
a=1,2,3,4,5;
enddata
@for(factory01(i):a(i)*x(i)=s);
@sum(factory01(i):x(i))=5000;
例三
sets:
factory01 /1..6/:a;
factory02 /1..8/:d;
factory03(factory01,factory02):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
@for(factory01(i):@sum(factory02 (j):x(i,j))<= a(i));
@for(factory02(j):@sum(factory01(i):x(i,j)) = d(j));
min = @sum( factory03(i,j) : c(i,j)*x(i,j) );