2016-04-13 14 views
1

私は2つのクラスMaxFlowMinMaxFlowを持っています。関数がローカル変数を使用する別のクラスから関数を呼び出す方法

MaxFlowは、ネットワークトポロジからグラフを作成するために、ブーストグラフを使用しています。私たちはここでしかすべての作業を行うために、1つのインスタンスを必要とするので、

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() 
} 

MaxFlowは、ローカル変数g_を維持します。 maxFlowAlgoは、クラスMaxFlow、ローカル変数g_に基づいており、

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; 
    } 
} 

今問題がある:私たちはedge(0に設定容量)がいることを失敗した場合 MinMaxFlow反復し、グラフ内のすべてのエッジが最小、最大の流れを検索します新しいオブジェクトmaxFlowObjMinMaxFlowに作成し、maxFlowObj.maxFlowAlgo()を呼び出すと、独自のデータが使用され、結果が予測できなくなります。 私の質問は次のとおりです。メソッドがローカル変数MaxFlowを使用する場合、のようなメソッド(maxFlowAlgoのような)を第2クラスのMinMaxFlowに含めるにはどうすればいいですか?

更新:問題はboost::boykov_kolmogorov_max_flowです。バンドルプロパティを使用して容量プロパティマップを渡しますが、このアルゴリズムは容量プロパティマップを変更するだけでなく、オリジナルのエッジ容量の変数も変更します。これを回避するには、アルゴリズムを実行する前に容量の値を格納し、それを復元する必要があります。元のメンバーを変更する予定はありません。

+0

'g_'はローカル変数ではなく、* member *変数です。違いがあります。 – callyalater

+0

'g_'変数を静的にして、クラスのすべてのインスタンスがそれを"共有 "するようにすることができます。これは役立ちます:[静的メンバー](https://msdn.microsoft.com/en-us/library/79b3xss3.aspx#Anchor_0) –

+0

ローカル変数、クラスメンバー、および静的クラスメンバーとは何かを理解してください。 'g_'を単に' static'にすることはすぐにあなたのコードを正しいものにしません。 'maxFlowAlgo'が何回も実行した後に不正な値を返すのはなぜですか?私はそれが 'const'であるべきだと思います。ループ内で 'edge'変数を使用しません。たぶん、このエッジは、反復の始めに削除され、最後に追加されることを意図していますか? –

答えて

0

XY Problemと尋ねられたようです。

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

1

この場合、エッジの容量が変更されても問題ありません。

アルゴリズムによっては入力データが変更されないことがあります。一方、既存のデータを変更してリソース(メモリ)を節約し、変更されたデータが意味を成すことができるため、より良いことです。最大流量アルゴリズムが実行された後、エッジ容量は残容量である。つまり、グラフがフローによって飽和しているときに、各エッジにどれだけの容量が残っているかを示します。エッジの少なくとも1つは残存容量がゼロになります。 2番目のアルゴリズムの実行後、グラフが飽和しているのでゼロを返します。

max flowアルゴリズムを複数回実行する場合は、アルゴリズムを実行するたびに初期グラフを保存してコピーする必要があります。ループ反復の開始時に毎回、グラフを再構成するか、または保存してからグラフをコピーする必要があります。

アルゴリズムを複数回実行するので、異なるグラフで実行することをお勧めします。グラフをコピーして、エッジ容量をゼロに設定したいと思うかもしれません。

+0

はい。私はデフォルトのベースグラフを作成することで問題を解決しました。それを修正し、maxflowアルゴリズムを実行して復元し、各エッジグループに対してこれらの3つのステップを繰り返します。それは今完璧に実行されます。あなたの洞察をもう一度ありがとう。 –