Foren » 30. BwInf

Lösungen Aufgabe 1

    • 9 Beiträge
    17. April 2012 18:13:08 CEST

    Hi,

     

    ich würde gerne eine Lösungsdiskussion über Aufgabe 1 anstoßen.

    Also ich habe folgendes herausgefunden:

    Bei der Aufgabenstellung handelt es sich um ein Problem aus der kantenorientierten Tourenplanung, das man auch als "Capacitated Arc Routing Problem" (CARP) kennt (die Aufgabenstellung weicht von der Urform dieses Problems geringfügig ab).

    Das CARP ist NP- vollständig (vgl. Lenstra und Rinnooy, sogar eine Lösung zu finden, die 1,5 mal besser ist als die optimale Lösung ist NP-vollständig).

     

    Aufgrund der NP-Vollständigkeit habe ich mir eine Heuristik gebastelt.

    Beim ersten Graphen fährt mein Fahrzeug 60km, beim 2. Graphen insgesamt 80km.

     

    Greets

    Programmer


    Dieser Beitrag wurde am 17. April 2012 18:14:51 CEST von JanG bearbeitet
    • 10 Beiträge
    17. April 2012 18:52:56 CEST
    Also ich hab mir ein Graph aufgebaut und hab mein Fahrzeug über Vektoren navigiert. Ein Wegstrecke vom Depot und wieder zurück berechne ich so, dass Ned, wenn er alles verstreut hat, möglichst nah wieder bei Depot ist, um neues Salz zu holen.Das ist mal grob wie der Algorhitmus von mir funktioniert, hab natürlich auch ein paar Sachen noch eingebaut, aber dass wäre zu lang um zu erläutern.

    Ich brauche auch für Beispiel 1: 60 km und für Beispiel 2: 80 km
    • 45 Beiträge
    17. April 2012 19:31:12 CEST
    Der Nachweis der NP-Vollständigkeit ist mir nicht gelungen, aber vermutet habe ich sie auf jeden Fall. Dementsprechend habe ich mich auch für eine Heuristik entschieden und ein Simulated Annealing implementiert. Das Verfahren wurde ja bereits in der Musterlösung für Aufgabe 3 der ersten Runde verwendet. Ebenfalls 60 bzw. 80 Kilometer Wegstrecke auf den beiden Beispielen.
    • 19 Beiträge
    18. April 2012 14:41:54 CEST

    Das Straßennetz stellt bei mir einen Graphen dar. Ganz im Groben:

    Ich hab den Graphen zu einem eulerschen Graphen erweitert, dann eine Eulertour dadurch gelegt und diese Eulertour in kleinere, für Konrad machbare, Routen aufgeteilt.

    Ergebnis: Beispiel1: 60km, Beispiel2: 80km


    Dieser Beitrag wurde am 18. April 2012 14:42:46 CEST von Lucas Elbert bearbeitet
    • 2 Beiträge
    20. April 2012 20:48:12 CEST

    Ich habe das Problem auch als CARP interpretiert und dann mit Ant Colony Optimization gelöst, die 60/80 hatte ich auch raus. Für den ersten Aufgabenteil, bei dem nur irgendeine Tour gefunden werden sollte, habe ich einen einfachen Greedy-Algorithmus geschrieben, der immer die jeweils nächste, ungestreute Kante auswählt.

     

    Mich würde interessieren, wie ihr in euren Programmen die Lösungen repräsentiert habt. Ich blende einmal rechts eine Liste mit den einzelnen Teilrouten ein (also immer einmal vom Depot los bis wieder dort hin), wenn der Benutzer die anklickt wird auf der Karte jeweils farblich hervorgehoben, welche Kanten gestreut, bzw. überquert werden müssen. Falls die Darstellung zu unübersichtlich ist, wird zusätzlich eine Wegbeschreibung im Stil von "[Streuen an] 3 Osten [Streuen aus] 2 Norden ..." ausgegeben.

     

    Mein Quellcode ist hier: https://bitbucket.org/Wey/bwinf30-2_ned/src

    Habt ihr Programme/Quellcode irgendwo hochgeladen?

     

    p. s.:

    >>...sogar eine Lösung zu finden, die 1,5 mal besser ist als die optimale Lösung ist NP-vollständig

    Widerspruch?


    Dieser Beitrag wurde am 20. April 2012 20:55:54 CEST von Felix B. bearbeitet
    • 9 Beiträge
    21. April 2012 09:49:42 CEST
    Felix B. said:

     

     

    p. s.:

    >>...sogar eine Lösung zu finden, die 1,5 mal besser ist als die optimale Lösung ist NP-vollständig

    Widerspruch?

     

    Ja, habe ich im Eifer des Gefechts wohl übersehen. Also ich habe gemeint, dass wenn man das Ziel hat eine Lösung zu finden, deren Kosten (also insgesamt gefahrene Kilometer) 1,5 mal größer sind als die optimale Lösung, ist das immer noch NP-vollständig.

     

    Ich habe das Netzwerk auch als Graphen interpretiert. Ob eine Kante gestreut ist, oder nicht, habe ich durch ein boolsches Array repräsentiert. Die Ausgabe ist also dann beispielsweise:

     

    Streue Kilometer 1,2,3 der Kante 0-4

     

     

    In der Doku habe ich die Ausgaben gekürzt und vereinfacht, da es relativ anstrengend ist, solche Ausgaben durchzulesen.

    • 45 Beiträge
    21. April 2012 13:38:25 CEST
    Was die Ausgabe angeht habe ich jedem Rasterpunkt eine Zahl zugeordnet. Die Ausgabe sieht dann z.B. so aus:

    0->1->2(!)->3->0,
    wobei das Ausrufezeichen bedeutet, dass die Kante von 2 nach 3 gestreut werden soll (und nur diese).

    Paul
    • 19 Beiträge
    21. April 2012 16:22:33 CEST

    Mich würde noch interessieren, ob und wenn ja wie ihr die Aufgabe erweitert habt.

     

    Ich habe

    1. Straßen mit beliebigen (ganzzahligen) Längen (=Salzbedarf) zugelassen

    2. Mehrere Depots zum Nachladen, an beliebigen Stellen im Straßennetz, zugelassen

    3. Straßennetze die nicht dem Raster folgen zugelassen

    • 45 Beiträge
    21. April 2012 17:01:16 CEST
    Als Erweiterung habe ich noch ein Benzinlimit und eine Tankstelle eingebaut. Da es nicht passieren darf, dass Konrad irgendwo ohne Benzin sitzen bleibt, müssen also ein paar weitere Dinge beachtet werden.

    Paul
    • 10 Beiträge
    21. April 2012 19:14:32 CEST
    ich habe als Erweiterung den Kanten eine Geschwindigkeitskomponente zugeordnet (10, 30, 50 und 80 km/h) und dann wie in einem Navigationsgerät den kürzesten, schnellsten und dynamischten Weg errechnet.
    • 9 Beiträge
    22. April 2012 15:25:27 CEST
    Meine Erweiterung besteht darin, dass es immer zwei Straßenseiten (also letztendlich einen gerichteten Graphen) gibt, den man streuen muss.

    Die Länge der Kanten ist bei mir auch variabel (eine natürliche Zahl), genauso wie die Kapazität (was ja eigentlich noch in die "normale Aufgabe" gehört).
    • 2 Beiträge
    22. April 2012 22:31:05 CEST

    Ich habe den Graphen wie Lukas zu einem euler'schen erweitert und dann für einen Eulerzyklus mittels DP die beste Möglichkeit ihn abzufahren ermittelt. Um den Graphen zu einen euler'schen zu erweitern, wollte ich die Summe der hinzugefügten Kanten minimieren, was ein matching-Problem ist. Leider habe ich das nicht mehr geschafft, weswegen ich einen effektiven (vermutlich optimalen) aber verteufelt ineffizienten Algorithmus habe.

     

    Erweiterungen sind, dass man den Startpunkt und die Punkte (es können mehrere sein) an denen man nachladen kann frei wählen darf (der Startpunkt muss kein solcher sein).

    Zudem kann man die Kapazität verändern, falls das eine erweiterung ist.


    Dieser Beitrag wurde am 22. April 2012 22:36:34 CEST von Maximilian J bearbeitet
    • 19 Beiträge
    23. April 2012 17:12:14 CEST
    Maximilian J said:

    Um den Graphen zu einen euler'schen zu erweitern, wollte ich die Summe der hinzugefügten Kanten minimieren, was ein matching-Problem ist. Leider habe ich das nicht mehr geschafft, weswegen ich einen effektiven (vermutlich optimalen) aber verteufelt ineffizienten Algorithmus habe.

    Das ist interessant, ich hatte exakt dasselbe Problem wie du beim Erweitern :D. Habe mich schließlich dazu entschlossen, falls die Anzahl Knoten ungeraden Grads dies zulässt (<18), alle Möglichkeiten auszuprobieren und ansonsten Simulated Annealing verwendet.