OK, I lied. Programming the brain first, even though I wrote it as if I wrote about the body already, it should still mostly make sense.
The core fact to realize about our own conciousness, etc, is the fact that we are not programmed with it. Trying to program self-awareness into a computer simulation has problems because there is no place to start from. Our behaviour is an emergent behaviour, so we need to duplicate this in an simulated fashion.
Given that we've already talked about the modularity of the body plan, how is this body controlled? We assign a virtual neuron cluster to each point of freedom, with each virtual cluster having members equal to the granularity we want to start with. Thus, consider the human elbow. It would be one virtual neuron cluster to control its up-and-down motion (like you're flexing your arms). The number of virtual neurons in this cluster is determined by:
- 1 per degree of rotation. About 160 for the human elbow.
- Each virtual neuron can have an arbitrary number of connections within the cluster, but regardless of input signals recieved only outputs one unit of amplitude. We then have 160 control neurons with one "lead" outside the cluster. Control neuron 2 fires two movement neurons, instigating a 2o rotation. Control neuron 139 fires 139 movement neurons, for a 139 degree rotation. Thus, "basic" members in the available movement pool have more connections (more control neuron connections) than more extreme members (ie, movement neuron 160 is only connected to one control neuron)
These virtual neuron clusters are then batched into virtual superclusters, controlling the larger body segment. So, a human shoulder would have one cluster for swinging rotation, one for "flapping" rotation (like jumping jacks). The supercluster has a set of control neurons, broken into a few classes:
- Voltage neurons. Consider the elbow again. A control neuron can recieve an variable-amplitude signal at a slightly slower response rate, perhaps 1/9 frequency. So, once per nine cycles it sums all the amplitudes recieved, and breaks them into 1 unit chunks, one for each control lead to a VNC. Extra amplitude is passed into the next cycle. There is one voltage neuron per degree of freedom in the supercluster. Return direction sums amplitudes, no delay.
- Gate neurons. Gate neurons operate on a 1/3 frequency basis, with the first amplitude spike determining which aspect to direct the signal to (addressing, absolute value, so, first joint second degree of freedom, etc), and the second amplitude spike being the signal sent to the appropriate voltage neuron. The final frequency division is a wait phase, with no input remembered. Gate neurons have one output per voltage neuron (ie, one per degree of freedom in the supercluster), and only one input total. However, there can be any number of gate neurons per supercluster. These and VGNs are the only neurons allowed to leave/straddle superclusters.
Since voltage neurons have a frequency ratio of 1/3 with respect to gate neurons, this allows for combination movements to be coordinated (up to three simultaneous degrees of freedom). Gate neurons can recieve signals from the rest of the brain, directly or indirectly. Superclusters in the brain are then arranged around a control hub, which consists of two types of neurons:
- Jump neurons. Multiple in, one out. Takes no cycles to send a signal - it is direct. Primary interconnect neurons, acting like wires. Multiple input signals sum amplitude.
- Splitter neurons. Exactly what they sound like. They can take an input signal (one), and relay that same signal to two outputs. Takes no cycles, monodirectional.
- Transistor neurons. One in, logic out. Single unit amplitude outputs on one output, more than single unit amplitude outputs on the other. This is the reason for the rest phase in gate neurons. Monodirectional.
Finally, the whole package is made nice and neat with three other neuron types:
- Sensory neurons. Pulses visual information at a 1/2 cycle rate. First pulse is a 8-bit grayscale information, second pulse is the pulse's location in the visual field array (beginning with 1, square 0.5 MP). Monodirectional.
- Hybrid neurons. Turn 1 amplitude of signal to 1 degree of movement at a joint. Instead of an output ID, this neuron has a ID to determine which axis it rotates on. In later stages of evolution, one unit of mass subtracts from one degree of rotation, and one extra degree of rotation increases speed by 1/N, where N is the total number of degrees of rotation in excess of a threshold value. Faliure returns 1 amplitude of signal.
- Signal degrader. Reduces the signal by 1 amplitude. Required so the signal doesn't just run away, especially with logic. One input, one output, no delay, and monodirectional.
- Delay nuerons. As a jump neuron, but takes 1 cycle to send a signal.
- And for clairifations, virtual (general) neurons. These take no time to propogate signal. All amplitudes are reduced to 1; any incoming goes to all outgoing. "Input" and "Output" are both inputs for this type of neuron, but signals going "backwards" get a signal amplitude of -1. This is the only way to get a negative signal. These and gate neurons are the only ones allowed to "straddle" two superclusters.
While I've given these types of neurons "placements", during evolution any time of neuron may appear anywhere, and mutations in their descriptor string can mutate one neuron into another type; if there are extra connections, they are then dropped.
Programmatically, the neurons would be expressed by:
neuron = array[neuronType, neuronID, neuronMutationRate[type,inputID,outputID], neuronInputID[num1,num2,...], neuronOutputID[num1,num2,...], signalAmp]
Mutations for inputs and outputs are determined by a double-precision random number, which is randomly assigned to compare with one of the three neuronMutationRate values. If it is less than that value, then a mutation occurs. A random type is selected if the mutation occurs there; mutation spot in input and output IDs are done by
if random < .5*neuronMutationRate[ID]: length = neuronID.length()+1 else: length = neuronID.length() location = ceiling(random * length / neuronMutationRate[ID])
Thus having the capability to add a new branch, if applicable.
These ten types of neurons and their faux-brain lobe arrangement should be able to encompass all the required complicated behaviours.
Information and Links
Join the fray by commenting, tracking what others have to say, or linking to it from your blog.