1

と の 2 つのクラスがMaxFlowありMinMaxFlowます。

MaxFlowブースト グラフを使用して、ネットワーク トポロジからグラフを作成します。

class MaxFlow {
 public:
  MaxFlow : g_() { createGraph(); } //constructor
  void createGraph();
  void modifyGraph(); // modify the graph to use boost maxflow algorithm
  int maxFlowAlgo(); // use g_ and some other util local variables
 private:
  Graph g_;
  ...   // some other helper containers created during createGraph()
}

MaxFlowg_ここですべての作業を行うために必要なインスタンスは 1 つだけなので 、ローカル変数を維持します。失敗した場合(容量を 0 に設定) MinMaxFlow、最小最大フローを見つけるためにグラフのすべてのエッジを繰り返します。edge

class MinMaxFlow {
 public:
  int getMinMaxFlow() {
    int minMaxFlow = INT_MAX;
    MaxFlow maxFlowObj; // create a new obj
    maxFlowObj.modifyGraph(); // I suppose this modify current obj
    for (auto edge : graph_edges) {
      // maxFlowAlgo will return incorrect value after several runs
      int maxFlowVal = maxFlowObj.maxFlowAlgo();
      int minMaxFlow = std::min(minMaxFlow, maxFlowVal);
    }
    return minMaxFlow;
  }
}

問題は、クラスmaxFlowAlgoのローカル変数に基づいていることです。 で新しいオブジェクトを作成すると、呼び出しで独自のデータが使用されるため、結果が予測できなくなります。だから私の質問は:メソッドがでローカル変数を使用する場合、2番目のクラスに属するメソッド(のような)をどのように使用できますか?g_MaxFlowmaxFlowObjMinMaxFlowmaxFlowObj.maxFlowAlgo()maxFlowAlgoMaxFlowMinMaxFlowMaxFlow

更新: 問題が からのものであることがわかりました。boost::boykov_kolmogorov_max_flowバンドル プロパティを使用して容量プロパティ マップをそれに渡しますが、このアルゴリズムは容量プロパティ マップだけでなく、元のエッジ容量変数も変更します! ここでの回避策は、アルゴリズムを実行する前に容量値を保存し、その後に復元する必要があることです。元のメンバーを変更することは想定されていませんよね?

4

2 に答える 2

0

あなたはXY Problemを尋ねたようです。

必要に応じて、必要に応じてインスタンスを作成する以外に、Singleton Design Patternmaintains a local variable g_ since we only need one instanceを使用する必要があります。

于 2016-04-14T01:02:41.170 に答える