Lade...
 

CX_ACCESS_NODE::FindRouteWithMsg

CX_ACCESS_NODE::FindRouteWithMsg

Beschreibung:

FindRouteWithMsg findet sämtliche CX_ACCESS_NODE-Objekte in Reihenfolge ihrer Distanz zum Startobjekt. CX_ACCESS_NODE-Objekte sind über CX_ACCESS_WAY-Objekte miteinander verknüpft.
Die Distanz zwischen zwei CX_ACCESS_NODE-Objekten wird allein durch die Kosten des Weges bestimmt (CX_ACCESS:WAY::edgeWeight), hat also keinen Bezug zu einer geometrischen Anordnung.

Die Methode besteht aus zwei Phasen, der Berechnungsphase und der Ausgabephase, welche nacheinander durchlaufen werden.

In der Berechnungsphase wird die Message zur Wegkostenberechnung für jedes CX_ACCESS_WAY-Objekt aufgerufen. Das CX_ACCESS_WAY-Objekt befindet sich bei Message-Aufruf auf dem Stack. Als Rückgabewert der Message werden die Wegkosten erwartet. Ist diese Message nicht definiert (NULL), so werden die im CX_ACCESS_WAY vorhandene Wegkosten für die Berechnung verwendet.

In der Ausgabephase wird die Message für Knotenevaluierung pro CX_ACCESS_NODE-Objekt aufgerufen. Übergeben wird ein transientes BOOL-Objekt und der aktuelle CX_ACCESS_NODE. Durch das Setzen des Bool-Objektes auf TRUE kann die Ausgabe weiterer Objekte gestoppt werden, bei FALSE wird weitergesucht.

Performance: Falls die Steuerung durch InstantView® nicht notwendig ist (der Zielknoten ist bekannt, der Graph enthält alle Information über die Wege-Kosten) soll CX_ACCESS_NODE::FindRouteToObject benutzt werden!

Vollständigkeit des Wege Graphs: Mit dieser Methode kann man überprüfen, ob der konstruierte Graph das reale Modell vollständig abbildet (siehe Code Beispiel 3).

Messages:

Knotenevaluierung (Pflichtparameter)

Top CX_BOOLEAN als Rückgabewert:
FALSE - weitersuchen, TRUE - Ziel gefunden = fertig
Top-1 CX_ACCESS_NODE - der aktuelle Knoten

Wegkostenberechnung (optional, darf 0 sein)

Top CX_NUMERIC als Rückgabewert (ist mit 0 initialisiert)
die Kosten müssen gesetzt werden (kein Automatismus für die Übernahme aus CX_ACCESS_WAY::edgeWeight),
Top-1 CX_ACCESS_WAY das Wegstück von CX_ACCESS_NODE nach CX_ACCESS_WAY::accessNode
Top-2 CX_ACCES_NODE

 

Code-Beispiel:
Var(origin, node, returnCode, way, weight, totalWeight) Msg(EVALUATE_NODE, ASSIGN_WEIGHT) // Construct the graph . . . -> origin // starting point CreateTransObject(CX_INTEGER) -> totalWeight /* * Example 1 - using CX_ACCESS_NODE::edgeWeight */ (EVALUATE_NODE) 0 totalWeight origin Call(FindRouteWithMsg) FillObox(win, route) // display the optimal way totalWeight PutValue(win, totalWeight) // display the total costs for this way EVALUATE_NODE: -> returnCode // this is a CX_BOOLEAN -> node // the CX_ACCESS_NODE just visited // did we reach our goal? if so, set the CX_BOOLEAN to TRUE (meaning we're done) "goal" node Copy(uniqueID) = returnCode Put /* * Example 2 - assign weight with InstantView */ (EVALUATE_NODE) (ASSIGN_WEIGHT) NULL origin Call(FindRouteWithMsg) FillObox(win, route) // display the optimal way ASSIGN_WEIGHT: -> weight // a CX_NUMERIC (initialized zero) where we have to return the weight -> way // a CX_ACCESS_WAY = current edge -> node // a CX_ACCESS_NODE = current node way Copy(edgeWeight) weight Put // to use the weight from CX_ACCESS_WAY set it explicitly // as an example: use double weight for ways from X to Y node Copy(uniqueID) "X" = if { way Copy(accessNode.uniqueID) "Y" = if { weight *= } } Window(win, ....) { ObjectListView(route, AUTO_POSITION, ... ) [ INITIALIZE: [ "CX_ACCESS_WAY::accessNode.uniqueID" HEADER T("next node") ] SetFormat [ "CX_ACCESS_WAY::edgeWeight" HEADER T("weight") ] SetFormat ] String(totalWeight, ...) } /* * Example 3 - simple graph check by counting connections */ Var(nodes, node, count, returnCode) Msg(EVALUATE_NODE) Define(ConnectionCount) 0 -> count -> node (EVALUATE_NODE) 0 NULL node Call(FindRouteWithMsg) count; EVALUATE_NODE: -> returnCode Drop FALSE returnCode Put // do not stop = visit all CX_ACCESS_WAYs Incr(count) // count reachable nodes [] -> nodes // Construct the graph and insert all nodes into vector nodes . . . nodes iterate { FillObox(win, connections) } Window(win, ....) { ObjectListView(connections, AUTO_POSITION, ... ) [ INITIALIZE: [ "CX_ACCESS_NODE::uniqueID" HEADER T("node") ] SetFormat [ "CX_ACCESS_NODE::call(ConnectionCount)" HEADER T("count") ] SetFormat ] }

 

Stack

Stack Position Objekttyp Kurzbeschreibung
Stack(In) Top CX_ACCESS_NODE Startobjekt der Suche
  Top-1 CX_INTEGER / CX_NUMERIC / CX_VALUE oder NULL optional: Summe der Wegekosten für den gefundenen Weg
  Top-2 INTEGER Message zur Wegkostenberechnung (optional = darf Null sein)
  Top-3 INTEGER Message zur Knotenevaluierung (Pflichtparameter)
Stack(Out) Top VECTORject> der gefundene Weg als Vektor von CX_ACCESS_WAY-Objekten. Der Vektor ist leer, wenn bei der Knotenevaluierung immer FALSE zurückgegeben wurde, d.h. wenn das gesuchte Zielobjekt nie gefunden wurde oder man sich nur die Anzahl aller möglichen Ziele hat ausgeben lassen wollen (siehe Code Beispiel 3).
Funktionsaufruf: Call(FindRoute)