Регистрация | Вход
#define NUM_DENDRITES 64struct neuron{ float mWeights[ NUM_DENDRITES ]; float mInputs[ NUM_DENDRITES ]; float mSigmoidCoeff; float mSigmoidOffset; flaot mOutput; // Axon};float tanh_sigmoid( float X, float Coeff = 1, float Offset = 0 ){ return 2 / ( 1 + exp( Offset - Coeff * X ) ) - 1}float dot_product( float* pX, float* pY, size_t Length ){ float Result = 0; for( size_t I = 0; I < Length; I += 1 ) Result += pX[ I ] * pY[ I ]; return Result;}void process_one( neuron* pNeuron ){ pNeuron->mOutput = dot_product( pNeuron->mInputs, pNeuron->mWeights, NUM_DENDRITES ); pNeuron->mOutput = tanh_sigmoid( pNeuron->mOutput, pNeuron->mSigmoidCoeff, pNeuron->mSigmoidOffset );}// computing kernelvoid process_parallel( neuron* pNeuronData, size_t Length ){ parallel_for( size_t I = 0; I < Length; I++ ) { process_one( pNeuronData + I ); }}
struct neurons{ unsigned char signal; unsigned short id[UCHAR_MAX]; }neuron[UCHAR_MAX];struct io{ unsigned char signal; unsigned char id;}output;typedef void callback(struct io*);void handler(struct io* input, unsigned char trm, callback fp){ if(input != NULL) neuron[input->id].signal = (neuron[input->id].signal + input->signal) / 2; #define src neuron[i] #define dst neuron[neuron[i].id[n]] unsigned char i, n; for(i = 0; i < UCHAR_MAX; i++) { for(n = 0; n < UCHAR_MAX; n++) { if(src.signal > 0 && trm > 0) src.id[n]++; if(src.id[n] <= UCHAR_MAX) dst.signal = (dst.signal + src.signal) / 2; else { output.signal = src.signal; output.id = src.id[n]; fp(&output); } } }}
#include <limits.h>struct neurons{ unsigned char signal; unsigned short id[UCHAR_MAX]; }neuron[USHRT_MAX];struct io{ unsigned char signal; unsigned short id;}output;typedef unsigned char callback(struct io*);void handler(struct io* input, callback fp){ unsigned char trm = UCHAR_MAX; if(input != NULL) neuron[input->id].signal = (neuron[input->id].signal + input->signal) / 2; #define src neuron[i] #define dst neuron[neuron[i].id[n]] unsigned char i, n; for(i = 0; i < UCHAR_MAX; i++) { for(n = 0; n < UCHAR_MAX; n++) { if(src.signal > 0) { if(trm > 0) dst.signal = ((dst.signal + src.signal) / 2) / trm; else dst.signal = (dst.signal + src.signal) / 2; if(dst.signal == 0)++src.id[n]; if(src.id[n] > UCHAR_MAX) { output.signal = src.signal; output.id = src.id[n]; trm = fp(&output); } } } }}
if(dst.signal == 0){if(weight > 0)weight--; if(weight == 0) ++src.id[n];}else if(weight < UCHAR_MAX) weight++;
struct kolo_brain_sensor_data{ float mSpeedPercent; // процент от максимума текущей скорости на предыдущем тике симуляции[0.0->1.0) float mCompassAngle; // угол поворота на предыдущем тике симуляции, диапазон [0, 2Pi) нормализован в [0, 1) float mTurnSpeed; // угловая скорость, процент от максимума, опять же 0-1 float mFoodReserve; // запас жраки в брюхе, процент [0.0-1.0) float mFoodSmell; // интенсивность запаха еды, процент [0.0-1.0) 0.0 - совсем не пахнет. float mFoodAngle; // Локальный угол относительно носа на источник запаха. если коло смотрит ровно на еду - 0.0.};
struct kolo_brain_motor_data{ float mGasPedal; // педаль газа, управляет двигателем колобка. возможные значения в диапазоне [0, 1). float mRotoSteer; // руль колобка. управляет двигателем поворота. возможные значения в диапазоне [-1.0, 1.0]};