J'essaie de faire une recherche en profondeur Python mais ça ne marche pas.Depth-Première recherche en Python
Fondamentalement, nous avons une carte de solitaire cheville:
[1,1,1,1,1,0,1,1,1,1]
1 Représentons une cheville, et 0 est un endroit ouvert. Vous devez déplacer une cheville une à la fois DEUX FENTES vers l'arrière ou vers l'avant UNIQUEMENT vers un endroit vide. Si vous sautez sur une autre cheville dans le processus, il devient un emplacement vide. Vous faites cela jusqu'à ce qu'une cheville reste. Donc, en gros, un jeu va comme:
[1, 1, 1, 1, 1, 0, 1, 1, 1, 1]
[1, 1, 1, 0, 0, 1, 1, 1, 1, 1]
[1, 0, 0, 1, 0, 1, 1, 1, 1, 1]
[1, 0, 0, 1, 1, 0, 0, 1, 1, 1]
[1, 0, 0, 0, 0, 1, 0, 1, 1, 1]
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1]
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1] #etc until only 1 peg left
Voici ce que j'ai:
class MiniPeg():
def start(self):
''' returns the starting board '''
board = [1,1,1,1,1,0,1,1,1,1]
return board
def goal(self, node):
pegs = 0
for pos in node:
if pos == 1:
pegs += 1
return (pegs == 1) # returns True if there is only 1 peg
def succ(self, node):
pos = 0
for peg in node:
if peg == 1:
if pos < (len(node) - 2): # try to go forward
if node[pos+2] == 0 and node[pos+1] == 1:
return create_new_node(node, pos, pos+2)
if pos > 2: # try to go backwards
if node[pos-2] == 0 and node[pos-1] == 1:
return create_new_node(node, pos, pos-2)
pos += 1
def create_new_node(node, fr, to):
node[fr] = 0
node[to] = 1
if fr > to:
node[fr-1] = 0
else:
node[fr+1] = 0
return node
if __name__ == "__main__":
s = MiniPeg()
b = s.start()
while not s.goal(b):
print b
b = s.succ(b)
Donc, maintenant mes questions:
- Est-ce la bonne façon de faire de profondeur d'abord chercher ceci?
- Mon algorithme ne fonctionne pas !!! Ça reste coincé. J'ai lutté sur cela pendant des jours avant de demander ici alors s'il vous plaît aider.
- On dirait que je ne suis pas en train de suivre DRY, des suggestions?
- omg m'aider?
Ça a l'air bien. Mais alors vous n'êtes plus qu'à un pas d'un algorithme A * qui convergerait plus vite. Tout ce dont vous avez besoin est une heuristique sur la "distance à gauche" (c'est-à-dire le nombre de coups) pour atteindre le but. On dirait que cette heuristique pourrait simplement être le nombre de broches à retourner. – BenG
Ne devrait-on pas ajouter 'p' à' seenpositions' après avoir ajouté les successeurs de 'p' à' currentpositions'? –
@ jellybean, oui, j'avais en effet oublié de mettre à jour 'seenpositions': tx pour le spotting - l'édition maintenant à corriger. –