0

グラフ ファイル パーサーを作成する必要があります (グラフは TGFF によって識別子/変数ベースのテキスト ファイルとして生成されます)。

@TASK_GRAPH 0 {
PERIOD 1100

TASK t0_0   TYPE 13 
TASK t0_1   TYPE 3 
TASK t0_2   TYPE 10 
    .
    .

ARC a0_0    FROM t0_0  TO  t0_1 TYPE 9
ARC a0_1    FROM t0_1  TO  t0_2 TYPE 0
ARC a0_2    FROM t0_2  TO  t0_3 TYPE 37
    .
    .
}

#------------------------------------------------------------------------------
# type    exec_time
  0      71.659
  1     59.3856
  2     64.7101

これはivがこれまでに得た限りです(断片化されたコードを気にしないでください...これはivがこれまでに行った方法の単なる例です)

void read(char* graph){
     //open task graph description
     string name;
     string TaskList[300][300];
     ifstream gfile;
     gfile.open (graph);
     if ( !gfile.is_open() ) cout<<"Could not open graph description file\n";
     //start parsing
     while(getline(gfile,inptext)){
        istringstream sstream(inptext);
        int i=0;
        sstream >> name;
        if(name.compare("TASK")==0){
            sstream >> name;i
            //wrte node name to hash index i++
            sstream >> name;
            if (name.compare("TYPE")==0){
                sstream >> name;
                //retrieve node index from hash
                //write node weight to matrix
            }
        }
        if(name.compare("ARC")==0){
           sstream >> name;
           //write edge name to hash index i++
           sstream >> name;
           if (name.compare("FROM")==0){
              sstream >> name;
              //retrieve node index a from hash
           }
            sstream >> name;
            if (name.compare("TO")==0){
              sstream >> name;
              //retrieve node index b from hash
              if (name.compare("TYPE")==0){
                sstream >> name;
                //write edge weight to matrix index a b
              }
            }
         }
        i++;
     }
     //end parsing
     gfile.close();
 }

私はトークンを読んだことがないので、トークンを扱ったことがありません。今私が遭遇した問題はTYPE、ファイルの下部からの値の読み取りサイクルです。それらの識別子は通常の数字であり、検索する識別子にすることはできません。「# type」を探すのが最善の方法だと思いますが、文字列ストリームを使用しているため、対処が少し難しくなります。2番目の問題は、ノードの数が事前に不明であるため、グラフのサイズに合わせて配列マトリックスを初期化できないことです...

するべきか:

  • a) ファイルを 2 回読み取ります。1 回目はノードをカウントするため、もう 1 回は実際にデータを読み取るためです。
  • b)ベクトル/マトリックスタイプを使用します(これまで使用したことがなく、マトリックスクラスを構築する必要があると思います)
  • c) 他のものを使う

私が考えているマトリックスはマトリックス[x] [x]である必要があります。ここで、nはノードの重みで、eはエッジの重みです(エッジは一方向にしか移動しないためミラーリングされていません)これまでのところ、マトリックスにタイプ番号を入力して読み取ることを計画しました後でハッシュまたはベクトルから型を取得し、正しい値に置き換えます

  A B C D E
A n 0 0 0 0
B e n 0 0 0
C e e n 0 0
D e e e n 0
E e e e e n

このファイルをより簡単に読み取って解析する方法を誰かが知っていれば、それは素晴らしいことです。

4

1 に答える 1

1

タスク名を識別子にマッピングする問題、たとえばt0_00 t0_1から 1 へのマッピング、およびノー​​ド名の他の形式の処理に対処するには、タスク名をキー、マトリックス インデックスを値とするハッシュテーブルをお勧めします。

以下の関数は、指定されたタスク名のインデックスを返します。タスク名が初めて一致した場合、新しいインデックスを作成し、それをタスク名に割り当てて返します。

#include <unordered_map>
int tasks = 0;
std::unordered_map<std::string, int> hashNameToIndex;

int nameToIndex(string name){    
  if (hashNameToIndex.find(name) == hashNameToIndex.end()){
     hashNameToIndex[name] = tasks;
     tasks++;
     return tasks-1;
  }else{
     return hashNameToIndex[name];
  }
}
于 2013-05-02T07:30:22.677 に答える