毕业论文所用AMPL模型约束区报语法错误,恳请协助排查解决
AMPL模型语法错误排查与修正
错误点汇总
- 集合迭代语法错误:sum函数中使用了未定义的集合别名(DistributionCenter、GroupType、DemandPoint等),且未声明迭代变量,AMPL中sum的标准写法为
sum{迭代变量 in 已定义集合} 带索引的表达式 - 约束结构不完整:con3、con4、con6仅写出了左侧表达式,缺少等式/不等式逻辑与右侧值,属于无效约束
- 索引缺失:Allocated、Shipped等多维度变量在sum中未补全所有索引位,无法匹配变量定义
- 集合差语法错误:时间集合排除第一期的写法
T diff {1}不符合AMPL规范,正确写法为T \ {1} - 整数除法精度问题:Newcon中两个整数类型值相除默认会做整数截断,无法得到正确的比例结果
- 基础定义缺失:原有代码未提前声明I/D/T/K集合、所有输入参数,运行时会识别报错
- 注释格式不规范:代码块顶行的
#VARIABLE、#OBJECTIVE FUNCTION等标题缺少空格,部分AMPL版本可能识别异常
修正后完整模型代码
# 基础定义部分(请根据你的实际取值完成赋值) set I; # 人群组集合 set D; # 区域集合 set T; # 时间周期集合 set K; # 配送中心候选点集合 param total_demand{I,D}; # 区域d内人群组i的总需求 param coverage_rate{I}; # 人群组i的最低覆盖率要求 param the_max_capacity{K,T}; # 周期t内配送中心k的最大处理能力 param cost_of_setting_up{K}; # 配送中心k的建设成本 param per_dose_purchasing_cost; # 单位物资采购成本 param per_dose_transportation_cost{K,D}; # 从配送中心k到区域d的单位物资运输成本 param per_dose_holding_cost{D}; # 区域d仓库的单位物资存储成本 param budget; # 总预算 param M = 100000; # 足够大的常数,用于未启用配送中心的发货约束判定 # 变量定义 var Allocated {I,D,T} integer; # 周期t分配给区域d的人群组i的数量 (y_idt) var Stored {D,T} integer; # 周期t存储在区域d仓库的数量 (w_dt) var Shipped {K,D,T} integer; # 周期t从配送中心k发往区域d仓库的数量 (x_kdt) var Distribution_Center_set_up {K} binary; # 0-1变量,1代表启用配送中心k,0代表不启用 (omega_k) var miu integer; # 新增自由变量 # 目标函数 maximize Z: miu; # 约束定义 subj to Newcon {i in I, d in D, t in T}: miu <= 0 + Allocated[i,d,t] / total_demand[i,d]; # 加0转换为浮点运算避免整数截断 subj to con_2 {i in I, d in D}: sum {t in T} Allocated[i,d,t] >= coverage_rate[i] * total_demand[i,d]; subj to con_3 {d in D, t in {1}}: sum {k in K} Shipped[k,d,t] - sum {i in I} Allocated[i,d,t] = Stored[d,t]; # 第一期库存平衡(无期初库存) subj to con_4 {d in D, t in T \ {1}}: sum {k in K} Shipped[k,d,t] + Stored[d, t-1] - sum {i in I} Allocated[i,d,t] = Stored[d,t]; # 非第一期库存平衡(含上期结转库存) subj to con_5 {k in K, t in T}: sum {d in D} Shipped[k,d,t] <= the_max_capacity[k,t]; subj to con_6 {k in K, d in D, t in T}: Shipped[k,d,t] <= M * Distribution_Center_set_up[k]; # 未启用的配送中心不能发货 subj to con_7: sum {k in K} cost_of_setting_up[k] * Distribution_Center_set_up[k] + sum {k in K, d in D, t in T} per_dose_purchasing_cost * Shipped[k,d,t] + sum {k in K, d in D, t in T} per_dose_transportation_cost[k,d] * Shipped[k,d,t] + sum {d in D, t in T} per_dose_holding_cost[d] * Stored[d,t] <= budget;
内容的提问来源于stack exchange,提问作者ghina salsabila rosyid
相关产品推荐
相关产品推荐

