Ik heb laatst een algoritme gebruikt voor het oplossen van het Traveling Salesman Problem. Zoals de meesten hier vast wel weten is het de vraag om, gegeven een aantal punten, de kortste route te vinden waarmee je alle punten langsgaat en weer netjes terug komt op de plek waar je begon.
Nu had ik een Python versie gemaakt van het algo dat ik bedacht had, en die werkte iig beter dan brute-forcen. Ik had hier nog wat vragen over en heb toch maar besloten om het aan de mede-tweakers voor te leggen
Eerst mijn redenatie en het algoritme:
Hierover heb ik de volgende vragen:
Nu had ik een Python versie gemaakt van het algo dat ik bedacht had, en die werkte iig beter dan brute-forcen. Ik had hier nog wat vragen over en heb toch maar besloten om het aan de mede-tweakers voor te leggen
Eerst mijn redenatie en het algoritme:
- Stel we hebben een graaf met daarin de onderling verbonden punten [a, b, c, d, e, f], en we beginnen in a.
- Als de optimale route begint met abcd, dan weten we dat altijd geldt: pathLength(abcd) <= pathLength(acbd). (de begin- en eindpunten (a en d hier) zijn immers hetzelfde en de tussenpunten (b en c) zijn ook hetzelfde maar dan in een andere volgorde) Als dat niet zo zou zijn zou de kortste route immers wel met acbd beginnen.
- Als we dit omzetten naar een algorithme krijg je zoiets als: we zijn in een punt p, we hebben een lijst steden todo, en we hebben een afgelegde route path. Stel we nemen sublengte 2, dan rekenen we alle pathLength(pxyz) uit, en vergelijken dit met pathLength(pyxz). Waarbij x, y, z in todo, en x != y != z). Als pxyz korter is dan pyxz, dan kunnen we de mogelijkheid pyxz.... laten vervallen, en hoeven we het algo enkel recursief op pxyz.... aan te roepen (z word dus de nieuwe p, todo word todo - x - y - z, en path word path + x + y + z...
Hierover heb ik de volgende vragen:
- Is dit een bekend algo, en zoja: hoe heet het? Ik heb Google/Wikipedia al ingezet maar kan niet echt iets vinden wat erop lijkt. Kan ook komen door gebrek aan trefwoorden/kennis...
- Ik ga er vanuit dat het werkt, want mijn implementatie gaf dezelfde resultaten als de brute-force-methode. Klopt dit of maak ik toch ergens een denkfout?
- Hoe efficient is dit? Je gooit bij elke stap de helft weg, dus dat is mooi, anderzijds moet je wel alle lengtes van de 'permutaties' uitrekenen (waarbij je wel kunt cachen denk ik). Ik wilde zelf al de complexiteit uitrekenen maar daar kom ik niet ver mee. Bij elke recursieve aanroep is het aantal steden die je nog moet bezoeken met 3 gedaald, en je roept de functie meestal recursief op de helft aan, veel verder kom ik niet

[ Voor 0% gewijzigd door user109731 op 07-05-2007 17:13 . Reden: 'algoritme' is toch zonder h in het nederlands... ]