工厂布局优化GAMS代码报错求助:仅支持部门与工位内部置换
工厂布局优化GAMS代码修复与问题排查
问题背景
我编写了用于工厂布局优化的GAMS代码,目标是最小化部门与工位间的物料流及距离,通过调整布局减少物料流转耗时。核心约束为仅允许部门间、工位内部互换(如部门1与4互换,工位3与10互换,部门与工位不可互换),但代码存在大量错误无法运行,恳请协助排查修复。
原错误代码
SETS i departments /1*6/ j stations /1*10/ m departments2 /1*6/ n stations2 /1*10/ ; PARAMETERS Table Workflow(i, j) Workflow matrix 1 2 3 4 5 6 7 8 9 10 1 1 1 3 3 3 3 0 4 5 3 2 4 6 5 7 6 6 8 9 7 6 3 1 0 5 4 1 0 0 6 6 5 4 5 8 5 6 7 0 0 1 1 6 5 3 0 4 0 0 0 0 5 6 5 6 3 4 3 0 5 0 4 10 9 4; PARAMETERS Table Distance(m, n) Distance matrix 1 2 3 4 5 6 7 8 9 10 1 35 47 61 74 81 97 111 125 137 55 2 68 86 90 98 104 103 79 78 90 67 3 312 323 335 344 358 367 377 393 414 318 4 72 83 95 106 118 128 136 151 173 57 5 116 0 97 0 0 0 0 39 28 193 6 83 87 69 0 52 0 18 17 12 171; VARIABLES y(m, n) Binary variables a(j, n) Binary variables b(i, m) Binary variables z Objective function; BINARY VARIABLES Q(i, j, m, n); EQUATIONS c1(n) c2(j) c3(i, j, m, n) c4(i, j, m, n) c5(i, j, m, n) c6(i) c7(m) c8(i, j, m, n) t1(n) t2(n) t3(n) t4(n) t5(n) t6(n) t7(n) t8(n) t9(n) t10(n) k1(m) k2(m) k3(m) k4(m) k5(m) k6(m); c1(n).. sum(j, a(j, n)) =e= 1; c2(j).. sum(n, a(j, n)) =e= 1; c6(i).. sum(m, b(i, m)) =e= 1; c7(m).. sum(i, b(i, m)) =e= 1; c3(i, j, m, n).. Q(i, j, m, n) =l= a(j, n); c8(i, j, m, n).. Q(i, j, m, n) =l= b(i, m); c4(i, j, m, n).. Q(i, j, m, n) =l= y(m, n); c5(i, j, m, n).. Q(i, j, m, n) =g= a(j, n) + y(m, n) + b(i, m) - 1; t1(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t2(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t3(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t4(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t5(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t6(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t7(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t8(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t9(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; t10(n).. sum((i, j, m), Q(i, j, m, n)) =e= 1; k1(m).. sum((n, i,j), Q(i, j, m, n)) =e= 1; k2(m).. sum((n, i,j), Q(i, j, m, n)) =e= 1; k3(m).. sum((n, i,j), Q(i, j, m, n)) =e= 1; k4(m).. sum((n, i,j), Q(i, j, m, n)) =e= 1; k5(m).. sum((n, i,j), Q(i, j, m, n)) =e= 1; k6(m).. sum((n, i,j), Q(i, j, m, n)) =e= 1; min.. z =e= sum((i, j, m, n), workflow(i, j) * Distance(m, n) * Q(i, j, m, n)); Model Layout /all/; Solve Layout using RMIP minimizing z;
错误分析与修复要点
- 参数表语法错误:GAMS中参数需先声明再用Table块定义数据,原代码将
PARAMETERS与Table混写,导致语法报错。 - 变量类型声明错误:
VARIABLES块中直接标注二进制变量无效,需通过BINARY VARIABLES单独声明;冗余变量y(m,n)无实际作用,直接删除。 - 四维变量Q冗余:原模型用四维变量Q关联部门、工位分配,逻辑混乱且增加求解复杂度。结合问题约束(部门/工位独立互换),可直接用部门分配变量
b(i,m)和工位分配变量a(j,n)的乘积关联物料流与距离。 - 重复约束冗余:
t1-t10、k1-k6是完全重复的约束,合并为单一约束即可,避免模型冗余。 - 目标函数命名错误:
min是GAMS关键字,不能用作方程名称,需自定义名称如obj;且GAMS区分大小写,原代码中Workflow与workflow大小写不一致,会导致未定义错误。 - 约束逻辑错误:原代码中
c4、c5的约束逻辑无意义,直接删除并简化模型结构。
修复后的代码
SETS i departments /1*6/ ! 原部门集合 j stations /1*10/ ! 原工位集合 m dept_positions /1*6/ ! 部门可分配的位置(与原部门一一对应,用于互换) n station_positions /1*10/; ! 工位可分配的位置(与原工位一一对应,用于互换) ! 物料流矩阵:部门i与工位j之间的物料流量 PARAMETER Workflow(i,j) 'Workflow matrix'; Table Workflow(i,j) 1 2 3 4 5 6 7 8 9 10 1 1 1 3 3 3 3 0 4 5 3 2 4 6 5 7 6 6 8 9 7 6 3 1 0 5 4 1 0 0 6 6 5 4 5 8 5 6 7 0 0 1 1 6 5 3 0 4 0 0 0 0 5 6 5 6 3 4 3 0 5 0 4 10 9 4; ! 距离矩阵:部门位置m与工位位置n之间的距离 PARAMETER Distance(m,n) 'Distance matrix'; Table Distance(m,n) 1 2 3 4 5 6 7 8 9 10 1 35 47 61 74 81 97 111 125 137 55 2 68 86 90 98 104 103 79 78 90 67 3 312 323 335 344 358 367 377 393 414 318 4 72 83 95 106 118 128 136 151 173 57 5 116 0 97 0 0 0 0 39 28 193 6 83 87 69 0 52 0 18 17 12 171; ! 二进制变量定义 BINARY VARIABLES b(i,m) '1 if department i is assigned to position m' a(j,n) '1 if station j is assigned to position n'; ! 目标变量 VARIABLE z 'Total material handling cost'; ! 方程定义 EQUATIONS obj 'Objective function: minimize total material flow * distance' dept_assign1(i) 'Each department is assigned to exactly one position' dept_assign2(m) 'Each position is assigned exactly one department' station_assign1(j) 'Each station is assigned to exactly one position' station_assign2(n) 'Each position is assigned exactly one station'; ! 目标函数:物料流 × 对应位置距离的总和最小化 obj.. z =e= sum((i,j,m,n), Workflow(i,j) * Distance(m,n) * b(i,m) * a(j,n)); ! 部门分配约束:每个部门仅分配到一个位置 dept_assign1(i).. sum(m, b(i,m)) =e= 1; ! 部门位置约束:每个位置仅分配一个部门 dept_assign2(m).. sum(i, b(i,m)) =e= 1; ! 工位分配约束:每个工位仅分配到一个位置 station_assign1(j).. sum(n, a(j,n)) =e= 1; ! 工位位置约束:每个位置仅分配一个工位 station_assign2(n).. sum(j, a(j,n)) =e= 1; ! 模型定义与求解 Model LayoutOptimization /all/; Solve LayoutOptimization using MIP minimizing z; ! 输出结果 DISPLAY b.l, a.l, z.l;
修复说明
- 简化模型结构,删除冗余变量和约束,用独立的部门/工位分配变量实现互换逻辑,完全符合问题要求。
- 修正所有语法错误,确保GAMS可正常编译运行。
- 添加结果显示语句,方便查看最优分配方案和目标值。
内容的提问来源于stack exchange,提问作者Sky Full Of Stars
相关产品推荐
相关产品推荐

