Advertisement
Guest User

Genetic algorithm controls paper airplanes

a guest
Nov 14th, 2020
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.00 KB | None | 0 0
  1. // This project was coded in Processing ----> https://processing.org/
  2.  
  3. int TRAJANJE = 60 * 30;
  4. int POPULUS = 1000;
  5. float MUTACIJA = 0.005;
  6.  
  7. float VISINA = 250;
  8. Scena scena;
  9.  
  10. void setup(){
  11. size(1280,720,OPENGL);
  12. scena = new Scena();
  13. frameRate(60);
  14. }
  15.  
  16. void draw(){
  17. scena.korak();
  18. }
  19.  
  20. class Avion{
  21.  
  22. float maxBrzina;
  23. float okretniUgao;
  24.  
  25. PVector lok;
  26. PVector brz;
  27.  
  28. // pogled :
  29. float visinaUd;
  30. float udaljenost;
  31.  
  32. PVector yLinija,zLinija;
  33.  
  34. float duzina;
  35.  
  36. boolean rot; // kontrolise pogled
  37.  
  38. boolean ziv;
  39.  
  40. color boja, bojaInc, bojaKraj, bojaCilj;
  41.  
  42. boolean cilj;
  43.  
  44. DNK dnk;
  45. int brojac;
  46.  
  47. Avion(float x, float y, float z, DNK dnk_){
  48. maxBrzina = 2;
  49. okretniUgao = 0.024;
  50.  
  51. lok = new PVector(x,y,z);
  52. brz = new PVector(maxBrzina,0,0);
  53.  
  54. visinaUd = VISINA+90;
  55. udaljenost = 200;
  56.  
  57. yLinija = new PVector(0,1,0);
  58. zLinija = new PVector(0,0,1);
  59.  
  60. duzina = 30;
  61.  
  62. rot = true;
  63. ziv = true;
  64. cilj = false; // bitno
  65.  
  66. bojaInc = color(255);
  67. bojaKraj = color(255,0,0);
  68. bojaCilj = color(255,255,0);
  69.  
  70. boja = bojaInc;
  71.  
  72. dnk = dnk_;
  73. brojac = 0;
  74. }
  75.  
  76. void korak(){
  77. if(ziv){
  78. mozak();
  79. kretanje();
  80. granice();
  81. }
  82. prikazi();
  83. }
  84.  
  85. void mozak(){
  86.  
  87. kontrole(dnk.potez(brojac));
  88. brojac++;
  89.  
  90. }
  91.  
  92. void kretanje(){
  93. lok.add(brz);
  94. }
  95.  
  96. void kontrole(int kontrola){ // 1 - desno, 2 - lijevo, 3 - dolje, 4 - gore
  97.  
  98. if(kontrola > 2){
  99. yLinija = new PVector(brz.x,brz.y,0);
  100. yLinija.normalize();
  101. yLinija.rotate(PI/2);
  102. }
  103.  
  104. switch(kontrola){
  105. case 1 : brz = rotiraj(zLinija,brz,okretniUgao);
  106. break;
  107. case 2 : brz = rotiraj(zLinija,brz,-okretniUgao);
  108. break;
  109. case 3 : brz = rotiraj(yLinija,brz,okretniUgao);
  110. break;
  111. case 4 : brz = rotiraj(yLinija,brz,-okretniUgao);
  112. break;
  113. }
  114. }
  115.  
  116. void prikazi(){
  117.  
  118. pushMatrix();
  119. translate(lok.x,lok.y,lok.z);
  120. fill(boja);
  121.  
  122. PVector tacka = new PVector(brz.x,brz.y,brz.z);
  123. tacka.normalize();
  124. tacka.mult(duzina);
  125.  
  126. strokeWeight(1);
  127. stroke(0);
  128.  
  129. beginShape();
  130. vertex(0,0,0);
  131. vertex(tacka.x,tacka.y,tacka.z);
  132. PVector strana = new PVector(tacka.x,tacka.y,0);
  133. strana.normalize();
  134. strana.rotate(PI/2);
  135. strana.mult(duzina/4);
  136. vertex(strana.x,strana.y,strana.z);
  137. endShape(CLOSE);
  138.  
  139. beginShape();
  140. vertex(0,0,0);
  141. vertex(tacka.x,tacka.y,tacka.z);
  142. strana.rotate(PI);
  143. vertex(strana.x,strana.y,strana.z);
  144. endShape(CLOSE);
  145.  
  146. beginShape();
  147. vertex(0,0,0);
  148. vertex(tacka.x,tacka.y,tacka.z);
  149. tacka.normalize();
  150. PVector dolje = rotiraj(tacka,strana,PI/2);
  151. dolje.normalize();
  152. dolje.mult(duzina/6);
  153. vertex(dolje.x,dolje.y,dolje.z);
  154. endShape(CLOSE);
  155.  
  156. noStroke();
  157. popMatrix();
  158. }
  159.  
  160. void granice(){
  161. PVector tacka = tacka();
  162.  
  163. if(tacka.x < 0){
  164. kraj();
  165. }
  166. else if(tacka.x > width){
  167. kraj();
  168. }
  169.  
  170. if(tacka.y < 0){
  171. kraj();
  172. }
  173. else if(tacka.y > height){
  174. kraj();
  175. }
  176.  
  177. if(tacka.z < 0){
  178. kraj();
  179. }
  180. else if(tacka.z > VISINA){
  181. kraj();
  182. }
  183.  
  184. }
  185.  
  186.  
  187. void pogledTreceLice(){
  188. PVector bla = new PVector(brz.x,brz.y);
  189. if(rot){
  190. bla = new PVector(10,0);
  191. }
  192. bla.normalize();
  193. bla.mult(-udaljenost);
  194.  
  195. PVector treca = PVector.add(lok,bla);
  196.  
  197. PVector oci = PVector.add(lok,brz);
  198. camera(treca.x, treca.y, visinaUd, oci.x, oci.y, oci.z, 0, 0, -1);
  199. }
  200.  
  201. PVector rotiraj(PVector k, PVector v, float ugao){
  202.  
  203. PVector prvi = PVector.mult(v,cos(ugao));
  204.  
  205. PVector kopija = new PVector(k.x,k.y,k.z);
  206.  
  207. PVector drugi = kopija.cross(v);
  208. drugi.mult(sin(ugao));
  209.  
  210.  
  211. PVector treci = PVector.mult(k,k.dot(v));
  212. treci.mult(1-cos(ugao));
  213.  
  214. prvi.add(drugi);
  215. prvi.add(treci);
  216.  
  217. return prvi;
  218. }
  219.  
  220. PVector tacka(){
  221. PVector tacka = new PVector(brz.x,brz.y,brz.z);
  222. tacka.normalize();
  223. tacka.mult(duzina);
  224. tacka.add(lok);
  225. return tacka;
  226. }
  227.  
  228. void kraj(){
  229. ziv = false;
  230. boja = bojaKraj;
  231. }
  232.  
  233. void cilj(){
  234. kraj();
  235. boja = bojaCilj;
  236. cilj = true;
  237. }
  238. }
  239.  
  240. class DNK{
  241.  
  242. int[] lista;
  243. int duzinaGena;
  244.  
  245. DNK(){
  246. lista = new int[TRAJANJE];
  247. duzinaGena = 12; // mora bit djeljivo sa trajanjem
  248.  
  249. init();
  250. }
  251.  
  252. void init(){
  253. for(int i=0;i<TRAJANJE/duzinaGena;i++){
  254. int rand = int(random(1,5));
  255. for(int j=0;j<duzinaGena;j++)
  256. lista[i*duzinaGena+j] = rand;
  257. }
  258. }
  259.  
  260. int potez(int broj){
  261. return lista[broj];
  262. }
  263.  
  264. void sastavi(DNK d1, DNK d2){
  265. rekombinacija(d1, d2);
  266. mutacija();
  267. }
  268.  
  269. void mutacija(){
  270. for(int i=0;i<TRAJANJE/duzinaGena;i++){
  271. if(random(1)<MUTACIJA){
  272. int rand = int(random(1,5));
  273. for(int j=0;j<duzinaGena;j++)
  274. lista[i*duzinaGena+j] = rand;
  275. }
  276.  
  277. }
  278. for(int i=0;i<lista.length;i++){
  279.  
  280. }
  281. }
  282.  
  283. void rekombinacija(DNK d1, DNK d2){
  284. for(int i=0;i<lista.length;i++){
  285. if((i / duzinaGena) % 2 == 0){
  286. lista[i] = d1.lista[i];
  287. }else{
  288. lista[i] = d2.lista[i];
  289. }
  290. }
  291. }
  292. }
  293.  
  294. class Kutija{
  295.  
  296. float lokX, lokY;
  297. float w, h;
  298. float visina;
  299. color boja;
  300.  
  301. Kutija(float lx, float ly, float w_,float h_, float v, color b){
  302. lokX = lx; lokY = ly;
  303. w = w_; h = h_;
  304. visina = v;
  305. boja = b;
  306. }
  307.  
  308. void korak(){
  309. prikazi();
  310. }
  311.  
  312. void prikazi(){
  313.  
  314. fill(boja);
  315.  
  316. strokeWeight(1);
  317. stroke(1);
  318.  
  319. pushMatrix();
  320. translate(lokX+w/2,lokY+h/2,visina/2+1);
  321. box(w,h,visina-1);
  322. popMatrix();
  323.  
  324. noStroke();
  325. }
  326.  
  327. boolean granice(PVector lok){
  328.  
  329. if(lok.x > lokX && lok.x < lokX+w &&
  330. lok.y > lokY && lok.y < lokY+h &&
  331. lok.z > 0 && lok.z < visina){
  332. return true;
  333. }
  334.  
  335. return false;
  336. }
  337. }
  338.  
  339. class Nagrada{
  340.  
  341. PVector lok;
  342. float r;
  343. color boja;
  344.  
  345. Nagrada(float x, float y, float z, float r_, color b){
  346. lok = new PVector(x,y,z);
  347. r = r_;
  348. boja = b;
  349. }
  350.  
  351. void korak(){
  352. prikazi();
  353. }
  354.  
  355. void prikazi(){
  356. fill(boja);
  357.  
  358. pushMatrix();
  359. translate(lok.x,lok.y,lok.z);
  360. sphere(r);
  361. popMatrix();
  362. }
  363.  
  364. boolean granice(PVector lok2){
  365. if(dist(lok.x,lok.y,lok.z,lok2.x,lok2.y,lok2.z)< r){
  366. return true;
  367. }else{
  368. return false;
  369. }
  370. }
  371.  
  372. }
  373.  
  374. class Scena{
  375. Svijet svijet;
  376.  
  377. Scena(){
  378. svijet = new Svijet();
  379. }
  380.  
  381. void korak(){
  382. svijet.korak();
  383. }
  384. }
  385.  
  386. class Svijet{
  387.  
  388. int pogled;
  389.  
  390. Nagrada nagrada;
  391. ArrayList<Avion> avioni;
  392. ArrayList<Kutija> kutije;
  393.  
  394. color bojaKutija;
  395.  
  396. float rez;
  397. color bojaPoda0, bojaPoda1, bojaZida0, bojaZida1;
  398.  
  399. PVector lok;
  400. DNK[] dnk;
  401. int brojac;
  402.  
  403. float[] fitnes;
  404.  
  405. Svijet(){
  406. pogled = 0;
  407.  
  408. avioni = new ArrayList<Avion>();
  409. kutije = new ArrayList<Kutija>();
  410.  
  411. bojaKutija = color(50,50,255);
  412.  
  413. rez = 40;
  414.  
  415. bojaPoda0 = color(30,200,30);
  416. bojaPoda1 = color(0,255,0);
  417. bojaZida0 = color(170);
  418. bojaZida1 = color(200);
  419.  
  420. lok = new PVector(100,100,100);
  421. dnk = new DNK[POPULUS];
  422. fitnes = new float[POPULUS];
  423.  
  424. dnkInit();
  425. init();
  426. nagradaInit();
  427. brojac = 0;
  428. }
  429.  
  430. void korak(){
  431. if(brojac == TRAJANJE || kraj()){
  432. background(0); // privremeno
  433. for(Avion a : avioni){
  434. a.ziv = false;
  435. }
  436. evolucija();
  437. brojac++;
  438. reset();
  439. }else if(brojac < TRAJANJE){
  440. korak_();
  441. brojac++;
  442. }
  443. }
  444.  
  445. void korak_(){
  446. prikazi();
  447.  
  448. kutije();
  449. avioni();
  450. nagrada();
  451.  
  452. kamera();
  453. }
  454.  
  455. void evolucija(){
  456. fitnes();
  457. selekcija();
  458. }
  459.  
  460. void selekcija(){
  461. for(int n=0;n<dnk.length;n++){
  462. int sampion1 = int(random(dnk.length));
  463. int sampion2 = int(random(dnk.length));
  464.  
  465. for(int i=0;i<2;i++){
  466. for(int j=0;j<20;j++){ // 20 mzd var ?
  467. int protivnik = int(random(dnk.length));
  468. if(i==0){
  469. if(fitnes[sampion1]<fitnes[protivnik]){
  470. sampion1 = protivnik;
  471. }
  472. }else{
  473. if(fitnes[sampion2]<fitnes[protivnik]){
  474. sampion2 = protivnik;
  475. }
  476. }
  477. }
  478. }
  479.  
  480. DNK d1 = dnk[sampion1];
  481. DNK d2 = dnk[sampion2];
  482.  
  483. dnk[n].sastavi(d1,d2);
  484. }
  485.  
  486. }
  487.  
  488. void fitnes(){
  489. float najduzi = dist(0,0,VISINA,nagrada.lok.x,nagrada.lok.y,nagrada.lok.z);
  490.  
  491. for(int i=0;i<POPULUS;i++){
  492. float udaljenost = dist(avioni.get(i).lok.x,avioni.get(i).lok.y,avioni.get(i).lok.z,nagrada.lok.x,nagrada.lok.y,nagrada.lok.z);
  493. fitnes[i] = (1-(udaljenost/najduzi)) * (avioni.get(i).brojac);
  494. }
  495. }
  496.  
  497. void prikazi(){
  498.  
  499. noStroke(); // mzd ostane
  500.  
  501. background(#ACEDE2);
  502. lights();
  503.  
  504.  
  505. pod();
  506. zid();
  507.  
  508. }
  509.  
  510. void avioni(){
  511. for(Avion a : avioni){
  512. a.korak();
  513. }
  514. }
  515.  
  516. void kutije(){
  517.  
  518. for(Kutija k : kutije){
  519. for(Avion a : avioni){
  520. if(a.ziv && k.granice(a.tacka())){
  521. a.kraj();
  522. }
  523. }
  524.  
  525. k.korak();
  526. }
  527. }
  528.  
  529. void nagrada(){
  530. for(Avion a : avioni){
  531. if(a.ziv && nagrada.granice(a.tacka())){
  532. a.cilj();
  533. }
  534. }
  535. nagrada.korak();
  536. }
  537.  
  538. void kamera(){
  539. if(pogled == 0){
  540. camera(width/2-400, height/2+170, (height/2) / tan(PI/6)+190, width/2-150, height/2, 100, 0, 1, 0); // default
  541. }else if(pogled == 1){
  542. avioni.get(avioni.size()-1).pogledTreceLice(); // za sd samo zadnji
  543. }
  544. // x,y,h (oci) x,y,h(centar) [0,0,-1]
  545. }
  546.  
  547. void reset(){
  548. avioni = new ArrayList<Avion>();
  549. kutije = new ArrayList<Kutija>();
  550. init();
  551. brojac = 0;
  552. }
  553.  
  554. boolean kraj(){
  555. for(Avion a : avioni){
  556. if(a.ziv){
  557. return false;
  558. }
  559. }
  560. return true;
  561. }
  562.  
  563. void init(){
  564. avioniInit();
  565.  
  566. // faza 1 :
  567. kutije.add(new Kutija(7*40,1,2*40,11*40,VISINA,bojaKutija));
  568. kutije.add(new Kutija(7*40,13*40,2*40,2*40,110,bojaKutija));
  569.  
  570. // faza 2 :
  571. kutije.add(new Kutija(16*40,3*40,3*40,15*40-1,VISINA,bojaKutija));
  572. kutije.add(new Kutija(17*40,1,40,3*40-1,VISINA-50,bojaKutija));
  573.  
  574. }
  575.  
  576. void avioniInit(){
  577. for(int i=0;i<dnk.length;i++){
  578. avioni.add(new Avion(lok.x,lok.y,lok.z,dnk[i]));
  579. }
  580. }
  581.  
  582. void dnkInit(){
  583. for(int i=0;i<dnk.length;i++){
  584. dnk[i] = new DNK();
  585. }
  586. }
  587.  
  588. void nagradaInit(){
  589. nagrada = new Nagrada(30*40,8*40,50,50,color(255,255,0));
  590. }
  591.  
  592. void pod(){
  593. // pod
  594. fill(bojaPoda0);
  595. rect(0,0,width,height);
  596.  
  597. int i_ = int(width/rez);
  598. int j_ = int(height/rez);
  599.  
  600. // za sd :
  601. fill(bojaPoda1);
  602. for(int i = 0;i<i_;i++){
  603. for(int j = 0;j<j_;j++){
  604. if((j+i) % 2 == 0){
  605. pushMatrix();
  606. translate(0,0,1);
  607. rect(i*rez,j*rez,rez,rez);
  608. popMatrix();
  609. }
  610. }
  611. }
  612. }
  613.  
  614. void zid(){
  615.  
  616. fill(bojaZida0);
  617.  
  618. pushMatrix();
  619. rotateX(PI/2);
  620. rect(0,0,width,VISINA);
  621. popMatrix();
  622.  
  623. pushMatrix();
  624. translate(0,height,0);
  625. rotateX(PI/2);
  626. rect(0,0,width,VISINA);
  627. popMatrix();
  628.  
  629. fill(bojaZida1);
  630.  
  631. pushMatrix();
  632. rotateY(-PI/2);
  633. rect(0,0,VISINA,height);
  634. popMatrix();
  635.  
  636. pushMatrix();
  637. translate(width,0,0);
  638. rotateY(-PI/2);
  639. rect(0,0,VISINA,height);
  640. popMatrix();
  641. }
  642. }
  643.  
  644.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement