Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

MapPoint und Optimize

Rund um MS-MapPoint

Moderator: Moderatoren

Antworten
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

MapPoint und Optimize

Beitrag von Markus Walter » Mo, 17. Dez 2007 19:18

Hi,

hat jemand Erfahrung mit der Optimize()-Methode von MapPoint? Sie funktioniert bei mir zwar offensichtlich, aber es dauert mitunter mehrere Minuten (10-15 Minuten), bis die Methode beendet wird - und das bei 4 Adressen, die nicht sehr weit von einander entfernt sind (Umkreis 10km).

Aufruf:
oMap:activeRoute:wayPoints:Optimize()
nachdem ich mit
oMap:activeRoute:wayPoints:add(oLocation)
meine Wegpunkte gesetzt habe. Danach folgt ein
oMap:activeRoute:calculate()

Ohne das optimize() geht es vernüftig schnell, aber mit dem Optimize ist es eine Katastrophe. Die CPU-Last ist während der ganzen Zeit bei 100%...

Hat jemand eine Idee?

Ist sowohl bei MapPoint 2004 und 2006 so.
Gruß
Markus

Mitglied der XUG Saarland-Pfalz

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7042
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von Tom » Mo, 17. Dez 2007 19:31

Hallo, Markus.

Die Funktionalität entspricht ja der Option "Zwischenstops optimieren" direkt in MapPoint. Ist das dort auch so langsam, wenn Du eine vergleichbare Route eingibst?
Herzlich,
Tom

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7042
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von Tom » Mo, 17. Dez 2007 20:02

Hallo, Markus.

Hab's gerade ausprobiert, funzt bei mir relativ fix und einwandfrei, auch bei einer Tour mit zwanzig Zwischenstops. Die Berechnung ist in etwa so schnell wie die vorige Berechnung der nichtoptimalen Tour. XP mit MapPoint 2006.
Herzlich,
Tom

Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter » Di, 18. Dez 2007 11:02

Hallo Tom,

ich schicke Dir mal eine pm...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz

Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter » Di, 18. Dez 2007 13:57

für alle anderen Mitleser:

Ich habe hier einen Satz bestehend aus Start- und Zieladresse (identisch) und 3 Zwischenstopps. Die Methode :Optimize() (entspricht dem "Zwischenstopps optimieren" in der MapPoint-Oberfläche) braucht für diesen Vorgang fast 4 Minuten.
Kann auch Tom nachvollziehen. Ist auch in der "normalen" MapPoint-Anwendung so (sowohl in 2004 als auch in 2006). Das schränkt die Nutzbarkeit dieser Funktion für mich sehr ein...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 14075
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » Di, 18. Dez 2007 13:58

Hallo Markus,
wieso legst Du Start- und Zieladresse identisch?
Ist das vielleicht die Ursache?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter » Di, 18. Dez 2007 14:08

Hallo Martin,

habe ich auch schon versucht, ändert nichts dran...

Aber es ist bei Tourenplanungen auch sehr wichtig, Start- und Zieladresse identisch setzen zu können. In der Regel fährt ja ein Auslieferungsfahrzeug am Firmensitz los und soll auch wieder dort ankommen...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7042
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von Tom » Di, 18. Dez 2007 14:12

@Markus: Ich habe die Rückgabe des Beispiels nicht mehr im Kopf, aber würde die Optimierung dann nicht Start und Ziel zusammenfassen bzw. direkt aneinanderhängen?
Herzlich,
Tom

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 14075
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Martin Altmann » Di, 18. Dez 2007 14:12

Hallo Markus,
klar - aber wenn es die Software von sich aus macht, gibt es vielleicht Kuddelmuddel... :-)
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter » Di, 18. Dez 2007 14:19

Tom hat geschrieben:@Markus: Ich habe die Rückgabe des Beispiels nicht mehr im Kopf, aber würde die Optimierung dann nicht Start und Ziel zusammenfassen bzw. direkt aneinanderhängen?
Nein, die Funktion heißt ja auch "Zwischen-Stopps optimieren". MapPoint lässt also Start und Ziel gesetzt. Das macht es ja auch richtig. Nur dauert es eben unheimlich lang...

Ich habe jetzt zum Test mal die Zieladresse weggelassen (aber dadurch wird ja der letzte Zwischenstopp zum Ziel und dadurch verändert sich ja absolut die Situation). Dauert aber ähnlich lange...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14211
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » Di, 18. Dez 2007 16:51

Hi,

wie sieht denn die RAM Ausstattung der verschiedenen Rechner aus ?
Muss der eine mit 512 MB auskommen während der andere 2 GB hat ?

Das Swappen ist die Bremse bei allen Programmen die viel Speicher brauchen.
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7042
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Beitrag von Tom » Di, 18. Dez 2007 17:20

Hallo, Hubert.

Ich kann den Verlangsamungseffekt nachstellen, aber manchmal tritt er nicht auf, das ist merkwürdig. Mein Rechner hat xundneunzig GB Speicher, es dürfte also nicht daran liegen.

Bei Touroptimierung mit 3 Zwischenstationen müssen folgende Varianten ausprobiert und gegenübergestellt werden:

1,2,3,4,5
1,2,4,3,5
1,3,2,4,5
1,3,4,2,5
1,4,2,3,5
1,4,3,2,5

Das sind sechs Routenberechnungen, es dürfte also maximal sechs Mal so lange dauern wie bei der einfachen Routenberechnung (Fall 1). Tatsächlich dauert es ungefähr sechzig Mal so lange.
Herzlich,
Tom

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2366
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von Wolfgang Ciriack » Di, 18. Dez 2007 17:55

Hallo Markus,
kann man nicht schon durch ein entsprechendes Festlegen der Parameter von DriverProfile (z.B. PreferredRoads) und mit Waypoints:SegmentPreferences mit dem ersten Route:calculate ein gutes Ergebnis erzielen ?
Ist denn das optimize überhaupt nötig ?
Viele Grüße
Wolfgang

Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter » Di, 18. Dez 2007 20:04

Hi,

@Wolfgang: Das Optimize ist notwendig, da mir MapPoint ja herausfinden soll, in welcher Reihenfolge die 20 Zwischenstopps denn angefahren werden sollen...

@Tom: Es scheint mit der Entfernung zu tun zu haben. Ich habe jetzt verschiedene weitere Tests gemacht. Es liegt nicht an den einzelnen Adressen (habe nacheinander alle einzeln entfernt). Aber je weiter die Strecken werden, um so langsamer wird es (so schaut es jedenfalls aus). Wobei das Raussuchen der Strecke selbst (also von A nach B) ja eigentlich nicht das Problem sein dürfte, denn die eigentliche Routenplanung geht ja relativ schnell.
Der Beispielsatz Adressen, den ich Dir geschickt habe, führt ja zu einer Route von ca. 600km, wenn man den weiter entfernten Punkt weglässt, geht es innerhalb von Sekunden...

Ich vermute hier fast schon einen Algorithmus-Fehler in MapPoint, der mit der Entfernung zu tun hat.

Du hast das den eigentlich notwendigen Algorithmus-Aufwand oben ja in der Theorie schon entwickelt. So sehe ich das auch.

Nun habe ich wohl wirklich ein Problem...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11072
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Beitrag von AUGE_OHR » Sa, 06. Sep 2008 19:03

hi,

welche Version von Mappoint benutzt ihr so ?

kann man bei der 2006 die "Karten" updaten ?
gruss by OHR
Jimmy

Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter » Mo, 08. Sep 2008 11:35

AUGE_OHR hat geschrieben:hi,

welche Version von Mappoint benutzt ihr so ?

kann man bei der 2006 die "Karten" updaten ?
Wir und unsere Anwender haben sowohl die 2004, als auch die 2006 im Einsatz. Kartenupdate könnte mit dem Kartenmaterial aus Autoroute 2007 gehen (zumindest konnte man MapPoint 2004 das Kartenmaterial von Autoroute 2006 unterjubeln).
Gruß
Markus

Mitglied der XUG Saarland-Pfalz

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11072
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: MapPoint und Optimize

Beitrag von AUGE_OHR » Di, 23. Sep 2008 10:37

hi,

Frage : Warum will MP immer "runter" von der Autobahn ?

Beispiel : 237 Treffer Strasse = "A7,"

Code: Alles auswählen


   ::oStart:activate := {|| ::MapBABno(7)   }
   ::MapInit()

METHOD NewForm:MapInit()

   // setzte auf EUR Version
   ::oMap:NewMap( geoMapEurope )
   // anzeigen der Karte
   ::oMap:show()

   ::oMap:ActiveMap:ActiveRoute:DriverProfile:setProperty(;
                             "PreferredRoads",geoRoadToll,1)

RETURN self

METHOD NewForm:MapBABno(nNo)
LOCAL oResult := NIL
LOCAL i,imax
LOCAL aStart  := {}
LOCAL cBAB    := "A"+ALLTRIM(STR(nNo))+","
LOCAL nTime   := SECONDS()

   ::oMap:ActiveMap:ActiveRoute:Clear()

   oResult := ::oMap:ActiveMap:FindAddressResults(cBAB)
   imax := oResult:Count()
   IF imax > 0
      ::oMap:ActiveMap:ActiveRoute:Waypoints:Optimize()
      FOR i := 1 TO iMax
         AADD(aStart,{oResult:Item(i):Name(),i})
      NEXT

      ASort( aStart,,, {|aX,aY| aX[1] < aY[1] } )

      i := 1
      FOR i := 1 TO iMax

         ::oMap:ActiveMap:ActiveRoute:Waypoints:Add(oResult:Item(aStart[i,2]))
         ::oMap:ActiveMap:ActiveRoute:Waypoints:Item(i):SegmentPreferences := geoSegmentPreferred
      NEXT

      CLOSE
      TONE(1000)
   ENDIF

   ::oMap:ActiveMap:ActiveRoute:Calculate()

   TONE(1000)
   TONE(1000)
   TONE(1000)

   MSGBOX( "Zeit "+STR(SECONDS()-nTime)+" Sec." ) // ca. 120 sec.

RETURN self
er setzt also immer die Autobahn Auffahrten, aber nach dem Calculate() sieht man das er immer
die Auf/Abfahrten benutzt ... wo will er hin ...

Wenn ich ihm die Start Adresse vor der Autobahn setzte (letzter Kunde) und das Ende nach
der Autobahn kommt ( Adresse nächster Kunde ) dann nimmt er korrekt die Autobahn und bleibt
auch drauf ?!

welche Object hält die gesamte Route ? ... dann könnte ich mir ja die Elemente raussuchen ...
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11072
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: MapPoint und Optimize

Beitrag von AUGE_OHR » Di, 23. Sep 2008 19:51

hi,

bei dem letzten Source hatte ich wieder "Glück" das die Daten "vorsortiert waren" ...
nun hab ich den Source mal umgestellt und ich "sehe" wie er die PINs "optimiert" bevor er die
anzeigt ?

Code: Alles auswählen

   ::oMap:ActiveMap:ActiveRoute:Clear()
   ::oMap:ActiveMap:ActiveRoute:Waypoints:Optimize()

   oResult := ::oMap:ActiveMap:FindAddressResults(cBAB)
   imax := oResult:Count()
   IF imax > 0
Problem : er hat nach 30 min gerade mal 8 von 37 "optimiert" ... :(

die Frage lautet also "wohin" gehört das "optimize" ?
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11072
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: MapPoint und Optimize

Beitrag von AUGE_OHR » Do, 25. Sep 2008 3:20

hi,

ich hab ihn tatsächlich mal paar Stunden mit dem Optimize() laufen lassen und das Ergebniss :(

"so einfach" geht es nicht ... ok ich habe im alle 237 Waypoints der A7 gegeben aber die
Optimierung macht z.t. "keinen Sinn" ... warum verlässt er die Autobahn ... ???

irgendwann bemerkte ich das die 237 Datensätze "doppelte" enthielt... aber nicht "exakt" gleich ?
wenn ich mir das nun in der "Karte" ansehe liegen die "fast" übereinander, leicht versetzt.

also die "Karte abgefahren" bis ich zu einer BAB Auf/Ab-fahrt kam wo die "Gegenfahrbahn" Seite
keine Anschlussstelle hatte ... ja meistens sind auf beiden Seiten der BAB Auf/Ab-fahrten :)

Damit hat sich auch die doppelte KM Zahl "erklärt" und das hat auch Optimize() nicht "gemerkt" !

Also muss man da "vorher" die Daten "intelligenter" aufbereiten damit es Mappoint "merkt".

Code: Alles auswählen

LOCAL cBAB    := "A"+LTRIM(STR(nNo))+","
LOCAL aBAB := {{"A7Start",;
                "A7"     ,;  // Street
                "Ellund" ,;  // City
                NIL      ,;  // OtherCity
                NIL      ,;  // Region
                "6330"   ,;  // PostalCode
                geoCountryDenmark},;  // Country
               {"A7Ende" ,;
                "A7"     ,;  // Street
                "Nesselwang",;  // City
                NIL      ,;  // OtherCity
                NIL      ,;  // Region
                "87484"  ,;  // PostalCode
                geoCountryGermany}}  // Country
//
// Entrance to Germany
//
oResult := ::oMap:ActiveMap:FindAddressResults(aBAB[1,cStreet    ],;
                                               aBAB[1,cCity      ],;
                                               aBAB[1,cOtherCity ],;
                                               aBAB[1,cRegion    ],;
                                               aBAB[1,cPostalCode],;
                                               aBAB[1,nCountry   ] )
//
// set relative 0.0 Startpoint
//
imax := oResult:Count()
IF imax > 0
   nCounter++
   oMPStart := oResult:Item(1)
   ::oMap:ActiveMap:ActiveRoute:Waypoints:Add(oMPStart)
   ::oMap:ActiveMap:ActiveRoute:Waypoints:Item(nCounter)::SegmentPreferences := geoSegmentPreferred
   //
   // show Location Waypoint in Map
   ::oMap:ActiveMap:Location := oMPStart
   ::oMap:ActiveMap:Location:Goto()
   //
   // 1x1 KM
   ::oMap:ActiveMap:Altitude := 10

ELSE
   MSGBOX("Error Start")
   QUIT
ENDIF
   //
   // now search for "A7,"
   // to get all Highway Ramps (both Side !)
   //
   oResult := ::oMap:ActiveMap:FindAddressResults(cBAB,;
                                 NIL,;
                                 NIL,;
                                 NIL,;
                                 NIL,;
                                 geoCountryGermany  ) // only GERMANY "A7,"

  imax := oResult:Count()
  IF imax > 0
   FOR i := 1 TO iMax
      //
      // oResult:Item(i) -> each Item of oResult
      // i               -> Item Number
      // 0               -> "filled" by KM
      // "X"             -> "N->S" .or. "S->N"
      // 0              -> Route No
      AADD(aStart,{oResult:Item(i),i,0,"X",0})

      nProz := INT(i/iMax*100)
      IF (nProz % 1) == 0
         cProz := LTRIM(STR(nProz))
         ::oDlgMap:oAnzeig:setcaption("Results"+Chr(13)+cProz+" %")
      ENDIF
   NEXT

   ::oDlgMap:oAnzeig:setcaption("ready Results"+Chr(13)+cProz+" %")

   i := 1
   FOR i := 1 TO iMax
      nDistance   := ::oMap:ActiveMap:Distance(oMPStart,aStart[i,1])
      aStart[i,3] := nDistance

      nProz := INT(i/iMax*100)
      IF (nProz % 1) == 0
         cProz := LTRIM(STR(nProz))
         ::oDlgMap:oAnzeig:setcaption("Distance"+Chr(13)+cProz+" %")
      ENDIF

   NEXT

   ASort( aStart,,, {|aX,aY| aX[3] < aY[3] } )
ich hole mir also alle Waypoints in ein Array und sortiere die Daten nach KM relative zu oMPStart
damit läuft ein Optimize() schon ganz anders ab !

Man darf von MP wohl "nicht zuviel" verlangen, zuminderst was das "Routen planer" Modul angeht
... das macht jedes Auto-Navi "besser" ...

was gut geht ist "in the City", also auf "kleinem Raum". Die "City Tour" macht MP gut, ordentlich
und Optimize() geht genügend schnell.

hat man nun "Fern" Strecken so wird es komplizierter und es dauert ...

also wieder mal "nachdenken" wie man das nun in Griff bekommt ... und google´n nach ... was ?

nun kam mir wieder das BAB "Problem" in Sinn ... und wenn ich das erstmal "weglasse" ?
... was ja schnell und ohne Probleme geht ist eine A -> B Strecke ... und man bleibt auf der BAB
... und "City" geht ja schnell ... und dann wieder BAB ...

Ich habe also nun die Daten des Array "aufgeteilt" in "City" und dazwischen BAB

Das ganze funktioniert auch schon ganz gut für die N->S Verbindung mit "Automatik" für die
BAB "dazwischen", denn der "erste" Kunden in der nächsten Stadt ist ja dann der nördlichste
und das wäre bei N->S ja die kürzeste KM Anzahl wenn man die Methode Distance() benutzt.

Ich "weiss" als Mensch natürlich "wer" der nächste Kunde ist und ob der "in der City" oder per
BAB zu erreichen ist und muss hier ggf. "eingreifen" wenn MP "im Kreis" fahren möchte :)

So ausgerüstet lasse ich MP nun jeweils Teile der Tour Optimize(), Calculate() und anzeigen.
Alle Waypoints habe ich ja im Array und die bekommen dann Nummern aus der neuen "City" Tour.

Wenn ich nun so das Array "aufbereitet" habe lasse ich ich MP alle Waypoints einzeichnen
und mache dann nur noch ein Calculate() was auch bei paar hundert Adressen kein Problem
ist. Der "Gegencheck" mit Optimize() läuft noch, aber ich denke "schlauer" wird die Lösung
nicht ... es sei denn er findet eine Abkürzung :badgrin:
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11072
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: MapPoint und Optimize

Beitrag von AUGE_OHR » Do, 25. Sep 2008 8:13

hi,

wenn man Mappoint.exe aufruft und dann Calculate() oder Optimize() dann erscheint doch ein
Progressbar mit Animation.

Weiss jemand ob man per *.OCX da ran kommt ?
gibt es vielleicht einen Callback slot, ausser den tagREADYSTATE ?

was für einen "Sinn" macht RouteAfterCalculate oder RouteAfterOptimize Event ? wenn er "fertig"
ist "merke" ich das doch auch ohne Event, obwohl ich sehe das der auch die 2st. CPU nimmt ?

auch wo wir schon dabei sind : bringt RAM was bei Calculate() oder Optimize() ?
nach dem Start der Xbase++ activeX Application laufen 1+2 CPU wenn er "rechnet", aber RAM
verändert sich gar nicht ?

was viel gebracht hat ist die "virtuelle CD" : Zugriff x 10 und leise :)
gruss by OHR
Jimmy

Antworten