The Pinocchio Function, Part 4: Two Steps Forward, Two Parts Chaos
The story I'm telling here is true. The dates are approximate and the events are summarized, but I'm not making this shit up. This is part four of the recap of the story so far. You can find part 1 here, part 2 here, and part 3 here.
The path before me was clear. I needed to restep down this lonely path of code and reshape my vision to conform to their reality if I was ever going to get their reality to conform to my vision.
So I did. I spent several late nights coding an evolutionary computational engine, which the specific details of the architecture will not be disclosed here for numerous reasons. Sufficient to say that the first night I got it going and solving problems was nothing short of elating, despite the fact that the problems it was solving were trivial. It really didn't matter: I had succeeded in harnessing nature's wisdom of tapping evolution as a process by which order comes out of chaos, and I'd done it by standing on the shoulders of giants who came before me.
And like the aforementioned giants must have at some point, I ran into glass ceilings; a point after which you can see there's further onward to go, but cannot escape your present confines to advance. For me these ceilings presented themselves in what can basically be described as a lack of biodiversity, because even as my understanding and the resulting complexity of the code base grew, I kept running into the same problem: The code would evolve to the point it's fitness function agreed it should evolve to, and then stop. This is analogous to a goldfish growing to the size of it's bowl, and what I realized was that I needed to stop treating the thing like a goldfish.
If life really were to evolve from with a digital landscape, it would be the resulting emergent behavior that happens when you have lots and lots of biodiversity co-evolving on a shared landscape, not one goldfish growing to the size of it's bowl. In fact the landscape would need to support an ever increasing amounts of biodiversity AND increasing population sizes.
The other thing that I realized is that intelligence and life itself provides it's own fitness function, because that which is more capable of applying intelligence to it's existence is by definition better at surviving, and that this is especially true when we're talking about organisms co-evolving on a competitive landscape. This is a gross oversimplification of the real process, but the underlying logic is sound in that emergent behaviors provide their own set of challenges to be overcome by individuals in a population. What this means is that simply by subjecting an evolving process to evolutionary competition with another evolving process you end up with co-evolving processes which should impose new evolutionary challenges as a result of being in competition with each other.
In other words if you create a landscape which is increasingly expansive and find a way to populate it with organisms which are capable of evolution and put them in competition with each other for survival, evolution will do it's task of enforcing that only changes which are beneficial to survival continue.
The idea actually came to me when watching videos of other evolutionary computational engines running with the fitness function removed. These runs would often display the most extraordinary examples of what can only be described as evolutionary epochs as these little programs first discovered ways to dominate the landscape and then began competing with each other, each successive generation displaying increasingly aggressive behavior as swarms of similarly colonies of code swept across the landscape, in turn displaying increasingly complex behavior to enhance it's survival prospects.
It would start simply, with just whatever was fastest at propagating, and soon one variation of code would dominate the landscape. But eventually something that didn't replicate over code that was like itself mutated into existence, and this proved to be better because it was able to replicate with greater consistency than it's inferior parents and it would soon dominate. And then something which attacked code which checked it's neighbor took over because once again it was better at survival. And this process kept repeating and repeating until a few very virulent strains were all that survived, forever locked in this war of constantly overwriting each other as fast as their virtual CPU's would allow them.
But from looking at the resulting code when I did this on my own, I didn't get this right away. Because each simulation consists of a very large number of CPU's executing in parallel all networked together it was the interaction between them that gave rise to what was most interesting. I kept on looking at things from the perspective of what a CPU is doing, and what code it was executing, like we do now with computers. But what I realized was that this was not really a useful way to envision what was happening at all, and instead I needed to follow the code as it replicated from CPU to CPU.
And this turned out to be an interesting problem indeed! Little did I know the life and death of a piece of evolving code would hold the key to my understanding of the Pinocchio Function.
Coming up in part 5: Amazing Technicolor Dreamcode
The path before me was clear. I needed to restep down this lonely path of code and reshape my vision to conform to their reality if I was ever going to get their reality to conform to my vision.
So I did. I spent several late nights coding an evolutionary computational engine, which the specific details of the architecture will not be disclosed here for numerous reasons. Sufficient to say that the first night I got it going and solving problems was nothing short of elating, despite the fact that the problems it was solving were trivial. It really didn't matter: I had succeeded in harnessing nature's wisdom of tapping evolution as a process by which order comes out of chaos, and I'd done it by standing on the shoulders of giants who came before me.
And like the aforementioned giants must have at some point, I ran into glass ceilings; a point after which you can see there's further onward to go, but cannot escape your present confines to advance. For me these ceilings presented themselves in what can basically be described as a lack of biodiversity, because even as my understanding and the resulting complexity of the code base grew, I kept running into the same problem: The code would evolve to the point it's fitness function agreed it should evolve to, and then stop. This is analogous to a goldfish growing to the size of it's bowl, and what I realized was that I needed to stop treating the thing like a goldfish.
If life really were to evolve from with a digital landscape, it would be the resulting emergent behavior that happens when you have lots and lots of biodiversity co-evolving on a shared landscape, not one goldfish growing to the size of it's bowl. In fact the landscape would need to support an ever increasing amounts of biodiversity AND increasing population sizes.
The other thing that I realized is that intelligence and life itself provides it's own fitness function, because that which is more capable of applying intelligence to it's existence is by definition better at surviving, and that this is especially true when we're talking about organisms co-evolving on a competitive landscape. This is a gross oversimplification of the real process, but the underlying logic is sound in that emergent behaviors provide their own set of challenges to be overcome by individuals in a population. What this means is that simply by subjecting an evolving process to evolutionary competition with another evolving process you end up with co-evolving processes which should impose new evolutionary challenges as a result of being in competition with each other.
In other words if you create a landscape which is increasingly expansive and find a way to populate it with organisms which are capable of evolution and put them in competition with each other for survival, evolution will do it's task of enforcing that only changes which are beneficial to survival continue.
The idea actually came to me when watching videos of other evolutionary computational engines running with the fitness function removed. These runs would often display the most extraordinary examples of what can only be described as evolutionary epochs as these little programs first discovered ways to dominate the landscape and then began competing with each other, each successive generation displaying increasingly aggressive behavior as swarms of similarly colonies of code swept across the landscape, in turn displaying increasingly complex behavior to enhance it's survival prospects.
It would start simply, with just whatever was fastest at propagating, and soon one variation of code would dominate the landscape. But eventually something that didn't replicate over code that was like itself mutated into existence, and this proved to be better because it was able to replicate with greater consistency than it's inferior parents and it would soon dominate. And then something which attacked code which checked it's neighbor took over because once again it was better at survival. And this process kept repeating and repeating until a few very virulent strains were all that survived, forever locked in this war of constantly overwriting each other as fast as their virtual CPU's would allow them.
But from looking at the resulting code when I did this on my own, I didn't get this right away. Because each simulation consists of a very large number of CPU's executing in parallel all networked together it was the interaction between them that gave rise to what was most interesting. I kept on looking at things from the perspective of what a CPU is doing, and what code it was executing, like we do now with computers. But what I realized was that this was not really a useful way to envision what was happening at all, and instead I needed to follow the code as it replicated from CPU to CPU.
And this turned out to be an interesting problem indeed! Little did I know the life and death of a piece of evolving code would hold the key to my understanding of the Pinocchio Function.
Coming up in part 5: Amazing Technicolor Dreamcode
Labels: AI, AL, ALife, artificial intelligence, artificial life, disruptive technology, evolution, evolutionary computing, genesis