AMPL线性约束构建求助:车队平均燃油效率约束实现疑问
问题解决:AMPL车队平均燃油效率线性约束实现
核心问题修正
先明确两处关键错误:
.mod文件中amount参数冗余:决策变量Make[c]才是实际生产数量,无需预先定义生产数量参数.dat文件中fleet_eff定义错误:不能用模型变量(如Total_Cars)定义参数,且法规要求的车队平均效率是固定阈值参数,不是基于现有产量计算的值
修正后的.mod文件
删除冗余参数,编写线性化的效率约束:
# Set of cars we can produce set CAR; # Parameters param time {CAR} > 0; # 生产单辆车耗时(小时) param fac_time > 0; # 下周可用工时 param profit {CAR} > 0; # 单辆车利润 param lower {CAR} >= 0; # 单车型最低产量要求 param fuel_eff {CAR} > 0; # 单车型燃油效率 param fleet_avg > 0; # 法规要求的最低车队平均燃油效率(固定阈值) # 决策变量:各车型生产数量 var Make {c in CAR} >= lower[c]; # 目标函数:最大化总产量 maximize Total_Cars: sum {c in CAR} Make[c]; # 约束条件 s.t. Time: sum {c in CAR} time[c] * Make[c] = fac_time; # 线性化的车队平均效率约束:总效率贡献 ≥ 平均阈值 × 总产量 s.t. Efficiency: sum {c in CAR} fuel_eff[c] * Make[c] >= fleet_avg * sum {c in CAR} Make[c];
修正后的.dat文件
补充缺失的燃油效率数值,替换错误的fleet_eff为固定阈值:
set CAR := T C L; param: time profit lower fuel_eff:= T 1 200 10 30 C 2 500 20 40 L 3 700 15 25; param fac_time := 120; # 示例法规阈值,可根据题目要求修改 param fleet_avg := 32;
关键逻辑说明
- 线性化原理:原平均效率约束为
(sum(fuel_eff[c]*Make[c]) / sum(Make[c])) ≥ fleet_avg,因总产量sum(Make[c])为正数(所有Make[c]≥lower[c]且必有产量),两边同乘总产量后不等号方向不变,转化为纯线性约束,彻底避免变量相除 fleet_avg是题目给定的法规要求值,需在.dat文件中直接赋值,不能依赖模型变量计算
内容的提问来源于stack exchange,提问作者Mampenda
相关产品推荐
相关产品推荐

