An implementation of Douglas Hofstadter's Copycat algorithm. The Copycat algorithm is explained on Wikipedia, and that page has many links for deeper reading. See also Farglexandria.
This implementation is a copycat of Scott Boland's Java implementation. The original Java-to-Python translation work was done by J Alan Brogan (@jalanb on GitHub). The Java version has a GUI similar to the original Lisp; this Python version has no GUI code built in but can be incorporated into a larger GUI program.
J. Alan Brogan writes:
In cases where I could not grok the Java implementation easily, I took ideas from the LISP implementation, or directly from Melanie Mitchell's book "Analogy-Making as Perception".
To clone the repo locally, run these commands:
$ git clone https://github.com/fargonauts/copycat.git
$ cd copycat/copycat
$ python main.py abc abd ppqqrr --iterations 10
The script takes three or four arguments. The first two are a pair of strings with some change, for example "abc" and "abd". The third is a string which the script should try to change analogously. The fourth (which defaults to "1") is a number of iterations.
This might produce output such as
ppqqss: 6 (avg time 869.0, avg temp 23.4)
ppqqrs: 4 (avg time 439.0, avg temp 37.3)
The first number indicates how many times Copycat chose that string as its answer; higher means "more obvious". The last number indicates the average final temperature of the workspace; lower means "more elegant".
To install the Python module and get started with it, run these commands:
$ 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}}
The result of run
is a dict containing the same information as was printed by main.py
above.