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

AMPL报错:hw3.dat中b[1]已定义,求问题排查方案

AMPL最小费用网络流模型报错排查:b[1] already defined

问题描述

使用AMPL求解最小费用网络流模型时,hw3.dat文件第14行出现b[1] already defined错误,尝试重命名参数b后问题依旧,附上model和dat文件请求排查。

报错信息

hw3.dat, line 14 (offset 262):
b[1] already defined
context: 1 1 >>> ; <<<

MODEL FILE

# AMPL model for the Minimum Cost Network Flow Problem
#
# By default, this model assumes that b[i] = 0, c[i,j] = 0,
# l[i,j] = 0 and u[i,j] = Infinity.
#
# Parameters not specified in the data file will get their default values.
reset;
options solver cplex;
set NODES;                        # nodes in the network
set ARCS within {NODES, NODES};   # arcs in the network
set english;
set french;
param b {NODES} default 0;        # supply/demand for node i
param c {ARCS}  default 0;        # cost of one unit of flow on arc(i,j)
param l {ARCS}  default 0;        # lower bound on flow on arc(i,j)
param u {ARCS}  default Infinity; # upper bound on flow on arc(i,j)
var x {ARCS};                     # flow on arc (i,j)
maximize cost: sum{(i,j) in ARCS} c[i,j] * x[i,j];  #objective: minimize 
#arc flow cost


subject to flow_balance {i in NODES}:
sum{j in NODES: (i,j) in ARCS} x[i,j] - sum{j in NODES: (j,i) in ARCS} 
x[j,i] = b[i];A
subject to capacity {(i,j) in ARCS}: l[i,j] <= x[i,j] <= u[i,j];
subject to flow_conservation {i in english}:
    sum{j in french} x[i,j] = 1;
subject to flow_bounds {(i,j) in ARCS}:
    x[i,j] = 0 || x[i,j] <= 1;
#subject to Number: {(i,j) in ARCS} x[i,j]=0 || x[i,j] = 1;


data hw3.dat
solve;
printf "The optimal pair assignments with compatibility scores are: \n";
for {i in english, j in french} {
    printf "English Child %d and French Child %d with compatibility score %d \n", i, j, c[i,j];
}

DATA FILE

data;
set NODES :=e1 e2 e3 f1 f2 f3;
set ARCS:= (e1,f1) (e1,f2) (e1,f3) (e2,f1) (e2,f2) (e2,f3) (e3,f1) (e3,f2) (e3,f3);

set english:=e1 e2 e3;
set french:=f1 f2 f3;
param: b:=
          1 1
          1 1
          1 1
          1 1
          1 1
          1 1;
param: c l u:=
        [e1,f1] 6  0 10
        [e1,f2] 3  0 10
        [e1,f3] 2  0 10
        [e2,f1] 9  0 10
        [e2,f2] 5  0 10
        [e2,f3] 1  0 10
        [e3,f1] 4  0 10
        [e3,f2] 10 0 10
        [e3,f3] 8  0 10
 ;

问题根源与解决方法

1. 参数b的索引不匹配(核心报错原因)

模型中param b {NODES}定义b的索引是NODES集合中的字符串元素(e1、e2、e3、f1、f2、f3),但dat文件中用数字1作为索引重复赋值,导致b[1]被多次定义。

修正方案:将dat文件中b的赋值改为对应NODES的元素,同时根据配对场景调整供需值(英文节点供给为1,法文节点需求为-1):

param: b:=
          e1 1
          e2 1
          e3 1
          f1 -1
          f2 -1
          f3 -1;

2. 模型语法错误

flow_balance约束行末尾多了一个无效字符A,会导致解析失败,需删除:

subject to flow_balance {i in NODES}:
sum{j in NODES: (i,j) in ARCS} x[i,j] - sum{j in NODES: (j,i) in ARCS} 
x[j,i] = b[i];

3. 目标函数矛盾

代码中写maximize cost但注释标注“最小化费用”,若为最小费用流需求,需改为:

minimize cost: sum{(i,j) in ARCS} c[i,j] * x[i,j];  #objective: minimize arc flow cost

4. 输出格式错误

节点名称是字符串类型,但printf用了整数格式符%d,会导致输出异常,需改为字符串格式符%s:

printf "English Child %s and French Child %s with compatibility score %d \n", i, j, c[i,j];

内容的提问来源于stack exchange,提问作者Sagar Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:56:21