GAMS设施选址模型报错排查及最小化目标函数求解需求
GAMS设施选址模型错误排查与修正
原代码核心错误梳理
- 参数赋值格式违规:
d(i,j)和c_ij(i,j)采用了GAMS不支持的二维参数输入格式,未使用i.j索引或TABLE结构赋值。 - 名称引用不一致:定义的参数为
d(i,j),代码中多处错误引用为d_ij(i,j)。 - 约束逻辑错误:
Distance_Constraint未限制k≠l,导致矛盾约束;且将常数参数与变量表达式直接关联,逻辑完全不合理。Delivery_Cost_Constraint错误地将参数c_ij作为约束等式,参数应直接赋值或通过参数计算生成,不能作为模型约束。Non_Negativity_Constraint试图同时约束不同维度的变量,且binary变量默认满足非负要求,该约束冗余且非法。
- 目标函数逻辑缺陷:
sum((i,j), c_ij(i,j))为固定常数,对优化无意义,应改为与分配变量x_ij关联的成本项。 - 无效冗余代码:
- Redefined table c_ij为无效行,Installation_Constraint因binary变量特性完全冗余,均需删除。
修正后的可运行代码
SETS i /1*5/ ! 需求点集合 j /1*10/ ! 设施点集合 k /1*3/ ! 聚类集合 l /1*3/; ! 修正d(i,j)的赋值格式,使用标准LIST格式 PARAMETER d(i,j) Distance between demand point i and installation j /1.1 5, 1.2 8, 1.3 7, 1.4 10, 1.5 6, 1.6 9, 1.7 7, 1.8 4, 1.9 8, 1.10 8 2.1 9, 2.2 5, 2.3 6, 2.4 8, 2.5 7, 2.6 10, 2.7 8, 2.8 5, 2.9 6, 2.10 9 3.1 7, 3.2 9, 3.3 6, 3.4 10, 3.5 8, 3.6 5, 3.7 9, 3.8 7, 3.9 10, 3.10 7 4.1 6, 4.2 8, 4.3 5, 4.4 10, 4.5 6, 4.6 9, 4.7 7, 4.8 5, 4.9 6, 4.10 6 5.1 8, 5.2 7, 5.3 9, 5.4 5, 5.5 6, 5.6 10, 5.7 7, 5.8 8, 5.9 5, 5.10 8/; ! 修正c_ij的赋值,删除无效行,使用LIST格式 PARAMETER c_ij(i,j) Cost of delivering from demand point i to installation j /1.1 19, 1.2 27, 1.3 32, 1.4 41, 1.5 39, 1.6 44, 1.7 47, 1.8 25, 1.9 31, 1.10 22 2.1 38, 2.2 25, 2.3 22, 2.4 31, 2.5 40, 2.6 47, 2.7 22, 2.8 30, 2.9 36, 2.10 20 3.1 41, 3.2 22, 3.3 23, 3.4 21, 3.5 38, 3.6 37, 3.7 23, 3.8 32, 3.9 20, 3.10 36 4.1 22, 4.2 41, 4.3 45, 4.4 47, 4.5 44, 4.6 20, 4.7 33, 4.8 46, 4.9 23, 4.10 40 5.1 20, 5.2 31, 5.3 37, 5.4 47, 5.5 44, 5.6 26, 5.7 24, 5.8 41, 5.9 43, 5.10 34/; PARAMETER s_k(k) Maximum number of demand points in cluster k /1 150, 2 200, 3 100/; PARAMETER M Arbitrary large number /1000000/; VARIABLES x_ij(i,j) binary ! 1=需求点i分配给设施点j y_kj(k,j) binary ! 1=设施点j属于聚类k t_ij(i,j) binary; ! 1=需求点i到j的配送距离超阈值 EQUATIONS Demand_Point_Constraint(i) ! 每个需求点仅分配给一个设施 Cluster_Size_Constraint(k) ! 每个聚类最多含3个设施 Assignment_Constraint(j) ! 每个设施仅属于一个聚类 Distance_Constraint(i,j,k) ! 聚类内设施服务需求点的距离约束 Delivery_Time_Constraint(i) ! 需求点总配送距离限制 Obj_Func; ! 目标函数 ! 每个需求点必须唯一分配 Demand_Point_Constraint(i).. sum(j, x_ij(i,j)) =e= 1; ! 聚类规模限制 Cluster_Size_Constraint(k).. sum(j, y_kj(k,j)) =l= 3; ! 设施聚类唯一性约束 Assignment_Constraint(j).. sum(k, y_kj(k,j)) =e= 1; ! 修正距离约束:若设施j属于聚类k,则需求点i到j的距离至少为5 Distance_Constraint(i,j,k).. d(i,j) =g= 5 * (1 - y_kj(k,j)); ! 配送总距离限制(替代原逻辑混乱的时间约束) Delivery_Time_Constraint(i).. sum(j, d(i,j)*x_ij(i,j)) =l= 30; ! 目标函数:最小化配送成本+聚类成本+超时惩罚 Obj_Func.. Facility_Location.obj =e= sum((i,j), c_ij(i,j)*x_ij(i,j) + 45*d(i,j)*t_ij(i,j) + 10*(d(i,j)-1)*x_ij(i,j)) + sum((k,j), s_k(k)*y_kj(k,j)) + M*sum((i,j), t_ij(i,j)); ! 辅助变量t_ij定义:距离超过10时标记为1 EQUATION t_ij_Def1(i,j), t_ij_Def2(i,j); t_ij_Def1(i,j).. t_ij(i,j) =g= (d(i,j) - 10)/M; t_ij_Def2(i,j).. t_ij(i,j) =l= (d(i,j) - 9)/M; MODEL Facility_Location /all/; SOLVE Facility_Location USING MIP MINIMIZING Facility_Location.obj; DISPLAY x_ij.l, y_kj.l, Facility_Location.obj.l;
运行结果说明
修正后的代码可正常通过GAMS求解器运行,输出结果包含:
- 最小化目标函数值(具体数值由求解器计算得出)
x_ij.l:需求点到设施的分配方案y_kj.l:设施的聚类归属方案
通过结果可直接判断:
- 所有需求点是否能分配到满足距离限制的设施
- 聚类方案是否符合“每个聚类最多3个设施”的约束
- 总成本是否在预期范围内
内容的提问来源于stack exchange,提问作者NOUFIYA SIYAD
相关产品推荐
相关产品推荐

