2014-04-12 107 views
1

我试图读取包含AMPL语法(如下所示)中的数据的C++中的.dat文件。请告知是否可以忽略这些集合,并只将所需的参数矩阵读入C++数组中。 例如,我想阅读ORCT,H,T,D,TO,RT,TLCT,P,V,E,NM,A但忽略其他所有内容。截至目前,我可以阅读该文件,但是我无法找到有关阅读代码特定部分的信息。任何帮助表示赞赏。谢谢。从AMPL .dat文件读取C++中的特定数据

 # 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

一般情况下,你不能正确解释的AMPL数据文件,而无需在模型文件看,因为前者是不独立的。至少您需要知道所有集合的维度,包括每个参数的索引集。例如,下面的AMPL数据声明

param P := 1 2 3 4 5 6; 

可以不同,这取决于索引集的P的维度解读。如果维度为1,如param P{{1,3,5}};那么它代表数据P[1] = 2, P[3] = 4, P[5] = 6。如果尺寸是2,如param P{{(1, 2), (4, 5)}};那么它代表数据P[1, 2] = 3, P[4, 5] = 6

也就是说,如果格式设置一致,并且多维参数的每一行都包含键值和单个数据值,则可以读取参数数据。例如,

param ORCT := 
    1 1 0 
    ... 

上述数据语句的第二行表示在该条件下ORCT[1, 1] = 0

顺便说一句,你的文件是AMPL数据和脚本的组合,这使得问题更加复杂。因此,我建议使用AMPL来读取模型和数据,并将其导出为其他格式,例如CVS,它可以是独立的,并可以从C++中轻松读取。

您可以从AMPL download page获得免费的“学生”版AMPL。免费版本限制了它可以处理的变量和约束条件的数量,但在您的情况下无关紧要,因为您只需要读取和写入数据。