AMPL餐巾优化模型异常排查:无法获取最优解
问题排查与修正方案
原代码存在mod与dat内容混淆、重复定义、语法错误、范围不匹配等问题,以下是具体错误点分析和修正后的完整代码:
核心错误点
- 重复定义标识符:重复声明了
set D、param a/b/c/stock_init,AMPL不允许同一标识符多次定义 - 集合范围错误:原集合
D仅包含4天,但实际需求是5天 - 未声明变量
n:代码中使用1..n但未提前定义n的取值 - 目标函数语法错误:AMPL中
sum的正确格式为sum{迭代范围} (表达式),原代码用逗号分隔不符合语法 - 循环语法错误:
endfor位置错误,且循环格式不符合AMPL规范
修正后的代码拆分
将代码拆分为模型文件(.mod)和数据文件(.dat),符合AMPL的文件规范:
1. 模型文件 napkin.mod
# 定义总天数参数 param n integer; # 优化周期的总天数 # 声明模型参数 param d{1..n}; # 每日餐巾需求量 param a; # 单张餐巾清洗成本(美元) param b; # 单张新餐巾采购成本(美元) param c; # 单张餐巾每日库存持有成本(美元) param stock_init; # 初始库存数量 # 定义决策变量 var Buy{1..n} integer >= 0; # 每日新购餐巾数量 var Clean{1..n} integer >= 0; # 每日清洗餐巾数量 var Stock{0..n} integer >= 0; # 每日结束时的库存(Stock[0]为初始库存) # 目标函数:最小化总成本(清洗+采购+库存持有) minimize TotalCost: sum{i in 1..n} (a*Clean[i] + b*Buy[i] + c*Stock[i]); # 约束条件 # 每日餐巾供需平衡:期初库存+当日采购+当日清洗 = 当日需求+期末库存 subject to NapkinBalance{i in 1..n}: Stock[i-1] + Buy[i] + Clean[i] = d[i] + Stock[i]; # 初始库存约束 subject to StockInit: Stock[0] = stock_init; # 求解并输出结果 solve; # 打印每日决策结果 for {i in 1..n} do printf "Day %d: Buy %d, Clean %d, Ending Stock %d\n", i, Buy[i], Clean[i], Stock[i]; endfor; # 打印总成本 printf "\nTotal Minimum Cost: $%.2f\n", TotalCost;
2. 数据文件 napkin.dat
param n := 5; # 5天优化周期 # 每日需求量 param d := 1 80 2 70 3 120 4 150 5 100; # 成本与初始库存参数 param a := 1; param b := 2; param c := 0.5; param stock_init := 100;
运行方式
在AMPL环境中执行以下命令即可求解:
ampl napkin.mod napkin.dat
执行后会输出每日的采购、清洗数量、期末库存,以及最小总成本。
内容的提问来源于stack exchange,提问作者Sanjana Achar
相关产品推荐
相关产品推荐

