Hallo allemaal,
ik ben bezig met een programma waarmee sokoban puzzels opgelost kunnen worden. Dit wil ik gaan doen met een backtrack algoritme. Hopelijk kan ik het probleem duidelijk maken.
Nu heb ik een 2d veld array gemaakt waarin een speelbord uitgedrukt kan worden. Waarin veld een enum is welke de verschillende mogelijkheden van veldtypes kan uitdrukken, bv diamant of leeg.
Om het backtrack algoritme enigzins te optimaliseren wil ik graag testen of een bepaalde toestand van het veld al eerder is voorkomen. In dat geval kan worden gestopt met het uitwerken van de betreffende tak. Het probleem is dat ik niet weet hoe ik dit efficient kan controleren. Een controle is nodig aangezien er anders een oneindige loop wordt veroorzaakt. Immers je gaat verder met een toestand die al eerder is voorgekomen. Deze toestand zal later weer worden gegenereerd...
Ik kan natuurlijk in een vector compleet alle veldtoestanden (nodes) gaan bijhouden en telkens wanneer ik een nieuwe toestand genereer die lijst doorlopen en vergelijken. Dit lijkt mij bijzonder inefficient. Zeker wanneer de velden groot worden.
Is het mogelijk om een soort unieke code te genereren (hash) van elke compleet veld en deze op te slaan? Dan zou het mogelijk moeten zijn om hashes te vergelijken wat een heel stuk sneller kan gaan. In principe is de combinatie van alle velden uitgedrukt in 1 lange rij uniek voor een toestand. Ik zou iets kunnen maken waarmee een zo klein mogelijke _unieke_ hash van deze rij wordt gemaakt en hierop vergelijken. In java zit een hashset welke dit soort functionaliteit biedt.
Is er zoiets ook in c++ of heeft iemand een ander idee?
ik ben bezig met een programma waarmee sokoban puzzels opgelost kunnen worden. Dit wil ik gaan doen met een backtrack algoritme. Hopelijk kan ik het probleem duidelijk maken.
Nu heb ik een 2d veld array gemaakt waarin een speelbord uitgedrukt kan worden. Waarin veld een enum is welke de verschillende mogelijkheden van veldtypes kan uitdrukken, bv diamant of leeg.
Om het backtrack algoritme enigzins te optimaliseren wil ik graag testen of een bepaalde toestand van het veld al eerder is voorkomen. In dat geval kan worden gestopt met het uitwerken van de betreffende tak. Het probleem is dat ik niet weet hoe ik dit efficient kan controleren. Een controle is nodig aangezien er anders een oneindige loop wordt veroorzaakt. Immers je gaat verder met een toestand die al eerder is voorgekomen. Deze toestand zal later weer worden gegenereerd...
Ik kan natuurlijk in een vector compleet alle veldtoestanden (nodes) gaan bijhouden en telkens wanneer ik een nieuwe toestand genereer die lijst doorlopen en vergelijken. Dit lijkt mij bijzonder inefficient. Zeker wanneer de velden groot worden.
Is het mogelijk om een soort unieke code te genereren (hash) van elke compleet veld en deze op te slaan? Dan zou het mogelijk moeten zijn om hashes te vergelijken wat een heel stuk sneller kan gaan. In principe is de combinatie van alle velden uitgedrukt in 1 lange rij uniek voor een toestand. Ik zou iets kunnen maken waarmee een zo klein mogelijke _unieke_ hash van deze rij wordt gemaakt en hierop vergelijken. In java zit een hashset welke dit soort functionaliteit biedt.
Is er zoiets ook in c++ of heeft iemand een ander idee?
[ Voor 7% gewijzigd door xos op 05-03-2005 17:09 ]
----