Advertisement
Hexadroid

ImprovedV

Sep 6th, 2020
1,866
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.70 KB | None | 0 0
  1. #pragma hdrstop
  2. #pragma argsused
  3.  
  4. #ifdef _WIN32
  5. #include <tchar.h>
  6. #else
  7.   typedef char _TCHAR;
  8.   #define _tmain main
  9. #endif
  10.  
  11. #include <algorithm>
  12. #include <stdio.h>
  13. #include <math.h>
  14. #include <iostream>
  15.  
  16. using std::cin;
  17. using std::cout;
  18. using std::endl;
  19.  
  20.  
  21.     const long double version = 0.001875; // removed weird bug
  22.     const long double cyclesi = 100000;
  23.     const int training_inputs=37;
  24.  
  25.     long double training_set_inputs[training_inputs][3];
  26.     long double training_set_outputs[training_inputs], new_situation[training_inputs][3];
  27.  
  28.     long double sigmoidSynapticWeight[4];
  29.     long double sigmoidOutput5, sigmoidDOToutput5, sigmoidoutput;
  30.     long double Bsigmoidoutput[training_inputs], BsigmoidPart[training_inputs], Bsigmoid_DerivativePart[training_inputs], BsigmoiderrorPart[training_inputs], BsigmoidadjustmentPart[training_inputs], BsigmoidadjustSynapticWeight[4];
  31.  
  32.     long double oldoutput, cool, indicator,i=1;
  33.     int m,q,qq, create;
  34.  
  35.     int f,g,h,y;
  36.  
  37.  
  38. long double outt(long double (*array)[training_inputs][3], int b)
  39. {
  40.     long double calc;
  41.  
  42.         //testing the ai, for it to 'predict' the outcome of these, known, simple formulas; ofc i can plug in the formula and calculate directly : just experimenting..
  43.             // it 'seems' to work, except for extreme high or low numbers (relative to the training table), it also does not work for extreme formulas like pow(x,5)+pow(y,3) etcc
  44.  
  45.             //3*  21.5*  1.77*
  46.        calc= 3*(*array)[b][0]  +  21.5*(*array)[b][1]  +  4.77*(*array)[b][2];
  47.  
  48.         if (calc==0) { calc=1;  printf("\ntest\n");
  49.                      }
  50.  
  51.  
  52.     return calc;
  53. }
  54.  
  55.  
  56.            // sigmoid function
  57. long double s(long double x)
  58. {
  59.     return 1 / (1 + expl(-(x)));
  60. }
  61.  
  62.             //sigmoid derivative
  63. long double d(long double x)
  64. {
  65.     return x * (1 - x);
  66. }
  67.  
  68.  
  69.  int _tmain(int argc, _TCHAR* argv[])
  70. {
  71.  
  72.     srand (time(NULL));
  73.  
  74.                // 72, 35,65
  75.     new_situation[0][0]=72.00;new_situation[0][1]=35.00;new_situation[0][2]=62.00;
  76.     cool = outt(&new_situation,0);
  77.  
  78.        printf("\n the output should be approx %.2Lf\n",cool);
  79.  
  80.  
  81.  
  82. //handmade table with somewhat random inputs
  83. y=0;
  84. //set 0 input
  85. training_set_inputs[0][0]=53;
  86. training_set_inputs[0][1]=23;
  87. training_set_inputs[0][2]=42;
  88.  
  89.  
  90. //set 0 output
  91. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  92.  
  93. //set 1 input
  94. training_set_inputs[1][0]=24;
  95. training_set_inputs[1][1]=31;
  96. training_set_inputs[1][2]=97;
  97.  
  98. //set 1 output
  99. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  100.  
  101. //set 2 input
  102. training_set_inputs[2][0]=75;
  103. training_set_inputs[2][1]=19;
  104. training_set_inputs[2][2]=12;
  105.  
  106. //set 2 output
  107. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  108.  
  109. //set 3 input
  110. training_set_inputs[3][0]=45;
  111. training_set_inputs[3][1]=39;
  112. training_set_inputs[3][2]=51;
  113.  
  114. //set 3 output
  115. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  116.  
  117. //set 4 input
  118. training_set_inputs[4][0]=71;
  119. training_set_inputs[4][1]=51;
  120. training_set_inputs[4][2]=17;
  121.  
  122. //set 4 output
  123. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  124.  
  125. //set 5 input
  126. training_set_inputs[5][0]=45;
  127. training_set_inputs[5][1]=79;
  128. training_set_inputs[5][2]=55;
  129.  
  130. //set 5 output
  131. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  132.  
  133. //set 6 input
  134. training_set_inputs[6][0]=25;
  135. training_set_inputs[6][1]=19;
  136. training_set_inputs[6][2]=57;
  137.  
  138. //set 6 output
  139. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  140.  
  141. //set 7 input
  142. training_set_inputs[7][0]=32;
  143. training_set_inputs[7][1]=70;
  144. training_set_inputs[7][2]=56;
  145.  
  146. //set 7 output
  147. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  148.  
  149. //set 8 input
  150. training_set_inputs[8][0]=31;
  151. training_set_inputs[8][1]=79;
  152. training_set_inputs[8][2]=47;
  153.  
  154. //set 8 output
  155. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  156.  
  157. //set 9 input
  158. training_set_inputs[9][0]=50;
  159. training_set_inputs[9][1]=51;
  160. training_set_inputs[9][2]=35;
  161.  
  162. //set 9 output
  163. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  164.  
  165. //set 10 input
  166. training_set_inputs[10][0]=80;
  167. training_set_inputs[10][1]=29;
  168. training_set_inputs[10][2]=14;
  169.  
  170. //set 10 output
  171. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  172.  
  173. //set 11 input
  174. training_set_inputs[11][0]=33;
  175. training_set_inputs[11][1]=85;
  176. training_set_inputs[11][2]=75;
  177.  
  178. //set 11 output
  179. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  180.  
  181. //set 12 input
  182. training_set_inputs[12][0]=25;
  183. training_set_inputs[12][1]=73;
  184. training_set_inputs[12][2]=51;
  185.  
  186. //set 12 output
  187. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  188.  
  189. //set 13 input
  190. training_set_inputs[13][0]=31;
  191. training_set_inputs[13][1]=33;
  192. training_set_inputs[13][2]=32;
  193.  
  194. //set 13 output
  195. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  196.  
  197. //set 14 input
  198. training_set_inputs[14][0]=22;
  199. training_set_inputs[14][1]=41;
  200. training_set_inputs[14][2]=38;
  201.  
  202. //set 14 output
  203. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  204.  
  205. //set 15 input
  206. training_set_inputs[15][0]=66;
  207. training_set_inputs[15][1]=86;
  208. training_set_inputs[15][2]=91;
  209.  
  210. //set 15 output
  211. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  212.  
  213. //set 16 input
  214. training_set_inputs[16][0]=17;
  215. training_set_inputs[16][1]=32;
  216. training_set_inputs[16][2]=30;
  217.  
  218. //set 16 output
  219. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  220.  
  221. //set 17 input
  222. training_set_inputs[17][0]=80;
  223. training_set_inputs[17][1]=29;
  224. training_set_inputs[17][2]=21;
  225.  
  226. //set 17 output
  227. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  228.  
  229. //set 18 input
  230. training_set_inputs[18][0]=18;
  231. training_set_inputs[18][1]=21;
  232. training_set_inputs[18][2]=29;
  233.  
  234. //set 18 output
  235. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  236.  
  237. //set 19 input
  238. training_set_inputs[19][0]=60;
  239. training_set_inputs[19][1]=61;
  240. training_set_inputs[19][2]=24;
  241.  
  242. //set 19 output
  243. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  244.  
  245. //set 20 input
  246. training_set_inputs[20][0]=61;
  247. training_set_inputs[20][1]=44;
  248. training_set_inputs[20][2]=22;
  249.  
  250. //set 20 output
  251. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  252.  
  253. //set 21 input
  254. training_set_inputs[21][0]=32;
  255. training_set_inputs[21][1]=38;
  256. training_set_inputs[21][2]=49;
  257.  
  258. //set 21 output
  259. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  260.  
  261. //set 22 input
  262. training_set_inputs[22][0]=46;
  263. training_set_inputs[22][1]=97;
  264. training_set_inputs[22][2]=52;
  265.  
  266. //set 22 output
  267. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  268.  
  269. //set 23 input
  270. training_set_inputs[23][0]=56;
  271. training_set_inputs[23][1]=22;
  272. training_set_inputs[23][2]=36;
  273.  
  274. //set 23 output
  275. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  276.  
  277. //set 24 input
  278. training_set_inputs[24][0]=81;
  279. training_set_inputs[24][1]=51;
  280. training_set_inputs[24][2]=24;
  281.  
  282. //set 24 output
  283. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  284.  
  285. //set 25 input
  286. training_set_inputs[25][0]=58;
  287. training_set_inputs[25][1]=79;
  288. training_set_inputs[25][2]=31;
  289.  
  290. //set 25 output
  291. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  292.  
  293. //set 26 input
  294. training_set_inputs[26][0]=50;
  295. training_set_inputs[26][1]=49;
  296. training_set_inputs[26][2]=50;
  297.  
  298. //set 26 output
  299. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  300.  
  301. //set 27 input
  302. training_set_inputs[27][0]=51;
  303. training_set_inputs[27][1]=45;
  304. training_set_inputs[27][2]=64;
  305.  
  306. //set 27 output
  307. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  308.  
  309. //set 28 input
  310. training_set_inputs[28][0]=20;
  311. training_set_inputs[28][1]=21;
  312. training_set_inputs[28][2]=67;
  313.  
  314. //set 28 output
  315. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  316.  
  317. //set 29 input
  318. training_set_inputs[29][0]=37;
  319. training_set_inputs[29][1]=81;
  320. training_set_inputs[29][2]=36;
  321.  
  322. //set 29 output
  323. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  324.  
  325. //set 30 input
  326. training_set_inputs[30][0]=24;
  327. training_set_inputs[30][1]=81;
  328. training_set_inputs[30][2]=57;
  329.  
  330. //set 30 output
  331. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  332.  
  333. //set 31 input
  334. training_set_inputs[31][0]=24;
  335. training_set_inputs[31][1]=38;
  336. training_set_inputs[31][2]=97;
  337.  
  338. //set 31 output
  339. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  340.  
  341. //set 32 input
  342. training_set_inputs[32][0]=26;
  343. training_set_inputs[32][1]=27;
  344. training_set_inputs[32][2]=41;
  345.  
  346. //set 32 output
  347. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  348.  
  349. //set 33 input
  350. training_set_inputs[33][0]=19;
  351. training_set_inputs[33][1]=31;
  352. training_set_inputs[33][2]=38;
  353.  
  354. //set 33 output
  355. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  356.  
  357. //set 34 input
  358. training_set_inputs[34][0]=20;
  359. training_set_inputs[34][1]=29;
  360. training_set_inputs[34][2]=55;
  361.  
  362. //set 34 output
  363. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  364.  
  365. //set 35 input
  366. training_set_inputs[35][0]=17;
  367. training_set_inputs[35][1]=70;
  368. training_set_inputs[35][2]=57;
  369.  
  370. //set 35 output
  371. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  372.  
  373. //set 36 input
  374. training_set_inputs[36][0]=78;
  375. training_set_inputs[36][1]=80;
  376. training_set_inputs[36][2]=71;
  377.  
  378. //set 36 output
  379. training_set_outputs[y] = outt(&training_set_inputs, y);y++;
  380.  
  381.  
  382.  
  383.  
  384.     new_situation[0][0]= 1/new_situation[0][0];
  385.     new_situation[0][1]= 1/new_situation[0][1];
  386.     new_situation[0][2]= 1/new_situation[0][2];
  387.  
  388.  
  389.  
  390.  
  391.     for(auto& rows: training_set_inputs)
  392. {
  393.     for(auto& elem: rows)
  394.     {
  395.         elem =  1/elem;
  396.  
  397.     }
  398. }
  399.  
  400.  
  401.     for (auto& number : training_set_outputs)
  402.     {
  403.         number =  1/number;
  404.  
  405.     }
  406.  
  407.  
  408.  
  409.  
  410.     sigmoidSynapticWeight[1]=0.41;
  411.     sigmoidSynapticWeight[2]=0.42;
  412.     sigmoidSynapticWeight[3]=0.43;//NON RANDOM values to test the system, to weed out some randomness.
  413.  
  414.  
  415.  
  416.     printf("SynapticWeight[1]=%.2Lf , SynapticWeight[2]=%.2Lf, SynapticWeight[3]=%.2Lf\n\n", sigmoidSynapticWeight[1], sigmoidSynapticWeight[2], sigmoidSynapticWeight[3]);
  417.  
  418.  
  419.     while (i++) {
  420.  
  421.  
  422.         //for( q = 1; q <= training_inputs; q++)
  423.         q = rand() % training_inputs + 1;  //same result quicker, tested..
  424.          {
  425.  
  426.         Bsigmoidoutput[q] = training_set_inputs[q-1][0]*sigmoidSynapticWeight[1]+training_set_inputs[q-1][1]*sigmoidSynapticWeight[2]+training_set_inputs[q-1][2]*sigmoidSynapticWeight[3];
  427.  
  428.         BsigmoidPart[q] = s(Bsigmoidoutput[q]);
  429.  
  430.         Bsigmoid_DerivativePart[q] = d(BsigmoidPart[q]);
  431.  
  432.         BsigmoiderrorPart[q] = (s(training_set_outputs[q-1]) - BsigmoidPart[q]);
  433.  
  434.         BsigmoidadjustmentPart[q] =  BsigmoiderrorPart[q] * Bsigmoid_DerivativePart[q];
  435.    
  436.         }
  437.  
  438.  
  439.         for( q = 1; q <= 3; q++) {
  440.  
  441.  
  442.             BsigmoidadjustSynapticWeight[q]=0;
  443.  
  444.  
  445.             for( qq = 1; qq <= training_inputs; qq++) {  BsigmoidadjustSynapticWeight[q] += (s(training_set_inputs[qq-1][q-1])*BsigmoidadjustmentPart[qq])/(training_inputs/10);}
  446.  
  447.         sigmoidSynapticWeight[q]=sigmoidSynapticWeight[q]+BsigmoidadjustSynapticWeight[q];
  448.  
  449.         }
  450.  
  451.  
  452.  
  453.         if ((floor(i/cyclesi*100))!=indicator)
  454.                 {
  455.  
  456.  
  457.  
  458.     sigmoidOutput5=new_situation[0][0]*sigmoidSynapticWeight[1]+new_situation[0][1]*sigmoidSynapticWeight[2]+new_situation[0][2]*sigmoidSynapticWeight[3];
  459.  
  460.     sigmoidDOToutput5 = s(sigmoidOutput5);
  461.  
  462.         //these four lines here below should not be here, but without it, it simply does not work.
  463.     sigmoidoutput = 1 / sigmoidDOToutput5;
  464.     sigmoidoutput = sigmoidoutput - 1;
  465.     sigmoidoutput = log(expl(1))/log(sigmoidoutput);
  466.     sigmoidoutput = -sigmoidoutput;
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.     printf("Step %.0Lf ",indicator); printf("Increase : %Lf \n", sigmoidoutput-oldoutput);
  474.     oldoutput = sigmoidoutput;
  475.  
  476.  
  477.  
  478.     printf("\nSigmoid-method, %.0Lf iterations) has output %.2Lf  (targetvalue = %.2Lf)",i, sigmoidoutput,cool);
  479.  
  480.                 }
  481.  
  482.  
  483.  
  484.         indicator = floor(i/cyclesi*100);
  485.  
  486.  
  487.     }
  488.  
  489.  
  490.  
  491.     cin.get();
  492.  
  493.  
  494.  
  495.  
  496.  
  497.     return 0;
  498. }
  499.  
  500.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement