Genetic Algorithm 2D Car Thingy
rednuht.org
rednuht.org
I wonder if the messiness actually matters. I wonder if "optimization by genetic algorithm" would be significantly improved by using a more faithful algorithm.
========
Anyway, here's a previous discussion of this particular toy:
https://news.ycombinator.com/item?id=5942757 (169 comments)
Other submissions:
https://news.ycombinator.com/item?id=10596079
https://news.ycombinator.com/item?id=10134390
https://news.ycombinator.com/item?id=5952145
https://news.ycombinator.com/item?id=2226137
Also, genetic development of walkers:
https://news.ycombinator.com/item?id=8911719 (74 comments)
I bet that thinking about the problem more would allow you to find an algorithm that works better than genetic algorithms all the time.
Just look at travelling salesman problem, or vehicle routing problem. Smart heuristics beat these hybrid-genetic-memetic-algorithms all the time.
http://people.mpi-inf.mpg.de/~doerr/papers/gecco2008_1.pdf
There is also a book on the topic that summarizes some of the current research
This is true. It's been formalized as the No Free Lunch theorem by Wolpert and Macready.
> Genetic algorithms aren't really that brilliant. They are simple, and that's what makes them popular among researchers. There's no formal science behind them.
There is a formal science behind them -- conferences, journals, the whole nine yards. The problem is, there's a dominant notion of genetic algorithms that's 25 years out of date, and nobody's been able (or tried too hard) to break through the noise.
(Disclaimer: I work in the field.)
I'm not sure what that means. Science is empiricism, and genetic algorithms are a wide field of research with a lot of experimentation behind them. There are many hypothesis about how they work, why they work and what their limitations are. These hypothesis are tested through experimentation, just like in other scientific fields.
> Smart heuristics beat these hybrid-genetic-memetic-algorithms all the time.
Sure, this is almost guaranteed by the "no free-lunch theorem": https://en.wikipedia.org/wiki/No_free_lunch_theorem
There might be some exotic cases where genetic algorithms are actually the best solution, but nobody knows that.
But that's not the point of genetic algorithms. The point is having a generic solution that can be applied with some success when you don't have the time or the resources to find those "smart heuristics". And there might be cases where we are just not smart enough to find them. Some of these cases might be related to the effort towards developing generic AI. You can also claim that it is always possible to write a more efficient computer program directly in machine code, if you ignore time and resources.
Another interesting property of evolutionary computation is enabling some form of artificial creativity. Check out this antenna, created by NASA using evolutionary computation:
https://en.wikipedia.org/wiki/Evolved_antenna
Also, if you will forgive me a bit of self promotion, check out my own work on the discovery of complex network generators:
Indeed, the same could be said of any "smart heuristics" too:
> Exact solutions beat these smart heuristics all the time.
;)
Same goes for heuristics being faster than exact solutions for harder problems.
Actually, No Free Lunch guarantees that such cases exist.
Scientific contributions are mostly in operators, I guess. I can't think what else can someone working with genetic algorithms contribute because adding elitism, or 3-way crossover isn't really the solution to a problem, it's just metaheuristics jibber-jabber.
So a lot of the research goes in the direction of finding the "missing ingredients". On the evolutionary computation front, one of the topics I find the most interesting is the genotype-phenotype mapping. Naive genetic algorithms have genotypes that map directly to phenotypes (e.g you are evolving some vector which is a direct solution to a problem). More complex mapping (like what we see in nature) encode a generator for a solution.
On this note, exciting stuff happens on the genetic programming front (where you are evolving computer programs, commonly Lisp-like trees).
It really is a vast field, ranging from direct engineering applications to artificial life simulations aimed at theoretical biology. Like everything else, you have to be familiar with the literature.
I do not like the research. It is bad, it's rarely reproducible, source code is almost never public thus time/convergence measurements are meaningless.
"Dr. Thompson peered inside his perfect offspring to gain insight into its methods, but what he found inside was baffling. The plucky chip was utilizing only thirty-seven of its one hundred logic gates, and most of them were arranged in a curious collection of feedback loops. Five individual logic cells were functionally disconnected from the rest— with no pathways that would allow them to influence the output— yet when the researcher disabled any one of them the chip lost its ability to discriminate the tones. Furthermore, the final program did not work reliably when it was loaded onto other FPGAs of the same type."
Now, I agree with you that, even for a problem as simple as that one (or specially because it's a simple problem, maybe) a "normal" algorithm would perform better. But the fact that the genetic algorithm was able to find the effects of magnetic flux (those five disconnected logic cells) in that specific FPGA is nothing short of brilliant.
The problem I've always seen (not an expert, by any means, but I've played around with them a bit) with genetic algorithms is that they require a weird balance. For simple problems, a normal algorithm will probably work better. As the complexity of the problem increases, the scoring and evaluating rules' complexity increases as well (I've got no hard data, of course, but my feeling is that the complexity of the scoring process increases much faster than the complexity of the problem), making a well thought algorithm a better/easier solution. This, and that any mistake in the scoring process might throw away thousands and thousands of generations.
[0]http://www.damninteresting.com/on-the-origin-of-circuits/
Genetic algorithm thrives when you have a lot of variables that can be optimized to gain a favorable behavior and those optimizations are unknown.
Saying it's not brilliant because it's simple is like saying that binary search or merge sort is not brilliant because they are simple.
On the other hand you have TSP which murdered all those GA algorithms with a proper Lin-Kernighan heuristic implementation.
I'm not sure if we are talking about same problems. > Saying it's not brilliant
I said they were simple and that's why people like them.
Which is why GA/GP matters: It's part of a growing toolbox to allow us to find interesting candidate algorithms for certain classes of problems without spending as much human time to figure out cleaner solutions.
If you wish you can then have humans figure out why the solution works and use that knowledge to come up with something better.
http://github.com/verdverm/pypge
http://www.math.binghamton.edu/dept/ComboSem/worm-chiu.pge_g...
This is not true. If it were true, then the small mutations caused during reproduction of humans (for example) would result in huge changes to the phenotype. Typically, the genotype is fairly robust, for obvious reasons.
OTOH, in genetic algorithms there is usually much less redundancy and neutrality in their genomes, because they are designed to solve problems, rather than simply survive.
My understanding is that most small mutations lead to no apparent change at all, hence the robustness. Some small mutations lead to catastrophic changes, as do almost all large mutations.
But some small mutations lead to noticeable changes in the phenotype, and those are the ones that then get selected against. Some of them are beneficial in the existing circumstances, some are not. But the point is that it's small mutations that lead to a comparatively large change in the phenotype.
And that's my point, which you echo:
> ... in genetic algorithms there is usually
> much less redundancy and neutrality in their
> genomes, because they are designed to solve
> problems, rather than simply survive.
Yes. Current "genetic algorithms" don't actually do anything like the systems they have been inspired by. I wonder if real progress would be better if the implementations were more faithful.In this case it's GA, so your genome directly maps to characteristics. So (let's say) chassis density is N bits. Mutate the MSB of that and the change will be big
GP on the other hand would "build a car". And what usually happens during evolution is that some aspects gain resistance to mutation through some form of redundancy. So instead of Chassis density being a number it might be a crazy math expression that is not affected by small changes.
Also a lot of "genes" have no effect on the final product. But having a bigger genome (in this way) effectively lowers mutation rates.
It is "junk DNA" but actually has a purpose
Are you talking about biology or programming here? Because in case of the former, I think we've already figured out that there's no "junk DNA", and that DNA itself is more complex than just a code listing. There's gene expression, i.e. feedback from environment that selectively enables and disables functionality described in parts of DNA. And we already know that bacteria have useful information encoded on all three window offsets, making DNA re-readable 3 times for different needs.
I'd describe myself as an expert in evolutionary algorithms, yes, and I've worked alongside Biologists for a few years, but I wouldn't describe myself as an expert in Biological evolution.
I don't know if this is just a misunderstanding of semantics, as you seem to have echoed what I said.
> My understanding is that most small mutations lead to no apparent change at all, hence the robustness. Some small mutations lead to catastrophic changes, as do almost all large mutations.
This is correct, but previously you wrote "often" small changes have dramatic consequences, which is incorrect if "often" means "a lot of the time" or "most of the time".
I remember that I ran into this technique independently first (in a context of encoding expression trees) and then found a number of other examples in the literature (e.g., encoding the neural network topology, etc.).
But it's really fun to watch. I'll give it that.
Is there a paper/presentation that embodies the current best practices/thinking that you could recommend? I'm not trying to be lazy, it's just that there is clearly a lot of retro thinking among the top search results on the net, and it's difficult to separate the wheat from the chaff...
* Steady-state: pioneered to the best of my knowledge by Deb's epsilon-MOEA, steady-state algorithms use function evaluations as soon as they are received, rather than waiting for a whole generation to complete. [1]
* Multi-objective: Pareto ranking as dominance relation lets us have multiple objectives [2]. This is good because it gives us a whole bunch of solutions at once and lets us decide which one we want, instead of tweaking objectives and constraints to get an idea of the tradeoffs involved.
* Epsilon resolution: comes from an idea by Laumanns et al. [3]. We can have more objectives if we don't care about differences below a certain threshold. Otherwise the Pareto front explodes in size.
* Restarting: Proposed by Coello-Coello [4] and demonstrated by his micro-GA, restarting helps you get out of local optima.
* Better search operators: Binary crossover doesn't work so well, especially for real-valued decision variables. It took some fancy theoretical footwork involving schema theory and domino convergence to support it. There were a lot of new search operators proposed in the late '90s, the best of which seem to be simulated binary crossover (SBX), and polynomial mutation (PM). [5]
* Alternatively, the Differential Evolution search operator [6] works really well too.
* Better selection operator: tournament selection beats the pants off of the alternatives [7].
Resources:
* Dave Hadka's MOEAFramework [8], which includes open-source multi-objective evolutionary algorithm implementations.
* Dave Hadka's dissertation [9], which describes a (regrettably patented) MOEA that's kind of a greatest-hits of good MOEA ideas.
* Deb's website [10], which includes questionably-licensed algorithm implementations, as well as a number of technical reports.
Links. I'm posting raw bibtex because I'm lazy.
[1] @article{deb_2005_emoea, author = { Deb, K. and Mohan, M. and Mishra, S}, year = {2005}, title = {Evaluating the $\varepsilon$-domination based multiobjective evolutionary algorithm for a quick computation of Pareto-optimal solutions.}, journal = {Evolutionary Computation Journal}, volume= {13}, number = {4}, pages ={501--525} }
[2] @book{goldberg_1989_book, title={Genetic algorithms in search, optimization, and machine learning}, author={Goldberg, D.E.}, year={1989}, publisher={Addison-Wesley Professional} }
[3] @article{laumanns_2002_combining, title={Combining convergence and diversity in evolutionary multiobjective optimization}, author={Laumanns, M. and Thiele, L. and Deb, K. and Zitzler, E.}, journal={Evolutionary computation}, volume={10}, number={3}, pages={263--282}, year={2002}, publisher={MIT Press} }
[4] @inproceedings{coello_2001_uga, author = {Carlos A Coello Coello and Gregorio Toscano Pulido}, title = {Multi-Objective Optimization Using a Micro-Genetic Algorithm}, booktitle = {Proceedings of the Genetic and Evolutionary Computation Conference (GECCO 2001)}, pages = {274--282}, publisher = {Morgan Kaufmann}, address = {San Francisco, CA}, year = {2001} }
[5] @techreport{deb_1994_sbx, author = {Deb, K. and Agrawal, R. B.}, year = 1994, title = {Simulated binary crossover for continuous search space}, number = { Technical Report IITK/ME/SMD-94027}, institution = {Indian Institute of Technology, Kanpur}, address = {Kanpur, UP, India} }
[6] @article{storn_1997_de, author = {Storn, R. and Price, K.}, year = 1997, title = {Differential evolution --- a simple and efficient heuristic for global optimization over continuous spaces}, journal = { Journal of Global Optimization}, volume = 11, number = 4, pages = {341--359} }
[7] @inproceedings{back_1994_selection, title={Selective pressure in evolutionary algorithms: A characterization of selection mechanisms}, author={B{\"a}ck, Thomas}, booktitle={Proceedings of the First IEEE Conference on Evolutionary Computation}, pages={57--62}, year={1994}, organization={IEEE} }
[9] https://etda.libraries.psu.edu/ You'll have to search for it, I'm afraid. The site's not responding for me right now. But his dissertation is publicly available on Penn State's ETD site.
[10] http://www.iitk.ac.in/kangal/deb.shtml
edit: formatting
For an engineering optimization problem, I always look for sources of conflict, so there would be multiple objectives, we'd have to choose a metric or three, do a bunch of different random seed trials, and so forth.
It's so old that it's written in Flash! One of these days I will port it to canvas, I swear...
I was going to paste an example track I came across that seemed literally impossible to conquer within the constraints of the mutations, but I can't grab the seed.
In any event, would love more depth to the mutations. Longer/taller cars, etc. Maybe even other things like randomly firing after burners, wings to let it glide, etc.
Nice work!