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
相关产品推荐
相关产品推荐

