# include # include # include # include /******** prototipi **********/ double sigmoid(double); /********* Variabili globali ************/ #define INPUT_NEURONS 4 #define HIDDEN_NEURONS 3 #define OUTPUT_NEURONS 4 /* Input to Hidden Weights (with Biases) */ double wih[INPUT_NEURONS+1][HIDDEN_NEURONS]; /* Hidden to Output Weights (with Biases) */ double who[HIDDEN_NEURONS+1][OUTPUT_NEURONS]; /* Activations */ double inputs[INPUT_NEURONS]; double hidden[HIDDEN_NEURONS]; double target[OUTPUT_NEURONS]; double actual[OUTPUT_NEURONS]; /* Unit Errors */ double erro[OUTPUT_NEURONS]; double errh[HIDDEN_NEURONS]; /*********** macro ***************/ #define LEARN_RATE 0.2 /* Rho */ #define RAND_WEIGHT ( ((float)rand() / (float)RAND_MAX) -0.5) #define getSRand() ((float)rand() / (float)RAND_MAX) #define getRand(x) (int)((x) * getSRand()) #define sqr(x) ((x) * (x)) /*** definizioni ***/ typedef struct{ double health; double knife; double gun; double enemy; double out[OUTPUT_NEURONS]; } ELEMENT; # define MAX_SAMPLES 18 ELEMENT samples[MAX_SAMPLES]={ {2.0,0.0,0.0,0.0,{0.0,0.0,1.0,0.0}}, {2.0,0.0,0.0,1.0,{0.0,0.0,1.0,0.0}}, {2.0,0.0,1.0,1.0,{1.0,0.0,0.0,0.0}}, {2.0,0.0,1.0,2.0,{1.0,0.0,0.0,1.0}}, {2.0,1.0,0.0,2.0,{0.0,0.0,0.0,1.0}}, {2.0,1.0,0.0,1.0,{1.0,0.0,0.0,0.0}}, {1.0,0.0,0.0,0.0,{0.0,0.0,1.0,0.0}}, {1.0,0.0,0.0,1.0,{0.0,0.0,0.0,1.0}}, {1.0,0.0,1.0,1.0,{1.0,0.0,0.0,0.0}}, {1.0,0.0,1.0,2.0,{0.0,0.0,0.0,1.0}}, {1.0,1.0,0.0,2.0,{0.0,0.0,0.0,1.0}}, {1.0,1.0,0.0,1.0,{0.0,0.0,0.0,1.0}}, {0.0,0.0,0.0,0.0,{0.0,0.0,1.0,0.0}}, {0.0,0.0,0.0,1.0,{0.0,0.0,0.0,1.0}}, {0.0,0.0,1.0,1.0,{0.0,0.0,0.0,1.0}}, {0.0,0.0,1.0,2.0,{0.0,1.0,0.0,0.0}}, {0.0,1.0,0.0,2.0,{0.0,1.0,0.0,0.0}}, {0.0,1.0,0.0,1.0,{0.0,0.0,0.0,1.0}} }; /******* prototipi ********/ /******** Funzione Feed-Forward:calcolo dell'output con pesi dati ******/ void feedForward(void ) { int inp, hid, out; double sum; /* Calculate input to hidden layer */ for (hid = 0 ; hid < HIDDEN_NEURONS ; hid++) { sum = 0.0; for (inp = 0 ; inp < INPUT_NEURONS ; inp++) { sum += inputs[inp] * wih[inp][hid]; } /* Add in Bias */ sum += wih[INPUT_NEURONS][hid]; hidden[hid]= sigmoid(sum); } /* Calculate the hidden to output layer */ for (out=0;out