1

AMPL 構文のデータを含む .dat ファイルを C++ で読み込もうとしています (以下を参照)。セットを無視して、必要なパラメーター マトリックスのみを 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 ;
4

1 に答える 1

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)}};data を表しますP[1, 2] = 3, P[4, 5] = 6

ただし、フォーマットが一貫しており、多次元パラメーターの各行にキー値とそれに続く単一のデータ値が含まれている場合は、パラメーター データを読み取ることができます。例えば、

param ORCT :=
  1 1   0
  ...

上記のデータ ステートメントの 2 行目は、ORCT[1, 1] = 0この条件を表しています。

ところで、ファイルは AMPL データとスクリプトの組み合わせであり、問​​題をさらに複雑にしています。そのため、AMPL を使用してモデルとデータの両方を読み取り、CVS などの他の形式にエクスポートすることをお勧めします。CVS は自己完結型で C++ から簡単に読み取ることができます。

AMPL の無料の「学生」バージョンは、AMPL ダウンロード ページから入手できます。無料版では、処理できる変数と制約の数が制限されていますが、データの読み取りと書き込みのみが必要な場合は問題ありません。

于 2014-04-14T14:09:42.753 に答える