我正在尝试在C ++中读取包含AMPL语法数据的.dat文件(如下所示)。请告知是否可以忽略这些集合并只读取所需的参数矩阵到C ++数组中。 例如,我想读ORCT,H,T,D,TO,RT,TLCT,P,V,E,NM,A但忽略其他所有内容。截至目前,我可以阅读该文件,但我找不到有关阅读代码的特定部分的信息。任何帮助表示赞赏。感谢。
# AMPL code in dat file #
set L := 1 2 3 4 5 6 7 8 9 10 11 12;
set O[1] := 1 2 3 4 5 ;
set O[2] := 6 7 8 9 ;
set O[3] := 10 11 12 13 14 ;
set O1[1] := 1 2 3 4 ;
set O1[2] := 6 7 8 ;
set O1[3] := 10 11 12 13 ;
set G := 1 ;
set SP[1] := 1 2 3 4 5 6 7 8 ;
set S[1] := 1 2 3 4 5 6 7 8 9 ;
param: R: Or:=
1 5
2 4
3 5 ;
param ORCT :=
1 1 0
1 2 1.8
1 3 4.7
2 1 4.8
2 2 0
2 3 3.9
3 1 3.2
3 2 2.1
3 3 0
;
param H :=
1 2
2 2
3 1
4 2
5 3
6 3
7 2
8 2
9 2
10 2
11 4
12 3
;
param T :=
1 2915
2 2450
3 2046
4 2622
5 2241
6 2609
7 2199
8 2318
9 2385
10 2739
11 2654
12 2266
;
param D :=
1 8
2 9
3 9
;
param TO :=
1 1 2.4
1 2 3
1 3 2
1 4 2
1 5 1
2 6 2
2 7 1.1
2 8 1.5
2 9 2.3
3 10 2.1
3 11 4.9
3 12 3.4
3 13 1.2
3 14 2.6
;
param RT :=
1 1 1.8
1 2 1.4
1 3 1.7
1 4 1.6
1 5 1.4
2 6 1.2
2 7 1.7
2 8 1.4
2 9 1.2
3 10 2
3 11 1.1
3 12 1.2
3 13 1.2
3 14 1.2
;
param TLCT:= [1,*,1,*]
: 1 2 3 4 5 :=
1 0 3.95 3.84 6.33 3.5
2 5.16 0 2.17 2.33 4.46
3 6.88 4.33 0 4.2 2.26
4 3.28 6.48 2.07 0 6.09
5 2.76 5.43 5.9 3.23 0
[1,*,2,*]
: 6 7 8 9 :=
1 2.94 3.07 6.02 3.46
2 3.22 6 2.14 3.5
3 5.57 3.63 6.07 3
4 2.4 3.29 6.2 2.4
5 6.92 4.7 3.26 3.57
[1,*,3,*]
: 10 11 12 13 14 :=
1 3.9 2.22 5.94 5.22 5.09
2 6.51 2.16 6.33 3.06 4.85
3 3.95 3.62 3.8 5.67 6.25
4 4.58 5.78 6.38 4.55 5.42
5 4.94 2.53 6.37 2.12 5.51
[2,*,1,*]
: 1 2 3 4 5 :=
6 3.48 4.93 3.9 3.71 6.58
7 6.3 5.65 5.49 3.8 2.42
8 5.93 6.27 4.75 3.85 2.88
9 2.66 5.44 2.1 3.4 6.85
[2,*,2,*]
: 6 7 8 9 :=
6 0 3.34 5.65 4.28
7 2.16 0 6.69 6.32
8 2.86 6.44 0 5.26
9 4.58 6.3 2.07 0
[2,*,3,*]
: 10 11 12 13 14 :=
6 3.93 4.39 4.25 5.55 2.04
7 4.91 6.82 6.93 2.95 3.58
8 4.14 4.85 2.44 6.74 5.43
9 5.53 5.04 5.52 3.7 2.76
[3,*,1,*]
: 1 2 3 4 5 :=
10 5.84 2.56 4.75 2.74 6.63
11 6.42 5.31 6.79 6.51 5.8
12 4.78 4.08 5.92 5.72 3.83
13 6.96 2.58 3.92 3.28 3.07
14 3.22 3.47 4.77 3.67 6.51
[3,*,2,*]
: 6 7 8 9 :=
10 3.54 4.85 6.03 6.25
11 3.3 6.73 5.37 5.14
12 6.34 2.4 4.71 6.36
13 3.41 6.83 6.4 5.66
14 3.07 6.93 5.96 3.19
[3,*,3,*]
: 10 11 12 13 14 :=
10 0 5.44 6.96 6.24 2.88
11 3.57 0 2.53 3.81 4.51
12 3.92 4.3 0 6.68 2.24
13 5.56 4.32 4 0 2.93
14 3.86 5.05 6.45 6.56 0
;
param P:= [1,*,*] (tr)
: 1 2 3 4 5 :=
1 0 0 0 0 0
2 0 0 0 0 0
3 1 0 0 0 0
4 0 0 0 0 0
5 0 0 0 1 0
6 0 0 0 0 0
7 0 0 0 0 0
8 0 0 1 0 0
9 0 0 0 0 0
10 0 1 0 0 1
11 0 0 0 0 0
12 0 0 0 0 0
[2,*,*] (tr)
: 6 7 8 9 :=
1 0 0 0 0
2 0 1 0 0
3 0 0 1 1
4 0 0 0 0
5 0 0 0 0
6 0 0 0 0
7 0 0 0 0
8 0 0 0 0
9 0 0 0 0
10 0 0 0 0
11 1 0 0 0
12 0 0 0 0
[3,*,*] (tr)
: 10 11 12 13 14 :=
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
4 0 0 0 1 0
5 0 0 0 0 0
6 0 0 0 0 0
7 0 0 1 0 0
8 0 0 0 0 0
9 1 0 0 0 0
10 0 0 0 0 1
11 0 1 0 0 0
12 0 0 0 0 0
;
let Orf[1] := 1 ;
let Orf[2] := 6 ;
let Orf[3] := 10 ;
let Orl[1] := 5 ;
let Orl[2] := 9 ;
let Orl[3] := 14 ;
let Z[1,1] := 1 ;
let Z[2,1] := 1 ;
let i[1,2] := 1;
let V := 7;
let E := 347;
let NM[1] := 4 ;
let A := 67 ;
答案 0 :(得分:0)
通常,如果不查看模型文件,则无法正确解释AMPL数据文件,因为前者不是自包含的。至少你需要知道所有集合的维度,包括每个参数的索引集。例如,以下AMPL数据语句
param P := 1 2 3 4 5 6;
可以根据P
的索引集的维度进行不同的解释。如果维度为param P{{1,3,5}};
中的1,则表示数据P[1] = 2, P[3] = 4, P[5] = 6
。如果维度为param P{{(1, 2), (4, 5)}};
中的2,那么它代表数据P[1, 2] = 3, P[4, 5] = 6
。
如果格式化是一致的,并且多维参数的每一行包含键值后跟单个数据值,则表示可以读取参数数据。例如,
param ORCT :=
1 1 0
...
在这种情况下,上述数据语句的第二行代表ORCT[1, 1] = 0
。
BTW你的文件是AMPL数据和脚本的组合,这进一步使问题复杂化。因此,我建议使用AMPL读取模型和数据,并将其导出为其他格式,例如: CVS,可以是自包含的,可以从C ++轻松读取。
您可以从AMPL download page获得免费的“学生”版AMPL。免费版本限制了它可以处理的变量和约束的数量,但在您的情况下无关紧要,因为您只需要读取和写入数据。