2016-04-13 11 views
1

verwendet Ich habe zwei Klassen MaxFlow und MinMaxFlow.So rufen Sie eine Funktion aus einer anderen Klasse auf, in der die Funktion die lokale Variable

MaxFlow verwendet Graph-Boost ein Diagramm aus einer Netzwerktopologie zu erstellen:

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_ eine lokale Variable unterhält, da wir nur eine Instanz müssen hier die ganze Arbeit zu tun. jede Kante in der Grafik MinMaxFlow Iterierten ein Minimum max Fluss zu finden, wenn es uns nicht gelingt, dass edge (Set-Kapazität 0):

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

Das Problem ist jetzt, maxFlowAlgo basiert auf lokale Variable g_ in Klasse MaxFlow, wenn Ich erstelle ein neues Objekt maxFlowObj in MinMaxFlow, Aufruf maxFlowObj.maxFlowAlgo() wird seine eigenen Daten verwenden, die das Ergebnis unvorhersehbar macht. Also meine Frage ist: wie kann ich die Methode verwenden (wie maxFlowAlgo) gehört zu MaxFlow in der zweiten Klasse MinMaxFlow, wenn die Methode lokale Variablen in MaxFlow verwendet?

Update: Ich habe herausgefunden, das Problem ist von boost::boykov_kolmogorov_max_flow, ich benutze Bundle-Eigenschaften und passen Sie Capacity-Eigenschaft Karte hinein, aber dieser Algorithmus wird nicht nur die Capacity-Eigenschaft Karte, sondern auch meine ursprüngliche Kante Kapazität Variable! Jetzt besteht die Problemumgehung darin, dass ich die Kapazitätswerte speichern muss, bevor ich den Algorithmus ausführe und sie danach wiederherstelle. Es soll nicht die ursprünglichen Mitglieder verändern, oder?

+0

'g_' ist keine lokale Variable, sondern eine Variable * member *. Da ist ein Unterschied. – callyalater

+0

Sie können Ihre Variable 'g_' statisch machen, so dass alle Instanzen Ihrer Klasse sie" teilen ". Dies kann helfen: [Statische Mitglieder] (https://msdn.microsoft.com/en-us/library/79b3xss3.aspx#Anchor_0) –

+0

Verstehen, was lokale Variable, Klassenmitglied und Mitglied der statischen Klasse ist. Wenn Sie 'g_' einfach 'static' machen, wird Ihr Code nicht sofort korrekt. Warum gibt 'maxFlowAlgo' nach mehreren Durchläufen einen falschen Wert zurück? Ich nehme an, es sollte "const" sein. Sie verwenden keine 'edge' Variable innerhalb Ihrer Schleife. Vielleicht soll diese Kante zu Beginn der Iteration gelöscht und am Ende hinzugefügt werden? –

Antwort

0

Es scheint, Sie haben eine XY Problem gefragt.

Wenn Sie möchten maintains a local variable g_ since we only need one instance, sollten Sie Singleton Design Pattern verwenden, andere als Erstellen von Instanz, wenn Sie es brauchen.

1

In diesem Fall ist es in Ordnung, dass Kantenkapazitäten geändert werden.

Manchmal ändern Algorithmen Eingabedaten nicht. Auf der anderen Seite ist es besser, vorhandene Daten zu ändern, um Ressourcen (Speicher) zu sparen, und weil geänderte Daten sinnvoll sein können. Nachdem der Max-Flow-Algorithmus ausgeführt wurde, sind die Edge-Kapazitäten Restkapazitäten; mit anderen Worten, wie viel Kapazität in jeder Kante verbleibt, wenn der Graph durch den Fluss gesättigt ist. Mindestens eine der Kanten hat eine Restkapazität von Null; Wenn nach der Ausführung des zweiten Algorithmus die Null ausgegeben wird, weil der Graph gesättigt ist.

Wenn Sie den Max-Flow-Algorithmus mehrmals ausführen möchten, müssen Sie den ursprünglichen Graphen beibehalten und ihn jedes Mal kopieren, wenn Sie den Algorithmus ausführen. Jedes Mal am Anfang der Schleife Iteration müssen Sie Ihren Graphen rekonstruieren oder ihn von konserviert kopieren.

Da Sie den Algorithmus mehrmals ausführen, möchten Sie ihn wahrscheinlich in verschiedenen Diagrammen ausführen. Wahrscheinlich möchten Sie ein Diagramm kopieren und die Kantenkapazität auf Null setzen.

+0

Ja. Ich habe das Problem gelöst, indem ich ein Standard-Basisdiagramm erstellt habe. Ändern Sie es, führen Sie den maxflow-Algorithmus aus, stellen Sie ihn wieder her, und wiederholen Sie diese drei Schritte für jede Kantengruppe. Es läuft jetzt perfekt. Nochmals vielen Dank für Ihre Einsichten. –