You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:53:26