Math-E-Mad-X schreef: ↑vr 13 sep 2013, 23:12
Ik heb em even heel vluchtig doorgekeken en heb 'de manier' nog niet helemaal begrepen. Maar goed, het lijkt er op dat je bij stap 3 van je algoritme, waar je losse routes aan elkaar koppelt, een soort van nearest neighbor approach toepast op de losse routes. Dit levert helaas niet de kortste route op:
http://en.wikipedia.org/wiki/Nearest_neighbour_algorithm
Weliswaar heeft deze wiki-pagina het over steden die aan elkaar gekoppeld worden, terwijl jij het hebt over routes die aan elkaar gekoppeld worden, maar dat is bijna hetzelfde.
Je kunt je bijvoorbeeld voorstellen dat je een aantal clusters van steden hebt, waarbij de steden binnen elke cluster heel dicht bij elkaar liggen, terwijl de clusters zelf heel ver uit elkaar liggen. De routes die jij in je eerste twee stappen vindt zullen dan elk binnen zo'n cluster liggen, en stap 3 probeert dan de kortste route tussen deze clusters te vinden. In feite pas je dan bovenstaande 'nearest neighbor algorithm' toe, alleen op de clusters in plaats van op individuele steden.
Ik beperk me in mijn uitspraken even puur tot het algoritme uit stap 3:
Het is logisch dat het nearest-neighbor-algortime niet altijd de beste oplossing geeft. Er is daar sowieso al sprake van een verschil tussen een route en een weg, oftewel tussen punten en clusters. Je past je route aan door een weg toe te voegen. En bij wijze van spreke een punt met een cluster te verbinden. Dan wordt het ronduit gokken in welke volgorde je de wegen moet nemen. En waar je moet beginnen.
Wat je dan nog wel zou kunnen proberen is de bestaande route telkens in zn volledigheid aan passen aan het volgende punt, maar dan krijg je dus bij de laatste stap n^n mogelijkheden. (Behalve dan wanneer dit weet te beperken, door bijvoorbeeld gebruik te maken van Dijkstra, maar ik zou nu zo 123 niet weten hoe dan, want je voegt steeds nieuwe wegen toe in plaats van dat je ze slechts aan past. Je zou dus onnodig voor een omweg kunnen kiezen.)
Overigens: door dat toevoegen van nieuwe wegen aan de bestaande route heb je ook eigenlijk pas bij je allerlaatste stap je allereerste informatie over de totale afstand. Das vrij laat. Bij het algoritme zoals hier gepost is die totale afstand juist hetgeen waar het echte rekenwerk feitelijk mee van start gaat. Eigenlijk houdt dat nearest-neigbor-algoritme zon beetje op waar dit algoritme begint.
Wat betreft je bericht:
Bij het algoritme zoals hier gepost verbindt je twee bestaande routes. Maar daar houdt het niet mee op. Het kan (in theorie) best zo zijn dat beide routes bij hun onderlinge verbinding vrijwel in zn geheel opnieuw worden opgebouwd tot een totaal andere route. Je voegt niets toe, en je verbindt dus eigenlijk niet eens twee routes, maar je maakt van 2 kortste gesloten routes 1 kortste gesloten route. En dat is het belangrijke verschil.
Bovendien verbindt je dus niet, zoals bij het nearest neigbor-algoritme, een route met een punt, en dan met het volgende punt, en dan met het volgende punt. Je verbindt een route met een route. En de route die daaruit volgt (of een andere), verbindt je opnieuw met een route. Van punten is nergens sprake. Nu zou je hier normaal geproken net zo goed nog 1/3n^n opties voor nodig hebben, zij het niet dat je nu door het gebruik van Dijkstra dit aantal wel kan beperken. De conclusie lijkt me dan duidelijk.
Vanaf nu weer over het algoritme in zn totaliteit.
Math-E-Mad-X schreef: ↑vr 13 sep 2013, 23:50
Overigens bedenk ik me nu ineens dat er sowieso iets geks aan jouw algoritme is: volgens mij kun je stappen 1 en 2 namelijk gewoon overslaan. Of, beter gezegd: ALS jouw algoritme de kortste route oplevert, dan zal het toepassen van enkel Stap 3 dat ook doen.
Stel we hebben een handelsreizigersprobleem A dat bestaat uit n steden die elk, laten we zeggen, enkele centimeters uit elkaar liggen. Nu kunnen we een nieuw probleem A' creeren door iedere stad te vervangen door twee steden die heel erg dicht bij elkaar liggen (laten we zeggen een micrometer). We hebben dan dus n clusters van elk twee steden. Nu passen we jouw algoritme toe op A'. Na de eerste twee stappen zullen we dan n routes hebben: elke route verbindt de twee steden binnen één cluster. Stap 3 zal dan deze n clusters op de kortst mogelijke manier aan elkaar proberen te koppelen. Maar omdat de afstanden binnen één cluster extreem klein zijn, komt dat feitelijk op precies hetzelfde neer als het vinden van de oplossing voor probleem A.
Oftewel: het toepassen van stappen 1 2 en 3 op A' geeft hetzelfde resultaat als het toepassen van alleen stap 3 op A. En omdat de kortste route van A' praktisch hetzelfde is als de kortste route van A heb je dus feitelijk A opgelost met alleen maar stap 3.
je redenatie kan ik eerlijk gezegd niet helemaal volgen, behalve dat ik wel weet dat je 3 punten met een micrometer zult moeten kiezen anders geldt het sowieso al niet, maar okay. Over je conclusie kan ik alleen maar zeggen dat je dat heel goed gezien hebt. Ongeveer het hele algoritme komt ook in stap 3 terug, met de handelingen die in stap 3 aan bod komen kun je heel het algoritme uitvoeren.
Toch is het de vraag of je de rest dan ook gelijk weg kunt laten. Stap 1 heb je op 1 of andere manier natuurlijk altijd wel nodig, anders heb je geen (laagste) beginsituatie. Stap 2 zou je dan kunnen zien als een omwerking kunnen zien om stap 3 te kunnen uitvoeren.
Maar Wat je dus eigenlijk zegt is:
- je kunt beginnen met lukraak een situatie te kiezen, zolang er maar geldt dat er in elke kolom en elke rij 2 vakjes gevuld zijn.
- vervolgens hoef je dan alleen nog stap 3 uit te voeren.
Sowieso ben ik je erg dankbaar, want door hierover na te denken heb ik nog een schoonheidsfoutje in het algoritme ontdekt*. Maar daarnaast is het de moeite waard om dit beter te bekijken. Misschien is dit wel een hele bruikbare optimalisatie om het maar zo te zeggen. Waar ik dan alleen een beetje tegenaan hik (en eigenlijk ook al eens tegenaan gehikt heb):
Hoe weet je dan wanneer je moet stoppen met stap 3, en dat je echt de allerlaagste optie hebt? Je kiest immers lukraak een beginsituatie, en vervolgens ga je dan een foutje aanbrengen. Wat als bij je begin situatie alle punten al in 1 route liggen? Dan moet je zomaar lukraak een foutje kiezen. Dat kan best, maar wanneer weet je dan dat je hiermee moet ophouden en de kortste route hebt gevonden? En is dat snel genoeg? Stof tot nadenken dus. Het zou goed kunnen dat er een manier is waarop je gelijk hebt.
* Het Dijkstra-algoritme werkt niet met negatieve getallen. Alle afstanden moeten groter zijn dan 0.
TOEVOEGEN:
Wat je dus moet doen voordat je met 'de tabel voor Dijkstra' daadwerkelijk het algoritme van Dijkstra gaat uitvoeren, is de laagste waarde, dus de grootste negatieve waarde uit de tabel voor Dijkstra bepalen, en vervolgens bij alle waarden uit die tabel die negatieve waarde + 1 optellen.
Achteraf moet je dan het aantal hokjes dat bij de bewerking binnen de tabel van dijkstra betrokken is, oftewel het aantal wegen dat je bij wijze van spreken moet nemen, vermenigvuldigen met die negatieve waarde + 1 en de uitkomst aftrekken van de verkregen kortste route uit de tabel van Dijkstra, voordat je hem bij een losse afstand uit de normale tabel gaat optellen of aftrekken bij bijvoorbeeld de manier 3a, 3b of bij de directe weg bij verbinden van de losse routes).
Destruction has an end. Creation doesn't.