Ejemplo n.º 1
0
    public void fordFulkerson(bool walkThrough)                                                                                                                                  // eigentlicher Algorithmus, Walkthrough Variable gibt Auskunft darüber, welche Darstellungsart Nutzer angecklickt hat -> Schrittweise oder am Stück
    {
        vorarbeit();                                                                                                                                                             // oben vorbereitet und erläuterte Vorarbeit einmalig ausführen vor Start
        if (run)                                                                                                                                                                 // Test, ob Algorithmus noch ausgeführt werden soll bzw. darf
        {
            actualN        = Cc.getSource();                                                                                                                                     // aktuell betrachteter Knoten ist die gewählte Quelle
            connectedEdges = actualN.getConnectedEdges();                                                                                                                        // mit Quellknoten verbundene Kanten werden ermittelt und zwischengespeichert

            for (int i = 0; i < connectedEdges.Count; i++)                                                                                                                       //iterieren über alle am Knoten anliegenden Kanten
            {
                if (!connectedEdges[i].getVisited() && !connectedEdges[i].getEnd().Equals(actualN.getName()) && connectedEdges [i].getFlow() < connectedEdges [i].getCapacity()) // Check ob aktuell betrachtete Kante noch freie Kapazitäten für den Fluss hat, erste passende Kante wird gewählt
                //Blink gewählter passender Edge hier noch implementieren !!! Eigene Methode ???
                {
                    Edge actualEdge = connectedEdges [i];                             // Auswahl erster passender zu betrachtender Edge

                    minimalFlow.Add(actualEdge.getCapacity() - actualEdge.getFlow()); // kleinster Fluss wird als Referenzwert mit der maximalen Kapazität der Quelle initialisiert, CapacityMax = Dicke des Lasers, statische Zahl aus tabelle wird dargestellt

                    if (actualN.getName().Equals(actualEdge.getStart()))
                    {
                        Wayforward.Add(actualEdge);                         // ausgewählte Kante wird dem Wegearray hinzugefügt und sich gemerkt, um später den Weg von Queelle zu Senke rekonstruieren zu können
                        actualEdge.setVisited(true);
                        wentForward.Add(true);
                    }

                    actualN = Cc.GetNodeAsObject(actualEdge.getEnd());                     // zu betrachtender Knoten wird gewechselt auf den Knoten, der am Ende der Edge befindlich ist (Frage bei Rückläufigen Edges???)

                    flowThroughEdge(actualN);
                }
            }
        }
    }
Ejemplo n.º 2
0
    public void DeleteVertex()
    {
        nodes = ccont.GetAllNodes();
        edges = ccont.getAllEdges();
        //Auslesen der im Knoten anliegenden Kanten
        edgeStartList = rowManager.GetEdgeStartList();
        edgeEndList   = rowManager.GetEdgeEndList();
        Debug.Log(gameObject.transform.parent.name);
        Debug.Log(edgeStartList.Count);
        int currentIndex = gameObject.transform.parent.GetSiblingIndex() - 1;

        Debug.Log("Tabel-Index: " + currentIndex);

        //Connected Edges Löschen
        connectedEdges = nodes[currentIndex].getConnectedEdges();
        if (connectedEdges != null)
        {
            foreach (Edge e in connectedEdges)
            {
                Node tempStart = ccont.GetNodeAsObject(e.getStart());
                Node tempEnd   = ccont.GetNodeAsObject(e.getEnd());

                if (tempStart.getName() == nodes[currentIndex].getName())
                {
                    tempEnd.getConnectedEdges().Remove(e);
                }
                else if (tempEnd.getName() == nodes[currentIndex].getName())
                {
                    tempStart.getConnectedEdges().Remove(e);
                }

                Destroy(GameObject.Find(e.getEdgeName()));
                Destroy(GameObject.FindGameObjectWithTag("EdgeContent").transform.Find(e.getEdgeName()).gameObject);
                edges.Remove(e);
            }
        }

        nodes.RemoveAt(currentIndex);
        Debug.Log("Nodes left: ");
        foreach (Node n in nodes)
        {
            connectedEdges = n.getConnectedEdges();
            Debug.Log(n.nodeName + "Connected Edges: ");
            foreach (Edge e in connectedEdges)
            {
                Debug.Log(e.getEdgeName());
            }
        }
        ccont.SetAllNodes(nodes);

        /*
         * for (int i = 0; i < edgeStartList.Count; i++)
         * {
         *  GameObject deleteThis = null;
         *  //Wenn ein Knoten aus der Startliste der Edges mit dem gelöschten Knoten übereinstimmt, wird die Entsprechende Kante gelöscht
         *
         *  //Gameobject, dessen parent dann gelöscht wird
         *  Debug.Log(edgeStartList[i].ToString());
         *  if (gameObject.transform.parent.name.Equals(edgeStartList[i].ToString()) || gameObject.transform.parent.name.Equals(edgeEndList[i].ToString()))
         *  {
         *     deleteThis = GameObject.Find(gameObject.transform.parent.name + "(Edge)").transform.parent.gameObject;
         *  }
         *  Debug.Log("Delete: " + deleteThis.name);
         *  Destroy(deleteThis);
         *
         * }
         */
        /* Löschen der Zeile in der Tabelle */

        //Parent-Objekt initialisieren
        parent = gameObject.transform.parent.gameObject;
        //Parent-Objekt löschen
        Destroy(parent);


        /* Löschen des Knotens oder der Kante */
        objectName = parent.gameObject.transform.Find("VertexName").GetComponent <Text>().text;
        deleteThis = GameObject.Find(objectName);
        Destroy(deleteThis);

        //Knotennummer verringern
        ccont.vertexCount--;
    }