Advertisement
Hexadroid

Untitled

May 14th, 2020
1,603
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.89 KB | None | 0 0
  1. //Pseudo A.I. tests, expirimental f
  2.  
  3. #pragma hdrstop
  4. #pragma argsused
  5.  
  6. #ifdef _WIN32
  7. #include <tchar.h>
  8. #else
  9.   typedef char _TCHAR;
  10.   #define _tmain main
  11. #endif
  12.  
  13. #include <stdio.h>
  14. #include <math.h>
  15. #include <algorithm>
  16.  
  17. using namespace std;
  18.  
  19. const int numberofrounds=101;
  20. const double maxi=75000; //increase for more accuracy
  21. double maxgrowth=0.01;
  22. const int total_number_of_trainingsets=37;
  23. const int total_synapses_per_neuron=4;
  24.  
  25.     double traininginput_converted[total_synapses_per_neuron][total_number_of_trainingsets];
  26.     double trainingoutput_converted[total_number_of_trainingsets];
  27.  
  28. double roundoutcome[numberofrounds];
  29. double approx=0, out_average;
  30.  
  31. int i=0;
  32. int j=0;
  33. int k=0,w,v;
  34.  
  35. double requested_output_should_be_approx=0;
  36.  
  37. double traininginput[total_synapses_per_neuron][total_number_of_trainingsets];
  38. double trainingoutput[total_number_of_trainingsets];
  39.  
  40. double requestedinput[total_synapses_per_neuron][1];
  41. double requestedoutput=0;
  42.  
  43. double syn[total_synapses_per_neuron]={0,0,0,0};
  44.  
  45. double syn0adjust =0;
  46. double syn1adjust =0;
  47. double syn2adjust =0;
  48. double syn3adjust =0;
  49.  
  50. double output=0;
  51. double adjust_weights_by = 0;   // adjust synaptic weights
  52.  
  53. double fx = 0;
  54. double fx_derivative=0;
  55. double error=0;
  56.  
  57.  
  58. double findMedian(double a[], int n)
  59. {
  60.     // First we sort the array
  61.     sort(a, a+n);
  62.  
  63.     // check for even case
  64.     if (n % 2 != 0)
  65.        return (double)a[n/2];
  66.  
  67.     return (double)(a[(n-1)/2] + a[n/2])/2.0;
  68. }
  69.  
  70.  
  71.  
  72.  
  73.  
  74. int _tmain(int argc, _TCHAR* argv[])
  75. {
  76.  
  77. // simple test training-set, the output is t[0] squared and adding t[1] and t[2] and t[3]
  78.  //set 0 input
  79. traininginput[0][0]=11;
  80. traininginput[1][0]=23;
  81. traininginput[2][0]=42;
  82. traininginput[3][0]=31;
  83.  
  84. //set 0 output
  85. trainingoutput[0]=217;
  86.  
  87. //set 1 input
  88. traininginput[0][1]=24;
  89. traininginput[1][1]=31;
  90. traininginput[2][1]=97;
  91. traininginput[3][1]=43;
  92.  
  93. //set 1 output
  94. trainingoutput[1]=747;
  95.  
  96. //set 2 input
  97. traininginput[0][2]=75;
  98. traininginput[1][2]=10;
  99. traininginput[2][2]=12;
  100. traininginput[3][2]=29;
  101.  
  102. //set 2 output
  103. trainingoutput[2]=5676;
  104.  
  105. //set 3 input
  106. traininginput[0][3]=45;
  107. traininginput[1][3]=39;
  108. traininginput[2][3]=51;
  109. traininginput[3][3]=91;
  110.  
  111. //set 3 output
  112. trainingoutput[3]=2206;
  113.  
  114. //set 4 input
  115. traininginput[0][4]=71;
  116. traininginput[1][4]=51;
  117. traininginput[2][4]=17;
  118. traininginput[3][4]=31;
  119.  
  120. //set 4 output
  121. trainingoutput[4]=5140;
  122.  
  123. //set 5 input
  124. traininginput[0][5]=45;
  125. traininginput[1][5]=89;
  126. traininginput[2][5]=55;
  127. traininginput[3][5]=25;
  128.  
  129. //set 5 output
  130. trainingoutput[5]=2194;
  131.  
  132. //set 6 input
  133. traininginput[0][6]=15;
  134. traininginput[1][6]=19;
  135. traininginput[2][6]=57;
  136. traininginput[3][6]=22;
  137.  
  138. //set 6 output
  139. trainingoutput[6]=323;
  140.  
  141. //set 7 input
  142. traininginput[0][7]=12;
  143. traininginput[1][7]=70;
  144. traininginput[2][7]=56;
  145. traininginput[3][7]=19;
  146.  
  147. //set 7 output
  148. trainingoutput[7]=289;
  149.  
  150. //set 8 input
  151. traininginput[0][8]=1;
  152. traininginput[1][8]=79;
  153. traininginput[2][8]=47;
  154. traininginput[3][8]=17;
  155.  
  156. //set 8 output
  157. trainingoutput[8]=144;
  158.  
  159. //set 9 input
  160. traininginput[0][9]=50;
  161. traininginput[1][9]=51;
  162. traininginput[2][9]=35;
  163. traininginput[3][9]=32;
  164.  
  165. //set 9 output
  166. trainingoutput[9]=2618;
  167.  
  168. //set 10 input
  169. traininginput[0][10]=99;
  170. traininginput[1][10]=9;
  171. traininginput[2][10]=14;
  172. traininginput[3][10]=40;
  173.  
  174. //set 10 output
  175. trainingoutput[10]=9864;
  176.  
  177. //set 11 input
  178. traininginput[0][11]=33;
  179. traininginput[1][11]=90;
  180. traininginput[2][11]=75;
  181. traininginput[3][11]=10;
  182.  
  183. //set 11 output
  184. trainingoutput[11]=1264;
  185.  
  186. //set 12 input
  187. traininginput[0][12]=25;
  188. traininginput[1][12]=75;
  189. traininginput[2][12]=50;
  190. traininginput[3][12]=15;
  191.  
  192. //set 12 output
  193. trainingoutput[12]=765;
  194.  
  195. //set 13 input
  196. traininginput[0][13]=31;
  197. traininginput[1][13]=33;
  198. traininginput[2][13]=32;
  199. traininginput[3][13]=37;
  200.  
  201. //set 13 output
  202. trainingoutput[13]=1063;
  203.  
  204. //set 14 input
  205. traininginput[0][14]=2;
  206. traininginput[1][14]=1;
  207. traininginput[2][14]=8;
  208. traininginput[3][14]=7;
  209.  
  210. //set 14 output
  211. trainingoutput[14]=20;
  212.  
  213. //set 15 input
  214. traininginput[0][15]=66;
  215. traininginput[1][15]=86;
  216. traininginput[2][15]=91;
  217. traininginput[3][15]=79;
  218.  
  219. //set 15 output
  220. trainingoutput[15]=4612;
  221.  
  222. //set 16 input
  223. traininginput[0][16]=17;
  224. traininginput[1][16]=0;
  225. traininginput[2][16]=30;
  226. traininginput[3][16]=56;
  227.  
  228. //set 16 output
  229. trainingoutput[16]=375;
  230.  
  231. //set 17 input
  232. traininginput[0][17]=80;
  233. traininginput[1][17]=29;
  234. traininginput[2][17]=21;
  235. traininginput[3][17]=32;
  236.  
  237. //set 17 output
  238. trainingoutput[17]=6482;
  239.  
  240. //set 18 input
  241. traininginput[0][18]=18;
  242. traininginput[1][18]=21;
  243. traininginput[2][18]=22;
  244. traininginput[3][18]=53;
  245.  
  246. //set 18 output
  247. trainingoutput[18]=420;
  248.  
  249. //set 19 input
  250. traininginput[0][19]=60;
  251. traininginput[1][19]=61;
  252. traininginput[2][19]=24;
  253. traininginput[3][19]=13;
  254.  
  255. //set 19 output
  256. trainingoutput[19]=3698;
  257.  
  258. //set 20 input
  259. traininginput[0][20]=61;
  260. traininginput[1][20]=14;
  261. traininginput[2][20]=22;
  262. traininginput[3][20]=49;
  263.  
  264. //set 20 output
  265. trainingoutput[20]=3806;
  266.  
  267. //set 21 input
  268. traininginput[0][21]=32;
  269. traininginput[1][21]=38;
  270. traininginput[2][21]=19;
  271. traininginput[3][21]=43;
  272.  
  273. //set 21 output
  274. trainingoutput[21]=1124;
  275.  
  276. //set 22 input
  277. traininginput[0][22]=46;
  278. traininginput[1][22]=97;
  279. traininginput[2][22]=52;
  280. traininginput[3][22]=1;
  281.  
  282. //set 22 output
  283. trainingoutput[22]=2266;
  284.  
  285. //set 23 input
  286. traininginput[0][23]=16;
  287. traininginput[1][23]=22;
  288. traininginput[2][23]=36;
  289. traininginput[3][23]=77;
  290.  
  291. //set 23 output
  292. trainingoutput[23]=391;
  293.  
  294. //set 24 input
  295. traininginput[0][24]=81;
  296. traininginput[1][24]=51;
  297. traininginput[2][24]=24;
  298. traininginput[3][24]=33;
  299.  
  300. //set 24 output
  301. trainingoutput[24]=6669;
  302.  
  303. //set 25 input
  304. traininginput[0][25]=5;
  305. traininginput[1][25]=9;
  306. traininginput[2][25]=10;
  307. traininginput[3][25]=91;
  308.  
  309. //set 25 output
  310. trainingoutput[25]=135;
  311.  
  312. //set 26 input
  313. traininginput[0][26]=50;
  314. traininginput[1][26]=50;
  315. traininginput[2][26]=50;
  316. traininginput[3][26]=50;
  317.  
  318. //set 26 output
  319. trainingoutput[26]=2650;
  320.  
  321. //set 27 input
  322. traininginput[0][27]=10;
  323. traininginput[1][27]=15;
  324. traininginput[2][27]=50;
  325. traininginput[3][27]=39;
  326.  
  327. //set 27 output
  328. trainingoutput[27]=204;
  329.  
  330. //set 28 input
  331. traininginput[0][28]=20;
  332. traininginput[1][28]=21;
  333. traininginput[2][28]=27;
  334. traininginput[3][28]=16;
  335.  
  336. //set 28 output
  337. trainingoutput[28]=464;
  338.  
  339. //set 29 input
  340. traininginput[0][29]=3;
  341. traininginput[1][29]=81;
  342. traininginput[2][29]=36;
  343. traininginput[3][29]=14;
  344.  
  345. //set 29 output
  346. trainingoutput[29]=140;
  347.  
  348. //set 30 input
  349. traininginput[0][30]=24;
  350. traininginput[1][30]=81;
  351. traininginput[2][30]=97;
  352. traininginput[3][30]=71;
  353.  
  354. //set 30 output
  355. trainingoutput[30]=825;
  356.  
  357. //set 31 input
  358. traininginput[0][31]=24;
  359. traininginput[1][31]=38;
  360. traininginput[2][31]=97;
  361. traininginput[3][31]=50;
  362.  
  363. //set 31 output
  364. trainingoutput[31]=761;
  365.  
  366. //set 32 input
  367. traininginput[0][32]=26;
  368. traininginput[1][32]=27;
  369. traininginput[2][32]=41;
  370. traininginput[3][32]=49;
  371.  
  372. //set 32 output
  373. trainingoutput[32]=793;
  374.  
  375. //set 33 input
  376. traininginput[0][33]=19;
  377. traininginput[1][33]=31;
  378. traininginput[2][33]=38;
  379. traininginput[3][33]=67;
  380.  
  381. //set 33 output
  382. trainingoutput[33]=497;
  383.  
  384. //set 34 input
  385. traininginput[0][34]=20;
  386. traininginput[1][34]=10;
  387. traininginput[2][34]=99;
  388. traininginput[3][34]=91;
  389.  
  390. //set 34 output
  391. trainingoutput[34]=600;
  392.  
  393. //set 35 input
  394. traininginput[0][35]=17;
  395. traininginput[1][35]=70;
  396. traininginput[2][35]=57;
  397. traininginput[3][35]=18;
  398.  
  399. //set 35 output
  400. trainingoutput[35]=434;
  401.  
  402. //set 36 input
  403. traininginput[0][36]=78;
  404. traininginput[1][36]=8;
  405. traininginput[2][36]=71;
  406. traininginput[3][36]=6;
  407.  
  408. //set 36 output
  409. trainingoutput[36]=6169;
  410.  
  411. //INPUT REQUESTED DATA HERE
  412. requestedinput[0][0]=77;
  413. requestedinput[1][0]=8;
  414. requestedinput[2][0]=71;
  415. requestedinput[3][0]=6;
  416.  requested_output_should_be_approx=3840;
  417.  
  418.  
  419.   for(k=0;k<numberofrounds;k++)
  420.  {
  421.  
  422.  
  423.  //Randomize synaptic weights each round
  424.  syn[0] = rand() % ( 2000 ) + 1 ; syn[0] = (syn[0]/1000)-1;
  425.  syn[1] = rand() % ( 2000 ) + 1 ; syn[1] = (syn[1]/1000)-1;
  426.  syn[2] = rand() % ( 2000 ) + 1 ; syn[2] = (syn[2]/1000)-1;
  427.  syn[3] = rand() % ( 2000 ) + 1 ; syn[3] = (syn[3]/1000)-1;
  428.  
  429.  
  430.   for(j=0;j<total_number_of_trainingsets;j++)
  431.   {
  432.  
  433.     for(i=1;i<maxi;i++)
  434.     {
  435.  
  436.      output = (traininginput[0][j]*syn[0]+traininginput[1][j]*syn[1]+traininginput[2][j]*syn[2]+traininginput[3][j]*syn[3]);
  437.  
  438.      fx = output+1;  // sin(output)
  439.  
  440.      fx_derivative = 1; // cos(fx)
  441.  
  442.      error = trainingoutput[j] - output;
  443.  
  444.      adjust_weights_by = error * fx_derivative;
  445.  
  446.      syn0adjust =  traininginput[0][j]*adjust_weights_by;
  447.      syn1adjust =  traininginput[1][j]*adjust_weights_by;
  448.      syn2adjust =  traininginput[2][j]*adjust_weights_by;
  449.      syn3adjust =  traininginput[3][j]*adjust_weights_by;
  450.  
  451.             if (syn0adjust>maxgrowth) syn0adjust=maxgrowth;
  452.             if (syn1adjust>maxgrowth) syn1adjust=maxgrowth;
  453.             if (syn2adjust>maxgrowth) syn2adjust=maxgrowth;
  454.             if (syn3adjust>maxgrowth) syn3adjust=maxgrowth;
  455.  
  456.             if (syn0adjust<-maxgrowth) syn0adjust=-maxgrowth;
  457.             if (syn1adjust<-maxgrowth) syn1adjust=-maxgrowth;
  458.             if (syn2adjust<-maxgrowth) syn2adjust=-maxgrowth;
  459.             if (syn3adjust<-maxgrowth) syn3adjust=-maxgrowth;
  460.  
  461.       syn[0]=syn[0]+syn0adjust;
  462.       syn[1]=syn[1]+syn1adjust;
  463.       syn[2]=syn[2]+syn2adjust;
  464.       syn[3]=syn[3]+syn3adjust;
  465.  
  466.     } // for i
  467.  
  468.    
  469.   } // for j
  470.  
  471.    approx=requestedinput[0][0]*syn[0]+requestedinput[1][0]*syn[1]+requestedinput[2][0]*syn[2]+requestedinput[3][0]*syn[3];
  472.    roundoutcome[k] = approx;
  473.  
  474.     printf("\nDone %d %% ",k);
  475.         printf(",currently the outcome is %.2f",approx);
  476.            out_average+=approx;
  477.  
  478.  }  //for k
  479.  
  480.     out_average=out_average/numberofrounds;
  481.     printf("\nThe output should be approx (this number was inserted MANUALLY and is not computed in any way!) : %lf\n\n", requested_output_should_be_approx);
  482.     printf("101 round average output %lf \n", abs(out_average));
  483.     printf("101 round median output  %lf\n", findMedian(roundoutcome, sizeof(roundoutcome[0])));
  484.  
  485.  
  486.  
  487.     cin.get();
  488.  
  489.     return 0;
  490.  
  491.  
  492.  
  493. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement