Une implémentation de l'algorithme Copycat de Douglas Hofstadter. L'algorithme Copycat est expliqué sur Wikipédia, et cette page contient de nombreux liens pour une lecture plus approfondie. Voir aussi Farglexandria.
Cette implémentation est une copie de l'implémentation Java de Scott Boland. Le travail original de traduction Java vers Python a été réalisé par J Alan Brogan (@jalanb sur GitHub). La version Java a une interface graphique similaire au Lisp original ; cette version Python n'a pas de code GUI intégré mais peut être incorporée dans un programme GUI plus grand.
J. Alan Brogan écrit :
Dans les cas où je ne pouvais pas comprendre facilement l'implémentation Java, j'ai pris des idées de l'implémentation LISP, ou directement du livre de Melanie Mitchell "Analogy-Making as Perception".
Pour cloner le dépôt localement, exécutez ces commandes :
$ git clone https://github.com/fargonauts/copycat.git
$ cd copycat/copycat
$ python main.py abc abd ppqqrr --iterations 10
Le script prend trois ou quatre arguments. Les deux premiers sont une paire de chaînes avec quelques modifications, par exemple « abc » et « abd ». La troisième est une chaîne que le script doit essayer de modifier de manière analogue. Le quatrième (qui vaut par défaut "1") est un nombre d'itérations.
Cela pourrait produire un résultat tel que
ppqqss: 6 (avg time 869.0, avg temp 23.4)
ppqqrs: 4 (avg time 439.0, avg temp 37.3)
Le premier nombre indique combien de fois Copycat a choisi cette chaîne comme réponse ; plus haut signifie « plus évident ». Le dernier chiffre indique la température finale moyenne de l'espace de travail ; inférieur signifie « plus élégant ».
Pour installer le module Python et commencer à l'utiliser, exécutez ces commandes :
$ pip install -e git+git://github.com/fargonauts/copycat.git#egg=copycat
$ python
>>> from copycat import Copycat
>>> Copycat().run('abc', 'abd', 'ppqqrr', 10)
{'ppqqrs': {'count': 4, 'avgtime': 439, 'avgtemp': 37.3}, 'ppqqss': {'count': 6, 'avgtime': 869, 'avgtemp': 23.4}}
Le résultat de run
est un dict contenant les mêmes informations que celles imprimées par main.py
ci-dessus.