Hintergrund
Ich habe kürzlich das PC-Spiel "Darkest Dungeon" gespielt. Im Spiel müssen Sie Dungeons erkunden, die aus verbundenen Räumen bestehen (siehe Abbildung unten).
Hier sind die Regeln:
- Sie beginnen in einem festen Raum (Eingang). Sie können nicht auswählen, wo Sie beginnen möchten.
- Ziel ist es , jeden Raum mindestens einmal zu besuchen
- Der Abstand zwischen benachbarten Räumen ist für alle Räume gleich.
- Sie können Zimmer und Gehwege so oft besuchen, wie Sie möchten
Frage
Was ist der kürzeste Weg vom Eingang, der jeden Raum mindestens einmal besucht?
Unterfragen:
- Welche Algorithmen könnten verwendet werden, um dieses Problem zu lösen?
- Gibt es Implementierungen, die für jemanden wie mich kostenlos (und ziemlich einfach) zu verwenden sind?
Was ich versucht habe
Ich habe andere Fragen wie diese oder jene gefunden, ohne eine Antwort zu finden. Ich bin mit dem (grundlegenden) TSP vertraut und kann einfache TSPs codieren und lösen. Hamilton-Pfade haben mein Problem nicht gelöst, da mehrere Besuche nicht möglich sind. Das chinesische Postbotenproblem gilt auch hier nicht in seiner Grundform, da ich nicht jeden Rand besuchen muss.
Aktualisieren
Wie ich in den Kommentaren festgestellt habe, bin ich kein Informatiker und nicht daran interessiert, mathematische Aussagen zu beweisen (vielleicht werde ich diese Frage zu einem späteren Zeitpunkt über Stackoverflow stellen). Außerdem bin ich kein Programmierer und die Chancen, dass ich selbst eine Lösung codieren kann, sind ziemlich gering. Aber ich vermute, ich bin nicht der erste, der sich mit einem Problem dieser Art befasst.
Laut @Shreesh und @Dib könnte das folgende Verfahren angewendet werden:
- Erstellen Sie eine paarweise Abstandsmatrix mit allen Räumen und fügen Sie so Kanten zwischen allen Räumen hinzu.
- Lösen Sie TSP mit einem Standardlöser (z. B. concorde).
- Besuchen Sie ab dem Eingang alle Räume entsprechend der Lösung. Ersetzen Sie nicht benachbarte Räume durch den kürzesten Abstand zwischen diesen Räumen.
Wird dieses Verfahren die Antwort auf das Problem liefern?