2009-10-11 5 views
2

je regardais le problème de la visite des chevaliers et a décidé de se lancer à sa mise en œuvre en python utilisant un réseau de neurones pour trouver des solutions.Knight tour en utilisant un réseau de neurones

L'explication générale de la méthode peut être trouvée sur Wikipedia

Bien que je pense que je l'ai mis en œuvre correctement (je ne vois rien d'autre qui ne va pas), cela ne fonctionne pas, il met à jour quelques liens, en supprimant les bords où le sommet de connexion a un degré de plus de deux, mais il ne converge pas sur la solution.

Je me demandais si quelqu'un avait des idées sur ce que j'ai mis en œuvre de façon incorrecte (Désolé sur le code horribles).

EDIT
Code de travail se trouve à Yacoby.net

+0

pourrait vous envoyer votre solution finale? pourrait être utile pour d'autres – daddz

+0

Alors que ma solution actuelle fonctionne bien, je veux ajouter une détection de motif avant de la poster. – Yacoby

+0

Ajouté la solution de travail – Yacoby

Répondre

3

Vous ne pouvez pas mettre à jour les neurones en place. Comme U [t + 1] dépend de U [t] et V [t], si vous avez déjà mis à jour V, le calcul de U sera faux

Je pense que vous devriez diviser la mise à jour en deux phases update_state et update_output , de sorte que tous les U sont mis à jour et tous les V

for n in neurons: 
     n.update_state() 
    for n in neurons: 
     n.update_output() 
+0

Je ne peux pas croire comment j'ai pu manquer quelque chose d'aussi évident. La réponse a été acceptée pour l'explication légèrement meilleure. – Yacoby

2

La première impression est que vous avez seulement un tampon pour le conseil d'administration. Je me base sur le fait que je ne vois pas d'échanges de tampons entre les itérations - je n'ai pas regardé cela de près et je peux facilement me tromper.

Si vous modifiez un seul tampon en place, quand vous faites le voisin compte, vous basez sur une planche en partie modifiée - et non le conseil que vous aviez au début.

0

Après avoir examiné votre code, je pense que votre explication de la formule que vous avez utilisé peut être incorrect. Vous dites que lors de la mise à jour de l'état, vous ajoutez quatre plutôt que deux et soustrayez la sortie du neurone lui-même. Il me semble que vous soustrayez deux fois la sortie du neurone lui-même. Votre code qui trouve des voisins ne semble pas faire la distinction entre les voisins du neurone et le neurone lui-même, et vous exécutez ce code deux fois, une fois pour chaque sommet.

Tests sur mon propre code semblent confirmer. Les taux de convergence s'améliorent considérablement lorsque je soustrais la sortie du neurone deux fois plutôt qu'une fois.

Questions connexes