Genetic Programming in Clojure
sulami.github.io
sulami.github.io
What's being described here is a kind of sample-based stochastic optimization which, if I were pressed, is most similar to an algorithm known as a "(mu, lambda) evolution strategy". This is in the general subarea of evolutionary computation. Another algorithm in this area, for example, is the Genetic Algorithm.
Genetic Programming (GP) is the application of stochastic optimization techniques to a specific problem: the discovery and optimization of small computer programs or procedures. Because GP is famously associated with candidate solutions in the form of tree structures, it's also applied to non-program optimization as long as the problem involves trees. That's the rough boundary for the community.
The most famous example of a genetic programming system in Clojure is Lee Spector's Clojush (https://github.com/lspector/Clojush).
I’m not sure what terminology change could make things more clear.
I still wonder why GP never got to be as popular as NN's (aka the currently fashionable "deep learning").
Was it just that GP's didn't perform as well? I find that somewhat hard to believe, as Koza's books are chock full of impressive results, and there are hundreds more papers on them.
GP's also have the virtue of ultimately being analyzable and understandable, at least in some cases (I'm not confident enough to say in all cases). That is a feature that NN's seem to lack, and it's becoming a big problem for some critical systems where life, important decisions, and/or ethics are involved.
[1]: https://en.wikipedia.org/wiki/Metaheuristic
[2]: https://en.wikipedia.org/wiki/Tabu_search
[3]: https://link.springer.com/chapter/10.1007/978-3-642-41019-2_...
It shows quite nicely the advantages of dynamic typing and abstractions together with very readable data manipulation code. A great showcase for Clojure's capabilities.
Looking forward to the next part where the author wants to mutate s-expressions.
(I'm aware that all of this has been done before sometime in the 90s with Prolog and CommonLisp mostly)
How to parametrize my problem? Be it mathematical operations, source code or gates, how to separate it in pieces that can be mutated efficiently?
Yes, you will have to fight the GA/GPs and modify your problem definition and utility functions until you get the results that you're looking for.
Sometimes the results are very surprising!