This is the README for fungp, the genetic programming library I am working on as a student at CSUS.
If you're reading this as HTML, it was automatically generated from the README.md file in the root of the source repository.
There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
--- Paraphrased from Phil Karlton
fungp is a genetic programming library implemented in the Clojure programming language. It's pronounced fun-gee-pee, for functional genetic programming (or "genetic programming is fun").
A far more detailed explanation can be found in the core.clj source code. It is thoroughly documented. An
HTML document generated from the source is in the docs/
folder, and is available hosted on my school's
web server here. It's a good place to start and it includes a
getting started tutoral (the source of which is of course available under src/fungp).
You'll need Clojure first, but that's easy. You can be up and running in seconds if you already have Java installed.
First you install Leiningen. This is how you'd do that in a Unix-like system.
mkdir ~/bin
wget https://raw.github.com/technomancy/leiningen/preview/bin/lein
mv lein ~/bin
chmod 755 ~/bin/lein
lein repl
This assumes ~/bin
is on your $PATH
. The lein executable could go anywhere as long as it's on your path, but I'd recommend you put it somewhere in your user's home directory. Use echo $PATH
to see what directories are on your path, or read this article to learn how to edit Unix environment variables.
Because you don't need root/sudo access to do this, it works fine on limited user accounts. To my friends at CSUS, that means it runs fine on Athena.
Once you have Clojure and Lein running you can grab fungp:
git clone https://github.com/probabilityZero/fungp.git
cd fungp
You can also list fungp as a dependency in your project.clj
and make lein install it for you:
(defproject testfungp "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:dependencies [[org.clojure/clojure "1.3.0"]
[fungp "0.3.1"]])
Then run lein deps
and lein will download the library.
See the samples for example usage (located in src/fungp/samples). The general idea is to pass in a fitness function, a terminal set, a function set, and other various options, and the algorithm will attempt to evolve code out of the functions and terminals.
To use fungp you'll likely want to take advantage of Clojure's REPL (read-eval-print-loop). Once you have installed lein (see above), you can start the REPL with lein repl
and start using fungp. For more detail on what to do from there, read the documentation (either in the docs/
folder, in the source code, or on the website linked above). You can experiment with the included sampls or run the tutorial code like this:
=> (use 'fungp.tutorial)
nil
=> (test-genetic-program 5 10)
...
=> (use 'fungp.tutorial :reload-all) ;; reload file with changes
If you're starting out with fungp and Clojure, I recommend you start by copying and modifying the tutorial code or one of the samples. If you make a copy, be sure to give it a new name and namespace.
The run-genetic-programming function (the function you call to start the search) accepts the following options keywords:
Some minimal knowledge of Clojure is probably necessary to use this library well. There is an experimental (undocumented and untested) Java API, and a file demonstrating its use, but right now I wouldn't recommend that route. Clojure is a rather nice language, with excellent documentation and many great tutorials (like this one).
Basically, fungp uses a process of evolution (mimicing natural selection in nature) to create and rewrite Clojure code. Again, for a complete explanation look to fungp.core, or read Wikipedia's explanation of Genetic Programming.
Here's a sample output from a symbolic regression problem. Reports are printed to the screen periodically, not every generation.
fungp :: Functional Genetic Programming in Clojure
Mike Vollmer, 2012
Test inputs: (-10 -8 -6 -4 -2 0 2 4 6 8)
Test outputs: (300.0 192.0 108.0 48.0 12.0 0.0 12.0 48.0 108.0 192.0)
(fn
[a]
(let
[]
(-
(+
(- (inc (inc 9.0)) (fungp.util/sdiv (dec a) (* a 0.0)))
(+ (- (fungp.util/abs a) (- a a)) (inc (* a a))))
(dec (* (- (dec a) (inc a)) (+ (+ a 7.0) (* a a)))))))
Error: 10210.0
(fn
[a]
(let
[]
(+
(- (inc (inc 9.0)) (fungp.util/sdiv (dec a) (* a 0.0)))
(+
(+
(inc (fungp.util/abs a))
(+
(+
(- (inc (inc 9.0)) (fungp.util/sdiv (dec a) (* a 0.0)))
(+ (- (fungp.util/abs a) (- a a)) (inc (* a a))))
(fungp.util/abs
(fungp.util/sdiv (fungp.util/abs 8.0) (dec 3.0)))))
(inc (* a a))))))
Error: 6778.0
(fn
[a]
(let
[]
(+
(* a a)
(+ (+ (- (fungp.util/abs a) (- a a)) (inc (* a a))) (inc (* a a))))))
Error: 580.0
(fn [a] (let [] (+ (* a a) (+ (* a a) (inc (* a a))))))
Error: 10.0
Done!
(fn [a] (let [] (+ (* a a) (+ (* a a) (* a a)))))
Error: 0.0
Project created by Mike Vollmer and released under GPL. See the LICENCE file distributed with this code.
Can you improve this documentation?Edit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close