From ed934458535af1a95e6594d0a8e3b17726cc140f Mon Sep 17 00:00:00 2001 From: Abemarkar23 Date: Tue, 30 Apr 2019 13:30:51 -0700 Subject: [PATCH 01/21] fixed --- TheGame/.classpath | 10 ---------- TheGame/.project | 17 ----------------- TheGame/.settings/org.eclipse.jdt.core.prefs | 12 ------------ {TheGame/src => src}/Game.java | 0 4 files changed, 39 deletions(-) delete mode 100644 TheGame/.classpath delete mode 100644 TheGame/.project delete mode 100644 TheGame/.settings/org.eclipse.jdt.core.prefs rename {TheGame/src => src}/Game.java (100%) diff --git a/TheGame/.classpath b/TheGame/.classpath deleted file mode 100644 index f00af9b..0000000 --- a/TheGame/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/TheGame/.project b/TheGame/.project deleted file mode 100644 index fb4cb30..0000000 --- a/TheGame/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - frogger - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/TheGame/.settings/org.eclipse.jdt.core.prefs b/TheGame/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index a54bb93..0000000 --- a/TheGame/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=10 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=10 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=10 diff --git a/TheGame/src/Game.java b/src/Game.java similarity index 100% rename from TheGame/src/Game.java rename to src/Game.java From a65c80af743e09ac7e1baa95d3a34687e0f0dc63 Mon Sep 17 00:00:00 2001 From: avighna Date: Tue, 30 Apr 2019 13:39:16 -0700 Subject: [PATCH 02/21] infinite plans --- .classpath | 10 +++ .project | 17 +++++ .settings/org.eclipse.jdt.core.prefs | 12 +++ block.png | Bin 0 -> 1053 bytes ground.png | Bin 0 -> 2523 bytes mario.png | Bin 0 -> 4355 bytes src/Game.java | 47 +++++++++--- src/Keyboard.java | 50 +++++++++++++ src/Mario.java | 106 +++++++++++++++++++++++++++ 9 files changed, 232 insertions(+), 10 deletions(-) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 block.png create mode 100644 ground.png create mode 100644 mario.png create mode 100644 src/Keyboard.java create mode 100644 src/Mario.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..f00af9b --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..fb4cb30 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + frogger + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..a54bb93 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=10 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=10 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=10 diff --git a/block.png b/block.png new file mode 100644 index 0000000000000000000000000000000000000000..93b184893bcfa7295391c34083b91a633616645a GIT binary patch literal 1053 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)pT}UnMXwSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zUgGKN%Kn%|n$22y%aL#`1_owDPZ!6Kh{JCqeDj4p1!}LpGy69q&cW-=gBdB74L_t6 z)wh_JO&9$y5a#il+iA-mfde016jju1GSlzg4XrNl*>liXL)P`R$I8PoQD2|=miq3m z;?)U`$iDjj?8BrNXV0iC6Jk33(1J~D@rv75Oj$jY&ZUbl=3w~yZ@Qn9JnI|FpUK}X z^ws!{KUZa^u65+B5qS|T823(2eg}g?{+7$-x(-{I7}jpM7qnMx=>h?@HCdZO<_0~H zywK#~Jo|LizGZGfGrg60bM?IW{VaZ7{hiFo!!U26HQ$^|S6rr8cW(B%^=IY0n7#uR zCI8-R&z~KYwUPPp=Fbz4M$Ptl7Ii3UwY=^s0mgYx540XwB>FWfYW0%0GY%Ve$!*!X ztVm|!8L7YDKeMtgR(fOkul9RIy~)e1U*_MQTQ~W~ryh~S2S1+fUi|k^e$?l*?5&p- zG}B$aPOG~Sx978?hcLqxk*~A1-1Ev2um>7fs@Cy-st@)?X+0mTdjr zv**LSrR!GAUmAYVxUH36hvCb+&)U2{_wTiq>QnoBX3yQY+6xP|*!_+;5?|hTuI3439tRl3S3WD`;L)$wl1+%A*L)~`%LzF(UjYnsP-*TU&(l$miz z_@`8sT_Svr^*^M`w4;gPQDxkWXHE_@V87fLngN{(-J{_62}TigyY)_A|< zl#5+q(p!P%HR(T=aP3(%)k{Y31amTq8%skVWEm4U(2^&EaE8glbfGSez?YnbwB!zZ8y N22WQ%mvv4FO#lH;*bD#w literal 0 HcmV?d00001 diff --git a/ground.png b/ground.png new file mode 100644 index 0000000000000000000000000000000000000000..dff8613c270c226f5de7dec730c8c602746c7355 GIT binary patch literal 2523 zcmV<12_*K3P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/src/Game.java b/src/Game.java index 72beb2c..c90de52 100644 --- a/src/Game.java +++ b/src/Game.java @@ -16,11 +16,11 @@ public class Game { private JPanel panel; private Mario m = new Mario(0, 624); private Keyboard keys = new Keyboard(m); - private int[][] tilelayout = new int[13][13]; - private String[] tileID = {"AIR", "ground", "block"}; + private int[][] tilelayout = new int[13][14]; + private String[] tileID = {"AIR", "ground"}; private int offset = 0; // private int[] tileData = {1, 2}; - private Timer repaint = new Timer(1, new ActionListener(){ + private Timer repaint = new Timer(18, new ActionListener(){ public void actionPerformed(ActionEvent e) { frame.repaint(); // frame.dispose(); @@ -50,11 +50,10 @@ public void paintComponent(Graphics g) { } }; frame.add(panel); - - for (int x = 0; x < tilelayout.length; x++) { - tilelayout[12][x] = 1; + for (int x = 0; x < tilelayout[0].length; x++) { + tilelayout[tilelayout.length - 1][x] = 1; } - + printArray(tilelayout); panel.repaint(); panel.setPreferredSize(new Dimension(624, 624)); panel.addKeyListener(keys); @@ -64,9 +63,19 @@ public void paintComponent(Graphics g) { frame.setVisible(true); } + + private void printArray(int[][] t) { + for (int [] y : t) { + for (int x : y) { + System.out.print(x + ", "); + } + System.out.println(); + } + } + private void loadNext() { for (int y = 0; y < tilelayout.length; y++) { - for (int x = 1; x < tilelayout.length; x++) { + for (int x = 1; x < tilelayout[0].length; x++) { tilelayout[y][x - 1] = tilelayout[y][x]; } } @@ -77,10 +86,28 @@ private void loadNext() { } private int[] getNewLine() { + /*/ + int[] ans = new int[14]; + int[] lastcol = new int[14]; + int HEIGHT = 1; + // (int) (Math.random() * (lastcol.length - y + HEIGHT)) + y - HEIGHT + for (int y = 0; y < tilelayout.length; y++) { + lastcol[y] = tilelayout[y][tilelayout[y].length - 2]; + } + + for (int y = 0; y < lastcol.length; y++) { + if (lastcol[y] == 1) { + ans[14] = 1; + } + } + + return ans; + /*/ return new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; } - + private void draw(Graphics g) { + System.out.println(offset); offset += m.draw(g, tilelayout); while (offset >= 48) { loadNext(); @@ -88,7 +115,7 @@ private void draw(Graphics g) { } for (int y = 0; y < tilelayout.length; y++) { - for (int x = 0; x < tilelayout.length; x++) { + for (int x = 0; x < tilelayout[0].length; x++) { int tile = tilelayout[y][x]; if (tile != 0) { Image img; diff --git a/src/Keyboard.java b/src/Keyboard.java new file mode 100644 index 0000000..107eb8a --- /dev/null +++ b/src/Keyboard.java @@ -0,0 +1,50 @@ + + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +public class Keyboard implements KeyListener{ + Mario m = null; + int[] r = new int[3]; + + public Keyboard(Mario m) { + super(); + this.m = m; + } + + @Override + public void keyTyped(KeyEvent e) { +// System.out.println("What"); + } + + @Override + public void keyPressed(KeyEvent e) { +// System.out.println("keyPressed = " + KeyEvent.getKeyText(e.getKeyCode())); + useKeys(e, 1); + } + + @Override + public void keyReleased(KeyEvent e) { +// System.out.println("keyReleased = " + KeyEvent.getKeyText(e.getKeyCode())); + useKeys(e, 0); + } + + public void useKeys(KeyEvent e, int yup) { + String s = KeyEvent.getKeyText(e.getKeyCode()); + if ((s.equals("W")) || (s.equals("Up"))) { + r[1] = -1 * yup; + } + if ((s.equals("S")) || (s.equals("Down"))) { + r[1] = 1 * yup; + } + if ((s.equals("D")) || (s.equals("Right"))) { + r[0] = 1 * yup; + } + if ((s.equals("A")) || (s.equals("Left"))) { + r[0] = -1 * yup; + } + if (s.equals("Z")) { + r[2] = 1 * yup; + } + } +} diff --git a/src/Mario.java b/src/Mario.java new file mode 100644 index 0000000..29ab37e --- /dev/null +++ b/src/Mario.java @@ -0,0 +1,106 @@ +import java.awt.Graphics; +import java.awt.Image; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +public class Mario { + int x = 0; + int y = 0; + double x_vel = 0; + double y_vel = 0; + boolean inAir = true; + + public Mario(int x, int y) { + this.x = x; + this.y = y; + } + + public void key(int[] useKeys) { +// System.out.print(useKeys[0] + " "); +// System.out.print(useKeys[1] + " "); +// System.out.println(useKeys[2]); + if ((useKeys[1] == -1) && (inAir == false)) { + y_vel = 48; + } + if (useKeys[0] == 1) { + x_vel += 1; + } + if (useKeys[0] == -1) { + x_vel -= 1; + } + + if ((useKeys[2] == 1) && (useKeys[0] != 0)) { + x_vel = x_vel * 1.2; + } + + } + + public int draw(Graphics g, int[][] t) { + int answer = 0; + + int tilex = (int) Math.ceil(x / 48.0); + int tiley = (int) Math.ceil((624 - y) / 48.0); + if (tiley < 0) { + tiley = 0; + } + if (tiley > 13) { + tiley = 13; + } +// System.out.println(tilex); +// System.out.println(tiley); + boolean ti; + if (tiley == 0) { + ti = true; + } + else { + ti = t[tiley - 1][tilex] == 1; + } + + if (ti && y_vel > 0) { + y_vel = 0; + } + + if (t[tiley + 1][tilex] == 1) { + inAir = false; + y = y / 48 * 48; + if (y_vel < 0) { + y_vel = 0; + } + } + else { + inAir = true; + } + + if (t[tiley][tilex + 1] == 1 && x_vel > 0) { + x_vel = 0; + } + + x = (int) Math.round(x + x_vel); + y = (int) Math.round(y + y_vel); + x_vel = x_vel * 0.9; + if (inAir) { + y_vel = y_vel - 5; + } + if (x > 312) { + answer = x - 312; + x = 312; + } + if (x < 0) { + x = 0; + if (x_vel < 0) { + x_vel = 0; + } + } + + Image img; + try { + img = ImageIO.read(new File("mario.png")); + g.drawImage(img, x, 624 - y, null); + } catch (IOException e) { + // 1 2 Oatmeal + } + return answer; + } +} From bf360d37566925528cf7ca35b85b4478d1e5975e Mon Sep 17 00:00:00 2001 From: c00lme Date: Wed, 1 May 2019 11:51:38 -0700 Subject: [PATCH 03/21] supper mario bros --- src/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Game.java b/src/Game.java index c90de52..469c0ad 100644 --- a/src/Game.java +++ b/src/Game.java @@ -12,7 +12,7 @@ import javax.swing.Timer; public class Game { - private JFrame frame = new JFrame("Ultra Mario Bros!"); + private JFrame frame = new JFrame("Super Mario Bros!"); private JPanel panel; private Mario m = new Mario(0, 624); private Keyboard keys = new Keyboard(m); From 6b919bf30baabc69f94de4d17b38c3050f35b62e Mon Sep 17 00:00:00 2001 From: avighna Date: Wed, 1 May 2019 14:12:46 -0700 Subject: [PATCH 04/21] Game ready thing --- src/Game.java | 14 +++++++------- src/Mario.java | 25 +++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/Game.java b/src/Game.java index c90de52..ef1289e 100644 --- a/src/Game.java +++ b/src/Game.java @@ -20,7 +20,7 @@ public class Game { private String[] tileID = {"AIR", "ground"}; private int offset = 0; // private int[] tileData = {1, 2}; - private Timer repaint = new Timer(18, new ActionListener(){ + private Timer repaint = new Timer(60, new ActionListener(){ public void actionPerformed(ActionEvent e) { frame.repaint(); // frame.dispose(); @@ -86,29 +86,29 @@ private void loadNext() { } private int[] getNewLine() { - /*/ int[] ans = new int[14]; int[] lastcol = new int[14]; int HEIGHT = 1; - // (int) (Math.random() * (lastcol.length - y + HEIGHT)) + y - HEIGHT + for (int y = 0; y < tilelayout.length; y++) { lastcol[y] = tilelayout[y][tilelayout[y].length - 2]; } for (int y = 0; y < lastcol.length; y++) { if (lastcol[y] == 1) { - ans[14] = 1; + ans[(int) (Math.random() * (lastcol.length - y + HEIGHT)) + y - HEIGHT] = 1; } } + ans[(int) (Math.random() * (lastcol.length))] = 1; + ans[(int) (Math.random() * (lastcol.length))] = 0; return ans; - /*/ - return new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; +// return new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; } private void draw(Graphics g) { System.out.println(offset); - offset += m.draw(g, tilelayout); + offset += m.draw(g, tilelayout, offset); while (offset >= 48) { loadNext(); offset -= 48; diff --git a/src/Mario.java b/src/Mario.java index 29ab37e..05d0924 100644 --- a/src/Mario.java +++ b/src/Mario.java @@ -1,3 +1,4 @@ +import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.io.File; @@ -5,7 +6,7 @@ import javax.imageio.ImageIO; -public class Mario { +public class Mario{ int x = 0; int y = 0; double x_vel = 0; @@ -17,6 +18,10 @@ public Mario(int x, int y) { this.y = y; } + public boolean collided(int x1, int y1, int x2, int y2) { + return true; + } + public void key(int[] useKeys) { // System.out.print(useKeys[0] + " "); // System.out.print(useKeys[1] + " "); @@ -37,11 +42,16 @@ public void key(int[] useKeys) { } - public int draw(Graphics g, int[][] t) { + public int draw(Graphics g, int[][] t, int offset) { int answer = 0; int tilex = (int) Math.ceil(x / 48.0); int tiley = (int) Math.ceil((624 - y) / 48.0); + g.setColor(Color.RED); + g.drawLine((tilex * 48) - offset, (tiley * 48), (tilex * 48) + 48 - offset, (tiley * 48)); + g.drawLine((tilex * 48) - offset, (tiley * 48), (tilex * 48) - offset, (tiley * 48) + 48); + g.drawLine((tilex * 48) - offset, (tiley * 48) + 48, (tilex * 48) + 48 - offset, (tiley * 48) + 48); + g.drawLine((tilex * 48) + 48 - offset, (tiley * 48) + 48, (tilex * 48) + 48 - offset, (tiley * 48)); if (tiley < 0) { tiley = 0; } @@ -77,6 +87,17 @@ public int draw(Graphics g, int[][] t) { x_vel = 0; } + if (tilex == 0) { + ti = true; + } + else { + ti = t[tiley][tilex - 1] == 1; + } + + if (ti && x_vel < 0) { + x_vel = 0; + } + x = (int) Math.round(x + x_vel); y = (int) Math.round(y + y_vel); x_vel = x_vel * 0.9; From 729bc34dd4ab2f261122915f6cbf7a1e82d55938 Mon Sep 17 00:00:00 2001 From: avighna Date: Wed, 1 May 2019 18:47:15 -0700 Subject: [PATCH 05/21] Mostly compatible with other's program --- src/Game.java | 35 ++++++++++++++++++++++++++--------- src/Mario.java | 36 +++++++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/Game.java b/src/Game.java index ef1289e..b417cd6 100644 --- a/src/Game.java +++ b/src/Game.java @@ -8,6 +8,7 @@ import javax.imageio.ImageIO; import javax.swing.JFrame; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.Timer; @@ -19,14 +20,17 @@ public class Game { private int[][] tilelayout = new int[13][14]; private String[] tileID = {"AIR", "ground"}; private int offset = 0; -// private int[] tileData = {1, 2}; + private int fitness = 0; + private boolean isDone = false; private Timer repaint = new Timer(60, new ActionListener(){ public void actionPerformed(ActionEvent e) { frame.repaint(); -// frame.dispose(); -// JOptionPane.showMessageDialog(null, "You died!\nPoints: " + ((Integer) movey).toString(), "You lost!", JOptionPane.WARNINGMESSAGE); -// repaint.stop(); -// } + if (m.y < 0) { + frame.dispose(); + isDone = true; + repaint.stop(); + System.out.println(fitness / 48); + } } }); @@ -39,6 +43,18 @@ private void start() { repaint.start(); } + public void jump() { + m.jump(); + } + + public void moveRight() { + m.moveRight(); + } + + public void moveLeft() { + m.moveLeft(); + } + @SuppressWarnings("serial") private void makeFrame() { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -53,7 +69,7 @@ public void paintComponent(Graphics g) { for (int x = 0; x < tilelayout[0].length; x++) { tilelayout[tilelayout.length - 1][x] = 1; } - printArray(tilelayout); +// printArray(tilelayout); panel.repaint(); panel.setPreferredSize(new Dimension(624, 624)); panel.addKeyListener(keys); @@ -64,7 +80,7 @@ public void paintComponent(Graphics g) { } - private void printArray(int[][] t) { +/*/ private void printArray(int[][] t) { for (int [] y : t) { for (int x : y) { System.out.print(x + ", "); @@ -72,7 +88,7 @@ private void printArray(int[][] t) { System.out.println(); } } - +/*/ private void loadNext() { for (int y = 0; y < tilelayout.length; y++) { for (int x = 1; x < tilelayout[0].length; x++) { @@ -107,8 +123,9 @@ private int[] getNewLine() { } private void draw(Graphics g) { - System.out.println(offset); +// System.out.println(offset); offset += m.draw(g, tilelayout, offset); + fitness += offset; while (offset >= 48) { loadNext(); offset -= 48; diff --git a/src/Mario.java b/src/Mario.java index 05d0924..5ad3f22 100644 --- a/src/Mario.java +++ b/src/Mario.java @@ -18,8 +18,22 @@ public Mario(int x, int y) { this.y = y; } - public boolean collided(int x1, int y1, int x2, int y2) { - return true; + public boolean collided(int x2, int y2) { + System.out.println(Math.abs(x - x2)); + System.out.println(Math.abs((618 - y) - y2)); + return ((Math.abs(x - x2) < 48) && (Math.abs((618 - y) - y2) < 48)); + } + + public void jump() { + y_vel = 48; + } + + public void moveRight() { + x_vel += 1; + } + + public void moveLeft() { + x_vel -= 1; } public void key(int[] useKeys) { @@ -27,13 +41,13 @@ public void key(int[] useKeys) { // System.out.print(useKeys[1] + " "); // System.out.println(useKeys[2]); if ((useKeys[1] == -1) && (inAir == false)) { - y_vel = 48; + jump(); } if (useKeys[0] == 1) { - x_vel += 1; + moveRight(); } if (useKeys[0] == -1) { - x_vel -= 1; + moveLeft(); } if ((useKeys[2] == 1) && (useKeys[0] != 0)) { @@ -55,8 +69,8 @@ public int draw(Graphics g, int[][] t, int offset) { if (tiley < 0) { tiley = 0; } - if (tiley > 13) { - tiley = 13; + if (tiley > 11) { + tiley = 11; } // System.out.println(tilex); // System.out.println(tiley); @@ -65,13 +79,13 @@ public int draw(Graphics g, int[][] t, int offset) { ti = true; } else { - ti = t[tiley - 1][tilex] == 1; + ti = t[tiley - 1][tilex] == 1 && collided(tilex * 48 - offset, (tiley - 1) * 48); } if (ti && y_vel > 0) { y_vel = 0; } - + if (t[tiley + 1][tilex] == 1) { inAir = false; y = y / 48 * 48; @@ -83,7 +97,7 @@ public int draw(Graphics g, int[][] t, int offset) { inAir = true; } - if (t[tiley][tilex + 1] == 1 && x_vel > 0) { + if (t[tiley][tilex + 1] == 1 && x_vel > 0 && collided((tilex + 1) * 48 - offset, tiley * 48)) { x_vel = 0; } @@ -91,7 +105,7 @@ public int draw(Graphics g, int[][] t, int offset) { ti = true; } else { - ti = t[tiley][tilex - 1] == 1; + ti = t[tiley][tilex - 1] == 1 && collided((tilex - 1) * 48 - offset, tiley * 48); } if (ti && x_vel < 0) { From 236ae3df444497aa72f4a04164c96bd8318ffe9b Mon Sep 17 00:00:00 2001 From: avighna Date: Thu, 2 May 2019 10:07:02 -0700 Subject: [PATCH 06/21] Better collision --- src/Game.java | 14 +++++++++++--- src/Mario.java | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/Game.java b/src/Game.java index b417cd6..0c2dd57 100644 --- a/src/Game.java +++ b/src/Game.java @@ -8,7 +8,6 @@ import javax.imageio.ImageIO; import javax.swing.JFrame; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.Timer; @@ -69,6 +68,7 @@ public void paintComponent(Graphics g) { for (int x = 0; x < tilelayout[0].length; x++) { tilelayout[tilelayout.length - 1][x] = 1; } + tilelayout[tilelayout.length - 2][13] = 1; // printArray(tilelayout); panel.repaint(); panel.setPreferredSize(new Dimension(624, 624)); @@ -109,12 +109,20 @@ private int[] getNewLine() { for (int y = 0; y < tilelayout.length; y++) { lastcol[y] = tilelayout[y][tilelayout[y].length - 2]; } - + for (int y = 0; y < lastcol.length; y++) { if (lastcol[y] == 1) { - ans[(int) (Math.random() * (lastcol.length - y + HEIGHT)) + y - HEIGHT] = 1; + try { + ans[(int) (Math.random() * (lastcol.length - y + HEIGHT)) + y - HEIGHT] = 1; + } catch (IndexOutOfBoundsException e) { + System.out.println("ERRRRRROOOOOOOOOOOAAAAAAAARRRRRR"); + System.out.println(y); + System.out.println(HEIGHT); + System.out.println(lastcol.length); + } } } + ans[(int) (Math.random() * (lastcol.length))] = 1; ans[(int) (Math.random() * (lastcol.length))] = 0; diff --git a/src/Mario.java b/src/Mario.java index 5ad3f22..04d9648 100644 --- a/src/Mario.java +++ b/src/Mario.java @@ -9,6 +9,9 @@ public class Mario{ int x = 0; int y = 0; + int prev_x = 0; + int prev_y = 0; + final int MAX_SPEED = 24; double x_vel = 0; double y_vel = 0; boolean inAir = true; @@ -19,8 +22,8 @@ public Mario(int x, int y) { } public boolean collided(int x2, int y2) { - System.out.println(Math.abs(x - x2)); - System.out.println(Math.abs((618 - y) - y2)); +// System.out.println(Math.abs(x - x2)); +// System.out.println(Math.abs((618 - y) - y2)); return ((Math.abs(x - x2) < 48) && (Math.abs((618 - y) - y2) < 48)); } @@ -74,6 +77,11 @@ public int draw(Graphics g, int[][] t, int offset) { } // System.out.println(tilex); // System.out.println(tiley); + if (t[tiley][tilex] == 1 && collided(tilex * 48 - offset, tiley * 48)) { + x = prev_x; + y = prev_y; + } + boolean ti; if (tiley == 0) { ti = true; @@ -111,6 +119,24 @@ public int draw(Graphics g, int[][] t, int offset) { if (ti && x_vel < 0) { x_vel = 0; } + + Image img; + try { + img = ImageIO.read(new File("mario.png")); + g.drawImage(img, x, 624 - y, null); + } catch (IOException e) { + // 1 2 Oatmeal + } + + if (x_vel > MAX_SPEED) { + x_vel = MAX_SPEED; + } + if (x_vel < -MAX_SPEED) { + x_vel = -MAX_SPEED; + } + + prev_x = x; + prev_y = y; x = (int) Math.round(x + x_vel); y = (int) Math.round(y + y_vel); @@ -128,14 +154,8 @@ public int draw(Graphics g, int[][] t, int offset) { x_vel = 0; } } - - Image img; - try { - img = ImageIO.read(new File("mario.png")); - g.drawImage(img, x, 624 - y, null); - } catch (IOException e) { - // 1 2 Oatmeal - } + System.out.println(x_vel); + System.out.println(y_vel); return answer; } } From 4ebbef109239c88585b39d3a39258db1a4c95b66 Mon Sep 17 00:00:00 2001 From: avighna Date: Thu, 2 May 2019 10:10:08 -0700 Subject: [PATCH 07/21] Better collision --- src/Keyboard.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Keyboard.java b/src/Keyboard.java index 107eb8a..f0dc987 100644 --- a/src/Keyboard.java +++ b/src/Keyboard.java @@ -15,6 +15,7 @@ public Keyboard(Mario m) { @Override public void keyTyped(KeyEvent e) { // System.out.println("What"); +// Hello???? } @Override From fb896ebea6891841ebb2cc9bb0cd6d05d94dbca4 Mon Sep 17 00:00:00 2001 From: avighna Date: Fri, 3 May 2019 10:01:16 -0700 Subject: [PATCH 08/21] More Strict Collision --- src/Mario.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Mario.java b/src/Mario.java index 04d9648..fdce8a2 100644 --- a/src/Mario.java +++ b/src/Mario.java @@ -11,7 +11,7 @@ public class Mario{ int y = 0; int prev_x = 0; int prev_y = 0; - final int MAX_SPEED = 24; + final int MAX_SPEED = 48; double x_vel = 0; double y_vel = 0; boolean inAir = true; @@ -92,6 +92,7 @@ public int draw(Graphics g, int[][] t, int offset) { if (ti && y_vel > 0) { y_vel = 0; + y = y / 48 * 48; } if (t[tiley + 1][tilex] == 1) { @@ -107,6 +108,7 @@ public int draw(Graphics g, int[][] t, int offset) { if (t[tiley][tilex + 1] == 1 && x_vel > 0 && collided((tilex + 1) * 48 - offset, tiley * 48)) { x_vel = 0; + x = tilex * 48 - offset; } if (tilex == 0) { @@ -118,6 +120,7 @@ public int draw(Graphics g, int[][] t, int offset) { if (ti && x_vel < 0) { x_vel = 0; + x = tilex * 48 - offset; } Image img; @@ -134,6 +137,13 @@ public int draw(Graphics g, int[][] t, int offset) { if (x_vel < -MAX_SPEED) { x_vel = -MAX_SPEED; } + if (y_vel > MAX_SPEED) { + y_vel = MAX_SPEED; + } + if (y_vel < -MAX_SPEED) { + y_vel = -MAX_SPEED; + } + prev_x = x; prev_y = y; From 0ae6d2515777ff9a1c675a463726ac836fde9172 Mon Sep 17 00:00:00 2001 From: avighna Date: Fri, 3 May 2019 19:21:05 -0700 Subject: [PATCH 09/21] hope it works --- src/Mario.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Mario.java b/src/Mario.java index fdce8a2..5ea6f37 100644 --- a/src/Mario.java +++ b/src/Mario.java @@ -11,6 +11,7 @@ public class Mario{ int y = 0; int prev_x = 0; int prev_y = 0; + int movedTilesInFrame = 0; final int MAX_SPEED = 48; double x_vel = 0; double y_vel = 0; @@ -156,6 +157,7 @@ public int draw(Graphics g, int[][] t, int offset) { } if (x > 312) { answer = x - 312; + movedTilesInFrame = answer / 48; x = 312; } if (x < 0) { @@ -164,8 +166,10 @@ public int draw(Graphics g, int[][] t, int offset) { x_vel = 0; } } - System.out.println(x_vel); - System.out.println(y_vel); +// System.out.println(x_vel); +// System.out.println(y_vel); +// System.out.println(Math.hypot(x - prev_x, y- prev_y)); +// System.out.println(x); return answer; } } From 3abc5abd80b9be10215581b4081b87e2c59eaba7 Mon Sep 17 00:00:00 2001 From: avighna Date: Mon, 6 May 2019 13:29:46 -0700 Subject: [PATCH 10/21] test --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ae3c172..81325b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /bin/ + From efbfd48bef5fb8ffac259c06d11dc03968860857 Mon Sep 17 00:00:00 2001 From: avighna Date: Mon, 13 May 2019 06:43:19 -0700 Subject: [PATCH 11/21] final fixes --- .classpath | 2 +- .gitignore | 2 - .project | 2 +- bin/Activation.class | Bin 0 -> 997 bytes bin/Game$1.class | Bin 0 -> 1237 bytes bin/Game$2.class | Bin 0 -> 773 bytes bin/Game.class | Bin 0 -> 5766 bytes bin/GeneticAlgorithm.class | Bin 0 -> 3229 bytes bin/Individual.class | Bin 0 -> 2916 bytes bin/Keyboard.class | Bin 0 -> 1354 bytes bin/Mario.class | Bin 0 -> 3188 bytes bin/NeuralNetwork.class | Bin 0 -> 3907 bytes bin/NeuralNetworkTester.class | Bin 0 -> 3818 bytes bin/Neuron.class | Bin 0 -> 4504 bytes bin/Trainer.class | Bin 0 -> 729 bytes src/Activation.java | 4 + src/Game.java | 39 +++++++-- src/GeneticAlgorithm.java | 106 ++++++++++++++++++++++++ src/Individual.java | 82 +++++++++++++++++++ src/Mario.java | 19 +++-- src/NeuralNetwork.java | 121 +++++++++++++++++++++++++++ src/NeuralNetworkTester.java | 101 +++++++++++++++++++++++ src/Neuron.java | 148 ++++++++++++++++++++++++++++++++++ src/Trainer.java | 13 +++ 24 files changed, 619 insertions(+), 20 deletions(-) delete mode 100644 .gitignore create mode 100644 bin/Activation.class create mode 100644 bin/Game$1.class create mode 100644 bin/Game$2.class create mode 100644 bin/Game.class create mode 100644 bin/GeneticAlgorithm.class create mode 100644 bin/Individual.class create mode 100644 bin/Keyboard.class create mode 100644 bin/Mario.class create mode 100644 bin/NeuralNetwork.class create mode 100644 bin/NeuralNetworkTester.class create mode 100644 bin/Neuron.class create mode 100644 bin/Trainer.class create mode 100644 src/Activation.java create mode 100644 src/GeneticAlgorithm.java create mode 100644 src/Individual.java create mode 100644 src/NeuralNetwork.java create mode 100644 src/NeuralNetworkTester.java create mode 100644 src/Neuron.java create mode 100644 src/Trainer.java diff --git a/.classpath b/.classpath index f00af9b..d655412 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,6 @@ - + diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 81325b3..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin/ - diff --git a/.project b/.project index fb4cb30..eab011b 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - frogger + Full algorithm diff --git a/bin/Activation.class b/bin/Activation.class new file mode 100644 index 0000000000000000000000000000000000000000..be807e67858eeecd50a103611675a43a0431c2fe GIT binary patch literal 997 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 J^67Pk{{zHI^CtiR literal 0 HcmV?d00001 diff --git a/bin/GeneticAlgorithm.class b/bin/GeneticAlgorithm.class new file mode 100644 index 0000000000000000000000000000000000000000..039a013fcbb857316c09ec3d5fbd231722205780 GIT binary patch literal 3229 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 literal 0 HcmV?d00001 diff --git a/bin/Keyboard.class b/bin/Keyboard.class new file mode 100644 index 0000000000000000000000000000000000000000..1de52e49ea14bc247c551a03bc7de0e2b8d9bf3b GIT binary patch literal 1354 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 GH~$Zu{!-Hb literal 0 HcmV?d00001 diff --git a/bin/NeuralNetwork.class b/bin/NeuralNetwork.class new file mode 100644 index 0000000000000000000000000000000000000000..480a6eee484f6fa8dd3b76b2c6e9fac875d7d39f GIT binary patch literal 3907 zcmai0TXS1i75=t#Bw6b5CAQ^6aT=>>X=N#?lK^gOhlDgv8Wq`YoW!Y}HuTs!R!%HS zMn1Bg7ATjHmiuLxDZ>}dW*R$?87RYBhWr9vcw>g)k*81^zO~QM#YUajGw1BH z_u6Z(^?l!3TlYTx!yf?*<0laW6xt{3YQ-u}*zQ`nvKWD(&~?pPwT6mTsW3D-cg>!6 z6{4l;Qns{QbypNrRw1(BxFvf7MeDj<;YU2Dw^m)JICQd7v99Nw6?c@|&pU;Z z1zU#9s8%*^2WfL#07Bg2%bV3q*_uOoR}Q zVIQ6le+ML(=2)_W)8gqV6Q9D>F8L7ir7A=csI)c{}_BI;WRJG(f zOZMsYd3#xUMH{XtWX7wm?i|S}Ql2b0t9B{rtRzciH#x^fX!G-M(kkVXN0KpI#v5{i zwWEyByA`KYVDFI_=1t_m1fnEU*AMyHooWe<7GA-`G)Qj0moR&nPK<9qMUJFBT$47k z$U+^h)FCPtq{^WUy2^qMt`8y(J$9fq~Maz$PZ>sn!ITL_nwb3XkP==}n97=`|%)@)f)t!B-V_H3Ie}AZ7A3os5r+E{>W$DC!~) zUux7sx|KScMOfP^*F%i?pQ+tS2J27v_IFG~&_>rR${5M}=@zMU}MvI*8gAiwu-A-RbsFKyuI`dpuHXXH2W%!laW7T@ZIq2fmWt%tuCi$k*ScRa;F zhR*{!u5Lbi7)LMmAdZ9BjY)pLiUcfPya#Fb880#%!n6Ehj2L2ON{FMqx(UV}f-u7OIYMv|hjE4TOH5s0I!g)}b{(cQ zWHre$_cBuo(36WVaL%B=MdUaNG36_SEX@Bn@4X4WBO1CStz~DHbcm#6=VX27BzFp& zy)ZsTH{ldSKSD@7^#D(5SYN5bdQJ;W_6E2kn$GlMY7-YE(V*6W$K|k2qR%s`ClU3N zsIf^0en?Sv%S${;IQuih7O?K$g_))12MO`AA!))oe5oYFH-P64BHhENsH@WYM%kpYm%@ z3AICinlKWfO%xMGLkTakvjC^ij?*lQGer0-!OD{Nm)Uo-WNjQ5_?#s}%XkGhsgGaq z`vcDZg)8@{6;a572NG?(Lb{JHaU_Lw9~G^Tc6^8x&Kb17Mb1SbLm2QCa*kG>RxaUn zUn|R`s)|+azRA*E<0x7$JR42L#wAQLA->@z1ev7UPGm*_|s@z5Q7SyLEN@epZY!Tn8YlD(@vVFdiu zW>mfQGsAcV+{R65m;qfVFH)g z1L-Y%Cmp=L%ufjnT>NZ)!>nCAfZ3V literal 0 HcmV?d00001 diff --git a/bin/NeuralNetworkTester.class b/bin/NeuralNetworkTester.class new file mode 100644 index 0000000000000000000000000000000000000000..1b65be05f33b872339b98b8c7a2a2169a6e8c178 GIT binary patch literal 3818 zcmb7H`&S%i8GgRKFv~JYkN~A^NJ*Ltmn9_BV8|vUgo~x!kjny*q|pq!Q!>divko&P z)Jx3~FTJRz-fB}#jjf{f)<#`OsXhMa@lWu-=sEt>qvG?;%r3jQ=}`zX-{t+@@A=;M zdERgGw|~F)0f0Vypdci$eOz~KEjO+^H!S=5gg)=+wt|R2{WWbt>&a>6Y|ojQYkI~} zP$SUljk=DJ>&aMV#j#!4AXE11j6kdQv#78E33y5Mx6=;F@bF< z!_>#!xf$J_@K-dXtc;eM(riQagTaV%)tDD(N>xFZq}w^oFa?_1FQqn6rXAZbXOnW< z_{hzSo_7q(oLA5&uyey|%;W)WH}B}#l97UDf&EoaHgZ$X@U)g$GLEAKk0^M!=yh`} z{1uixui{bc5NI&<8>7ZeJv(vL*0tyrst=kJmMo-paC)yM|R*{hO zBGWXdVi$HZ(w6JUPxKRd1&@5)w8{dIv6(HqqJoU?EBv+C=m7XCm^_UjA{+U{#f<( zrSl5Z7L9wkn1Gur#lDy?3jXPjcXh06deFAD#gsAc1cP4ArL1RlJ2}8#fh}oA%UnOL z<%{J+!k`d}H1RT2@3nq2z549i)V3F!7K~eV8$^PG+BUD7`R4*^Lok^P*WQ-RK*qK zRLp@jF{Wj+DQ!__dh6TA%B_6Ac@>|ReiR;T&N8xcFP19D^F5)N+;^cEjLI;@;i4{% zMSMZQa}_mX*m7CAWzG1atOLX4V)W+-(Z!clJddxCyM(x@UIf(bxL9+Nca!|7Ioaqp zc3ztRRV(i3e&n(E>;6}Ry^sWERnN6)-@$71*i`=f(nDQWPAEE+$RAurxK9?gTG$M7>2F=^Y@ ztKcoR<;E6E;+yz|ie>y#>e!mgYqmaNk!k5AC5!LtfsJDQ{;`iRgqFj*g8#Y3s^ z@uiTsht@SbKD}cVdsooaaG-#L1$?rABWn=TD>yzLypKl0ebKJ&`xpq}J{ZIc6`kev z0v$&@V4VadA=MCCjDYG0XAc1-2d@3Qou{GUYUok%_Q3 zjZ18W@XV$_7jXFQe4OFW`Dt>>jKK zyf@F=Wp-x6WdmCvw$yMNHpSBu~}`b5nm0ayAlO_O`as|W#$w!0ZOda%g0_k z%((8tepcOf9OAPdoft$H#u)K)=*C4HfKL9IILM-X2uoC^%vhU$!V=wX;RU?NaGs-w zm+&$pB6A{1>5qJiBLd$pGCDNPtVu%lJTOMZiPMQ7c!?l*iLOR`XBDrEhx;Pk1^l3Z zAMuRx^#-;^`Xc0W!;eW{vUM4~U7Tu)7I5b;a0AP-?#7C{T(J}tP0_&D-Sxk2?T?20 zlx3vDeX(WqwRlraitno_=DpvP2sV!u@bgT6bSWm9V$xf2n%m!9e}734O-gB#<(BBy zS8t;=5MjfwD8UxO{k1Pa9;YdC8+Gzbzav7aeLs;lcCg*gAReW#l1$`r?52=9`T5z) z6ecmm-Z14cLb;4Gkx%jx8N)4#Y>6^^nf=!(t~<1Ni_&_ViTXR=AL0zF#H3I#C3fP1 z*o8}CAD$5hNOYNaPbZ?Mn0U^;<0XE#*n)T23UTLu;2v9H?*AeFfIm`am)ZW4C)GQ6 z1qG}y{deh6jw!qyp28|yF;A=mh_4fFQ~^O;@&6IhKM@sOp>htYOmQmY{jGV=_X9=$`9EZkvXTG* literal 0 HcmV?d00001 diff --git a/bin/Neuron.class b/bin/Neuron.class new file mode 100644 index 0000000000000000000000000000000000000000..bd0448ecc3c273391625f4d621c88718b5d12389 GIT binary patch literal 4504 zcmb7GYjjlA75+|UGIugu5)&pN4=e+sOdb$ljY1Ft1n6i0OK6Z+;WBegE@WoXnL7cr zFDdnHtM+BBtzs$ZOA#uQD6PBXP1P0R;U5Mn6at&lnArgQs-?e3La=ild8bgOz5 zLRQ>$MlIJ#rxeV-)uk_*g$8YRTQP>Y(HVE3S^La0@3!~abiy`Jr!Z%Rq^h70Hc^Q{ z2(@T1F&B*lYK4<>+?5JV(XuSpriX_K6eI6$9Z;z0b5i!ETymeC*=jLUg}T0U+!`LR zGLC!~2L0}k!`y>?9{7@Gwk*xY@*SqImJK>)oSHFBF;@o_8m32Zc%&GGL1@=#5`59t zUdj4m6IBS2bw=aO_@lkz$DgtfuAxAp<>bU#2SV_nT>$D(ppyY{ved*Zm?2z>%MDzn zP(7upjg~uP;tE_uI5So%kxmABs73h`sM|xh8p{nVntS2#3 zYUG-cOnSr`v|JMVZX{99{|`yM67h8=`mm8OXPukqnn=bBY^I#1pj(&8q%%RhUm>ES zj)-Yw&>6K;5hoi-rQL{?&9W5jL~3%;)5{B2sb4j`$VQx%h$^R^nSjx2r?F^fc2gG3$H{oVhqvP5c%S~rkGSj+AtT5g^ z3m?J941APTJ=HdfvnD={TXdxyVi@6~hq7+kZQv6MwNsoHBB{bBahri#r>VaGaMrbn z#qGF*=%sVQktbv)-Fdy_N;YjPNvC%y%$;)Tk-R473@7YN2uE;_iBE~Rf?T873*lbe zZ{WV^`)O@Rm3`(NYAEO?ggen6#OD<%IwJD%fQc{SK~iCjjMypGS`mDmbWv?(7C6EsBJ-Wy#lk?Q0wS906vxiL-Wk zI)gcSaVQt$u z+S=OBU`g8qI>Wf~K+PbXYYfKGMF@N=$IvX;mgXmLRUX%DJL*#x&O0{wuPKZcGG7oa zKf|cv_6-Dk0inKxU@zx$4G|GC+Ptkx0j`yM5Cda4SWT-6;x(V|YnW~?N9#~ANhf{- z%D_5B!v>v9M136 za@GZSA*jY>Xym1_8CMeM_wsIcC9cC&*n(x)MFP@Tfy1~4w{qrQ^x#nfJVnRx5*^3k zYAHAK*vS!*3R1UJ)8Qwb#aa?8k+%?3jX>j@Fnnsk>*#1`A^D?a^>t87|1m}@>g{RE z(WQH^u?s z*UMWJ53Hv=HZZ>R%rwT#uGKkt<=KO8FcT5bJbV-1Vzg87%iOm)C-K*cz=H4@d^31D z;$o)o7#`;W%A#TwH=IRz_!;_1vdTc^p_OrJd);@&apv4vsO{s(FV{B9D}7yo`ar?l zpP0aSmr)<+3XUPoGFn#ESQUNXAA7u4BplHs{LzCVTyja6a%h!zXQLbj_9 z7UkyI{Y2Z%mucB$rs<k&#ydwHiiX_hPP!+ zlceyh9yFUo#q!?dZ>r4WmrZ_YuO9pv-AZpDWZNm79W1h)tn6J_!t3re*h66Vk`N2m zV;@K2xDg3nWo=~mb}I&X*BZio*w1^&0b;!e;}qzRDXM2Fy5CViuizm5i9`4gZ=J7G zDvHF2TyLZ#$pwC`_m{Wd@QwA)x8G{HF2bwyFpqJz;blBW2~;ww7x8-vKET*+$MbwM z*lR|$tb>d*fj@9<6?b2*-;9z}JRd>&5UE^&P|I7W)vc&jy@>{;-oPT?;@8na4YkA2 zGm27Tuc}p4d^kwQyjyr;!a$*mhtJ{#D(0n)9WBiX|K2?Q*t}QtSl-ibp(u~&q$9d^ z!uT@-m%lLY{%hzl$j12>{FSQ|lYXtRhnF(2yE<0TDqD%y%z}y?>!j{t(Wq9|yEd}H zsYWJpKQ{TC?q#9~PU!~ZosC}Kzl}lMfjMj%jkufTe-B&C-Pp`lvlI90B)q=AyVPiQ kYnFJOp@r9ITG+Cr@B1~@v*3FJjr>)rMa=AP8lAuY7jkIl1^@s6 literal 0 HcmV?d00001 diff --git a/bin/Trainer.class b/bin/Trainer.class new file mode 100644 index 0000000000000000000000000000000000000000..a2e74a2fbeff0bad263d7ce623ce0930ad4c3cb1 GIT binary patch literal 729 zcmZuu%Wl&^6g}fSoJ`%;eUR`d73Ec@mGF*D5ePv+kt|rGid1zqaYyb{&bXS4QGbag zn?|A%AAsOb_y)usH)>E-FYfqWpE>8;s<&t4FDN>OSg;B1b z4eRzqO&HqAOm2^;#w5(piH?%F?7$kOvppxp_s>&#W>ujlK2{kv=cvB6(wOqh%HwO0 zk9CIa3R7B@$7!L{(io|2ynilJnicvQ%t2mU=?1v#)@V$uFtl!6n2da`-QtOXSsxE6 zrH@ietJ1f5Rv2YZ#?3c>e!1s2#|E}sFpnv?=zYK68@ka`C-RKQBN{MxnQ$rHWT8m- zpeRi$KPZ=DFpKJi+X-7_wnqOARLL%yRDJ4VIvJgfohe%1=*0u4>OMQ@0@dIOK<6TL zZ7gA#P+^7gu!6OUs82JGW{a0#hf~~1b}!JG6E0Qi4YY_lpbL(;b9DjtaG$ysxq3hn z&JSgJi^QOs0^Lh&9Ij(C 300) { frame.dispose(); isDone = true; - repaint.stop(); - System.out.println(fitness / 48); + if (isDone) { + repaint.stop(); + + System.out.println(fitness / 48); + } } } }); @@ -37,11 +43,22 @@ public static void main(String[] args) { new Game().start(); } - private void start() { + void start() { + System.out.println("THREAD: "+Thread.currentThread().getId()+ " "+getFitness()); makeFrame(); repaint.start(); } + public double[][] getState() { + double[][] doubles = new double[tilelayout.length][tilelayout[0].length - 1]; + for(int i = 0; i < tilelayout.length; i++) { + for(int j = 0; j < tilelayout.length - 1; j++) { + doubles[i][j] = tilelayout[i][j]*5; + } + } + return doubles; + } + public void jump() { m.jump(); } @@ -53,7 +70,11 @@ public void moveRight() { public void moveLeft() { m.moveLeft(); } - + + public double getFitness() { + return fitness; + } + @SuppressWarnings("serial") private void makeFrame() { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -64,6 +85,7 @@ public void paintComponent(Graphics g) { draw(g); } }; + panel.setBackground(new Color(111,196,249)); frame.add(panel); for (int x = 0; x < tilelayout[0].length; x++) { tilelayout[tilelayout.length - 1][x] = 1; @@ -155,3 +177,4 @@ private void draw(Graphics g) { } } } + diff --git a/src/GeneticAlgorithm.java b/src/GeneticAlgorithm.java new file mode 100644 index 0000000..db44e4f --- /dev/null +++ b/src/GeneticAlgorithm.java @@ -0,0 +1,106 @@ +import java.util.ArrayList; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class GeneticAlgorithm { + private ArrayList individuals = new ArrayList (); + private double mutationRate; + private int popSize; + private int numInputs; + +/** + * @author - Sri Kondapalli + * @param mutationRate - + * @param popSize + * @param numInputs + */ + + public GeneticAlgorithm(double mutationRate, int popSize, int numInputs) { + this.mutationRate = mutationRate; + this.popSize = popSize; + this.numInputs = numInputs; + } + + public void start(int times) throws InterruptedException, ExecutionException { + for (int i = 0; i < times; i++) { + main(); + } + } + + + private void main() throws InterruptedException, ExecutionException { + ExecutorService service = Executors.newFixedThreadPool(10); + ArrayList> futures = new ArrayList>(); + for(int i = 0; i < popSize; i++) { + Individual ind = new Individual(numInputs); + futures.add(service.submit(ind)); + } + /** + * @author Sri Kondapalli + * places an Individual ind into a sorted ArrayList + */ + Thread.sleep(5000); + for (int i = 0; i < futures.size() - 1; i++) { + System.out.println(i); + Individual ind = futures.get(i).get(); + // add in a sorted manner into individuals ArrayList. + if (individuals.size() == 0) individuals.add(ind); + System.out.println("GOT HERE " + individuals.size()); + + boolean didAdd = false; + int size = individuals.size(); + for(int j = 0; j < size; j++) { + if (ind.getFitness() >= individuals.get(j).getFitness()) { + individuals.add(j, ind); + didAdd = true; + } + } + if (!didAdd) { + individuals.add(0, ind); + } + } + + select(); + } + + + private void select() { + + /** + * @author Sri Kondapalli + * + * Adds the best individuals from the individuals arrayList, and reproduces pairs of best 70 individuals + * adds 30 new individuals to maintain population size(100). + */ + + ArrayList theBest = new ArrayList(); + for(int i = 0; i < individuals.size()*0.03; i++) { + theBest.add(individuals.get(i)); + + } + for(int i = 0; i < individuals.size()*0.69; i++) { + NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); + NeuralNetwork m2 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); + + theBest.add(new Individual(m1)); + theBest.add(new Individual(m2)); + } + for(int i = 0; i < individuals.size() * 0.30; i++) { + theBest.add(new Individual(numInputs)); + } + individuals = theBest; + while(mutationRate - 0.1 >= 0.01) { + mutationRate -=0.1; + } + } + +} + + + + + + + diff --git a/src/Individual.java b/src/Individual.java new file mode 100644 index 0000000..56d3f77 --- /dev/null +++ b/src/Individual.java @@ -0,0 +1,82 @@ +import java.util.ArrayList; +import java.util.concurrent.Callable; + +public class Individual implements Callable { + private NeuralNetwork network; + private Game game; + public Individual(int numInputs) { + network = new NeuralNetwork(numInputs); + network.addLayer(40, Activation.ReLu); + network.addLayer(4, Activation.Sigmoid); + } + + /** + * @author Sri Kondapalli + * @param NeeralNetwork passed in as a requirement for pairs of individuals to reproduce + */ + public Individual(NeuralNetwork n) { + network = n; + } + + public double getFitness() { + return network.getFitness(); + + } + + public void play() { + game = new Game(); + game.start(); + boolean isDone = false; + while (true) { + double[][] state = game.getState(); + ArrayList newState = new ArrayList(); + + for(int r = 0; r < state.length; r++) { + for(int c = 0; c < state[r].length; c++) { + newState.add(state[r][c]); + } + } + + ArrayList actions = network.predict(newState, 0); + if (actions.get(0) == -1) { + continue; + } + + boolean isMovingRight = false; + if (actions.get(0) >= 1) { + game.moveRight(); + isMovingRight = true; + } + if(actions.get(1) >= 1) { + game.jump(); + } + if(actions.get(2) >= 1) { + if (!isMovingRight) { + game.moveLeft(); + } + } + isDone = game.isDone; + if (isDone) { + network.setFitness(game.getFitness()); + System.out.println("done boi"); + break; + } + } + game = null; + } + public NeuralNetwork getNN() { + return network; + + } + + @Override + public String toString() { + return "Individual"; + } + + @Override + public Individual call() throws Exception { + play(); + return this; + } +} diff --git a/src/Mario.java b/src/Mario.java index 5ea6f37..04920ae 100644 --- a/src/Mario.java +++ b/src/Mario.java @@ -11,8 +11,7 @@ public class Mario{ int y = 0; int prev_x = 0; int prev_y = 0; - int movedTilesInFrame = 0; - final int MAX_SPEED = 48; + final int MAX_SPEED = 24; double x_vel = 0; double y_vel = 0; boolean inAir = true; @@ -79,6 +78,12 @@ public int draw(Graphics g, int[][] t, int offset) { // System.out.println(tilex); // System.out.println(tiley); if (t[tiley][tilex] == 1 && collided(tilex * 48 - offset, tiley * 48)) { +// System.out.println("SUGONDESE"); +// System.out.println(x); +// System.out.println(y); +// System.out.println(prev_x); +// System.out.println(prev_y); +// System.out.println("CO"); x = prev_x; y = prev_y; } @@ -138,9 +143,6 @@ public int draw(Graphics g, int[][] t, int offset) { if (x_vel < -MAX_SPEED) { x_vel = -MAX_SPEED; } - if (y_vel > MAX_SPEED) { - y_vel = MAX_SPEED; - } if (y_vel < -MAX_SPEED) { y_vel = -MAX_SPEED; } @@ -157,7 +159,6 @@ public int draw(Graphics g, int[][] t, int offset) { } if (x > 312) { answer = x - 312; - movedTilesInFrame = answer / 48; x = 312; } if (x < 0) { @@ -166,10 +167,12 @@ public int draw(Graphics g, int[][] t, int offset) { x_vel = 0; } } + + if (y > 624) { + y = 624; + } // System.out.println(x_vel); // System.out.println(y_vel); -// System.out.println(Math.hypot(x - prev_x, y- prev_y)); -// System.out.println(x); return answer; } } diff --git a/src/NeuralNetwork.java b/src/NeuralNetwork.java new file mode 100644 index 0000000..007e513 --- /dev/null +++ b/src/NeuralNetwork.java @@ -0,0 +1,121 @@ +import java.util.ArrayList; +import java.util.Random; + +public class NeuralNetwork { + private int numInputs = 0; + private double fitness = 0; + private ArrayList> layers = new ArrayList>(); + + /** + * Adds a new layer to the network. No need to add the Input Layer + * + * @author Arjun + * @param numNeurons - Number of Neurons + * @param activation - can choose between ReLu, Sigmoid, Tanh + * @return void + */ + public void addLayer(int numNeurons, Activation activation) { + ArrayList newLayer = new ArrayList(); + for (int i = 0; i < numNeurons; i++) { + if (layers.size() == 0) + newLayer.add(new Neuron(activation, numInputs)); + else + newLayer.add(new Neuron(activation, layers.get(layers.size() - 1).size())); + } + layers.add(newLayer); + } + + /** + * Predicts the result based on current weights and biases. First it takes the input and gives + * it to the first layer, the layer then uses it's neurons to create a new list(neurons use the + * propagate method). This list is the new input and is passed into the next layer. This process + * keeps on happening until the program has reached the last layer, where it then returns the + * index of the highest value neuron(a.k.a the prediction). + * + * @author Arjun + * @param input + * @return prediction + */ + public ArrayList predict(ArrayList input, double thresh) { + ArrayList oldRes = input; + ArrayList newRes = new ArrayList(); + + for (int r=0; r(); + } + return getMaxIndexs(oldRes, 0.5); + } + + public ArrayList predict(ArrayList input) { + return predict(input, 0.9); + } + + /** + * Reproduce two Neural Networks. Analogous to recombination in meiosis. + * @author Arjun + * + * @param nn1 - First Neural Network + * @param nn2 - Second Neural Network + * @param mutationRate - Higher number will result in more mutations, number should be between 0 and 1 + * @return returns the offspring of the two neural networks passed in + */ + public static NeuralNetwork reproduce(NeuralNetwork nn1, NeuralNetwork nn2, double mutationRate) { + NeuralNetwork newNN = new NeuralNetwork(nn1.numInputs); + + if (mutationRate >= 1 || mutationRate < 0) + throw new RuntimeException("Mutation Rate given is not between 0 and 1 "); + + ArrayList> newLayers = new ArrayList>(); + for (int r=0; r()); + } + + for (int r=0; r getMaxIndexs(ArrayList l, double thresh) { + ArrayList maxIndexs = new ArrayList(); + + for (int i=1; i thresh) { + maxIndexs.add(i); + } + } + if (maxIndexs.size() == 0) + maxIndexs.add(-1); + return maxIndexs; + } + + + public void setFitness(double f) { + fitness = f; + } + + public double getFitness() { + return fitness; + } + + public NeuralNetwork(int numInputs) { + this.numInputs = numInputs; + } + + public ArrayList> getLayers() { + return new ArrayList>(layers); + } + + public void setLayers(ArrayList> l) { + layers = new ArrayList>(l); + } +} diff --git a/src/NeuralNetworkTester.java b/src/NeuralNetworkTester.java new file mode 100644 index 0000000..b4b3c98 --- /dev/null +++ b/src/NeuralNetworkTester.java @@ -0,0 +1,101 @@ +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class NeuralNetworkTester implements Callable> { + public static void main(String args[]) throws InterruptedException, ExecutionException { + ExecutorService executor = Executors.newFixedThreadPool(10); + int times = 0; + while (true) { + times++; + System.out.println(times+" times"); + Callable> callable = new NeuralNetworkTester(); + Callable> callable2 = new NeuralNetworkTester(); + + int t = 0; + executor.submit(callable).get(); + executor.submit(callable).get(); + } + } + + + @Override + public ArrayList call() throws Exception { + return testPredict(); + } + + public ArrayList testPredict() { + +// for (int i=0; i<50; i++) { + NeuralNetwork nn = new NeuralNetwork(5); + nn.addLayer(4, Activation.ReLu); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.ReLu); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.Tanh); + nn.addLayer(5, Activation.Sigmoid); + ArrayList in = new ArrayList(); + in.add(1.0); + in.add(2.0); + in.add(1.0); + in.add(2.0); + in.add(5.0); + return nn.predict(in); +// } + + + } + + public void testReproduction() { + NeuralNetwork nn2 = new NeuralNetwork(5); + nn2.addLayer(4, Activation.ReLu); + nn2.addLayer(5, Activation.Sigmoid); + + NeuralNetwork nn1 = new NeuralNetwork(5); + nn1.addLayer(4, Activation.ReLu); + nn1.addLayer(5, Activation.Sigmoid); + + NeuralNetwork nn3 = NeuralNetwork.reproduce(nn1, nn2, 0.1); + + boolean didFail = false; + if (nn3.getLayers().size() != nn1.getLayers().size()) { + didFail = true; + System.out.println("FAIL"); + } + for (int r=0; r weights; + private double bias; + Activation activation; + + public ArrayList getWeights() { + return new ArrayList(weights); + } + + public void setWeights(ArrayList w) { + weights = new ArrayList(w); + } + + public double getBias() { + return bias; + } + + public void setBias(double newB) { + bias = newB; + } + + public Neuron(Activation activation, int numInputs) { + this.activation = activation; + this.bias = (Math.random() * 2) - 1; + weights = new ArrayList(); + for (int i = 0; i < numInputs; i++) { + weights.add((Math.random() * 2) - 1); + } + } + + public Neuron() { + + } + + /** + * Returns the output of the neuron given the appropriate inputs. First it multiplies each + * input to the corresponding weight, then it sums that value and runs it through an activation + * function so that the output is low and non-linear. + * + * @author Arjun + * @param inputs is an ArrayList + * @return output of the neuron + */ + public double propagate(ArrayList inputs) { + if (inputs.size() != weights.size()) + throw new Error("Input size given is not assigned"); + + double sum = 0; + for (int i = 0; i < inputs.size(); i++) { + sum += inputs.get(i) * weights.get(i); + } + sum += bias; + + if (activation == Activation.Sigmoid) + sum = (1 / (1 + Math.pow(Math.E, (-1 * sum)))); + + else if (activation == Activation.ReLu) + sum = Math.max(0.01 * sum, sum); + + else if (activation == Activation.Tanh) + sum = 2 / (1 + Math.pow(Math.E, (-2 * sum))); + + return sum; + } + + public static void print(ArrayList arrayList) { + for (Integer a : arrayList) { + System.out.print(a.intValue()+", "); + } + System.out.print("\n"); + } + + + /** + * Creates offspring of two parent neurons analogous to meiosis. First it selects one of the two + * parents randomly. Then it copies a random section of the parent's weights and adds it to the + * offspring's weights. + * + * @author Arjun + * @param n1 First Parent Neuron + * @param n2 Second Parent Neuron + * @return offspring of the two neurons + */ + public static Neuron reproduce(Neuron n1, Neuron n2, double mutationRate) { + if (n1.getWeights().size() != n2.getWeights().size()) + throw new RuntimeException("Neuron input sizes are not same while trying to reproduce"); + Neuron n = new Neuron(); + ArrayList newWeights = n1.getWeights(); + int lastRandom = 0; + while (true) { + int rand = randomNum(lastRandom, n1.getWeights().size()-1); + for (int i=lastRandom; i= n1.getWeights().size()-1) { + break; + } + } + + double num = Math.random(); + if (num < mutationRate) + n.setBias(Math.random()); + else if (num < 0.5) + n.setBias(n1.getBias()); + else + n.setBias(n2.getBias()); + + n.setWeights(newWeights); + return n; + } + + private static int randomNum(int min, int max) { + Random r = new Random(); + return r.nextInt((max - min) + 1) + min; + } + + @SuppressWarnings("null") + public double compareTo(Neuron n) { + double sum = 0.0; + + if (n.getWeights().size() != weights.size()) + return (Double) null; + + for (int i=0; i Date: Fri, 17 May 2019 15:56:57 -0700 Subject: [PATCH 12/21] fixed block clipping --- bin/Game$1.class | Bin 1237 -> 1242 bytes bin/Game$2.class | Bin 773 -> 773 bytes bin/Game.class | Bin 5766 -> 5374 bytes bin/GeneticAlgorithm.class | Bin 3229 -> 3973 bytes bin/Individual.class | Bin 2916 -> 3020 bytes bin/Mario.class | Bin 3188 -> 3303 bytes bin/NeuralNetwork.class | Bin 3907 -> 3978 bytes bin/NeuralNetworkTester.class | Bin 3818 -> 3752 bytes bin/Neuron.class | Bin 4504 -> 4425 bytes bin/Trainer.class | Bin 729 -> 734 bytes src/Game.java | 26 +++++--- src/GeneticAlgorithm.java | 108 +++++++++++++++++++++------------- src/Individual.java | 77 ++++++++++++------------ src/Mario.java | 21 +++++-- src/NeuralNetwork.java | 10 +++- src/NeuralNetworkTester.java | 54 ++++++----------- src/Neuron.java | 3 - src/Trainer.java | 3 +- 18 files changed, 170 insertions(+), 132 deletions(-) diff --git a/bin/Game$1.class b/bin/Game$1.class index 2bee90ff50d79ba38c9951ab442193b9ce1232a7..634fb659e4df2ca7636242daf8a09f1f47687209 100644 GIT binary patch delta 496 zcmYL_%T5$g5Qe`q-8kvyXheuZh(U#L8xm$ABGM|LID&GQ>wsiBnGR{fTtW|s8|EQq zg*zUB5huijOBd|j_yBI)`2fZ`852)(s_OsiKUH<=yYs_wul{`b3XHIG?*390hjt!n zfe#c;-ak$s`1v3*?5O53V+y;p?|)FJj3J+Bo*HQ^9~d~UnP5`U6c%#fkwVYTm>|p@ z`um>C3tq;VQn>$FO`2DVcodYUiiKcQ>i1^`)=aS(&1=)}S{Rv>ODD6MIc|zP7e=LG zBwRZSnnjkX$=G1;TUO(&C|dUXBmX!Ry$=h!sg*Dv9B9_eJ3A^DOVxx`Q=Qc->#p+? zi4&mVWjapiGhzQrr^x?Z%X} m(k4jeWnHw2O^KVZygNNoJtH8-7Te-&Sq!|B>xxW?m-81<8(#AO delta 491 zcmZvYOHUJF6o#K~TBtLbMJp%`k&8&UNzyd2MW_l$v8aUr{+^=zFuFHOdoP_#N;)-Br#RWzji%H%a~YRB61gDKudm{!ETTHmc732)yie@?78 zCA(@e6VQb{->vA(l8f+85e;yOJxfr9pPp}*Oy+p62)W;U#iRWF*l`n!Rj2G1{Hkr0 zGQpQ0P4dhu9$34(w&(Sy6#7s;H)ECT%y71KYEHHhGgzV!VOi1kA10F(R%OFVK)zQN zaYNbRwc4F_qB?88LOuE=EoegH)UHF%4x%HcnCJAx)aVft&7z~hiy#Z1F&4yA#t!Lj z&N2-qPslcl5A7_t4HoM{7a}Hp0A2hO(bz?Y96U)68G7YRPnoBWb^7_jAP)ugSY%9# m4%%p!GRW2hpxBT+jFwCb>89iwMYisHaq-*o3_&T0V*dbvKw+-{ diff --git a/bin/Game$2.class b/bin/Game$2.class index baabfae2d73277617037a8c0a2bd64ce6261e5a7..c56c987c79704e482190bfad2f9c92a162598a92 100644 GIT binary patch delta 43 zcmZo=Yh~M@!N_PjS(7oB(QNW`#^a2UljE5pd7~Lv8DbbD8Dbd}8R8}%WpV%j@e&Gn delta 43 zcmZo=Yh~M@!N_PfS(7oB(R}iB#^a2EljE5pd4m~P8A2E&8A2Hp8NwzXWpV%j?>Y)n diff --git a/bin/Game.class b/bin/Game.class index 134469b2b4b91b050d68bc1ecffe818ede480f59..a1a4e13027fd338e99fcf2c66936330a46af988d 100644 GIT binary patch literal 5374 zcmZ`-33yc175?AMo4hbQLI?ywf`SXpf(b^9Kmaib%SggdLV+<_dCa^d1CyEQED%KN zMvGh3YHQWHq19;X4w+D+)V9*au5Pt^ZC$!(7rSe*^gs8#$qXUo`||F4_ug~vIsf_3 zId^#ezfTtw;L)J3wEAoVx`y(t)^@8QX2p9Nf?KxQ;fw}fcZ#bTrnJjie?xjl zl&j~iklAJ~C#|?0J7#&U%yL=l(_plBSgB}&U-~wCXIg{5eYL%FOTtP;IOoqqV|L8i znaJ`mZ&z19Ly1fU+B8h=QinPQb!JjLnGz+5?(VeB-5U2A-O)_kPE)H!fs$ytEfJ@+ z+Ijp?mUG1yjYp!}HJI%Id5K1{me}SIx5o8Z{mK{a)04D=DpPjSipF`swWJd1*?!bvo(P_< zp|bi|&}ue_QD>O&p~S$MghUDZF&}4%*aFT}2LjHvMJC3U?mkBCsaiHRtew>2gv zIRLITF&R^2Zk>rrOqI9wCXRDfH<+lxR0Ep`Mlnb#Lgslx zY_8eh$3|Qzvzr;S>VSinwIkDDZ@1%_hI7K1Xd>PoO=s*lBks7l#l%dUz+h*3qvT47 zql@2tV+Q->;yIW0OX5!;A>F3ES@@Ykiw+X#=oA?AisbLyZug&hZvaw8S zERnW@q@pEw(Wh!M$iP*3^c(%ygYzYF*P1X;YT#2E%2bIFuv-(cM9PoraD#;6MoN)_ z)ZoWW_>6&@M<;-)DJDLPTj(yWXraRniI}M_=|}XcDA(au6Sv`Z!e&JxjKop9`jRXa z@l10~A^xq2{G=FhhlHG|c$aHQgJ^GK6^N(luOD~fEZMf##J#wWgr`kwQ+BtVO4*Ul z=tT_NaYYA?2rAQV!u=*5zyJZEX-u;`-87t7B;*jXXxSBh$ix@%C6+XvxgrtHrk&!V zSD)wL_lSu{@fcaf^>(+o&M4CB%yn3Ct4A?hBK(AjCnfxPlEBKueiMUoh@VO}MAK1K zzqEd`CYG=wYwUiqM#Gm)JcVJ0HEZl0Qt*TdHB!knmQ!Cip~|YKD`4QDA791S4SX$6 z1l4OgtW2+o=Wqo%kh0>DM4y3gFf|ob)D9MIyFZxC1iM?LYNVIRn@8Wb!^q z!YH|hmTWf@!;UCvp70L-WZ;i(`BsUQkBx~x<1b{cL{IHz<0^`eqaaXJw4DRgd~i$J zPHh)PpJ(8&EDQN?1%gG4(R%W&{iuW4+I6{kuv$d>xTUfjR8-u%k{LxtX};vB6i2 zY|OWCx|dhfR4~8bV;+B%8=7WFZhVJkb|$i^uq}M2D{^?ffXY+|#MvENnRjVBjoHi- zFYlBS;gL%Q-#k+C)yUg~8hK4nBX0<5WYbq8TfQ3E@Hs--z4~Ue=g5|W=^V$&-AawT zS*dwm0XTZ3FLRv2(@w-J?w`%CdXDnX@7;%!$|L)5$`kzZV2;dj1n*}$FA*P7vvLY= zU9Rjav|OZj)efPib{KV`iqnSBFo;He%nx}dd6GkD8pJ|=Hiv5WW8n~%3}RVr`GoSa zLul~~qP5od43>wy6)QVKdPSgf5UXpwgXpL&8$?jvJ}i$;d3=OgHio>z2!(iF*APBB z2&-Uh6E9Q(t4^>4s9C%hHPG2+!qhS;YF4{zf^J#q*sPrG-?0BXET2Qam+s&S^Q zai}lt-Lr1DS5x2Ix%bGMyFFT!65o5|<+{hI%&P)^0s{&xA#zKJ)Y(L78BXKKJ1thC zRT)<69PS!68BNF_P17pTh%9mUkbbkVoo`<3ptecSKfp8tDeW+SIaR#RFllnra=mHd zD9Du3oP{~;ETH0`yOJiYDng`m1d(0;Pshchb*!e2_Azzv8aK8bmyXsEq>i;?>bM+N zxH=kKviRsr@G&~&q)~}-u(L?m=Q`n$E3G4})v*{zx;;wa#*!SaB;EH2)2|-HHJrO< z7}tf$6O-`VB)m6->vQMkENj9Rawm*)Ic{QB^`Zv}KCeU+*E2nCVXEAP816?O9^s1Q;#3C(7oi2j zCr2)6ic9hJaW`UqiX9i58b*(cRtMrKbQXk9{UP1AC9vH&% zA`w2I@@Beht`b1`B!YES1u<@Xqu^?-s?)nzzc1$7C9IAY)7@Qk_cFSBIg{oJbaK29 zyOm4xxs&#d1bsf9RxTMhSvlvS)Twv|2kFrgoTOGg%Hf$PISil5oGHwlBa&6Dxdy(X zN%{B4jnd`MLbshs} z^?NY0?f{;hd$3ZE%-p)30*kk z5@V6-VtZ)bRYdD*7Tas-#&zr?*WygvK;Lhq#7&gB85i)o2X`RF-wc=FZiU`b)g>== z(etrre^VjlXSw+n-#pZq#vXg}K!i&C9n$G?sozPnjk6Bi_TI`)LwqXtkx2K_+oE}s{XbuN|9 zyZ6Z3QjB|~7_S!%Qiz-MO8qvp4C95+FkX_5xSG*8fLDg_lZv0_@besA8^Rk0@a7_4 z-E`l~@_D_YEmFl7Cg0l|B?cw=Qm(i>kY_eya?2BRqKiNLZpFJU_)b>d&z|=H!5kn> zA7smah>d0dEqIt!{SlVNN3j8qQSwO=cpv5W<95zJ$o2hXm}I3Bgh4k5ga?1a-+5Xa z8evpZFI;FP&fxi+tH(Oi*+_g4J#~-q9Eg&A_|wL-Ua2 z<)!#H-gCmiv~b#kl+;FPRK+E=T$#qANs;&QpD{!_A08z#y-4IRK5#|mP_5M7lG+)( zY!phrQ@M*}{);1H9J6q=Wfg^EXur5Ho9c_5u||uWP$c5fykm$g8!a-qNJQ6s$2e0r fq?L?z=DxfP|3g#VI<;|{+&U$MA&&BIk2CxaZ>W4g literal 5766 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 J^67Pk{{zHI^CtiR diff --git a/bin/GeneticAlgorithm.class b/bin/GeneticAlgorithm.class index 039a013fcbb857316c09ec3d5fbd231722205780..368f5a67018556db9e58a0a3851b6897a2a0386f 100644 GIT binary patch literal 3973 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 literal 3229 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 diff --git a/bin/Mario.class b/bin/Mario.class index e460fbe9bb597ddd3c69bbb978abf0630ffb8bd1..cdacd8c61cc236afe8998e3b89db69aedd06d493 100644 GIT binary patch literal 3303 zcmaJ@ZA@F&8Gg?3^#|rc%!dOMXp#m3HWU+*(G2HM(?cbzn+pkrVHtol@w%T*fy~Hfh zYU!Ty-uImMeV_N!_gA0({1*T^@roBxz}+9urLtZa0)ff+d_0nlXT~D~qmx!5FCZ59 z#P}=ZJ!iRSp_t8F%y29YA{iPQYEp)#5$X5HW5IX;)P9=qfB63Un*lAo|_)E za>wJNX-lBIFPn&`hZr68?l6t~L~2&R+oz)z74Rjp>2xZooY2@$`_X~zUThO6Erhc_ zo}V!BIdsyI_$U<^&9M-}Di=DqEOIFs%*PW`{qdPqLz8pUGoJ3J7)SmXY89ztsqqOW z#i!^#YmB68%3>be&BKhEpV#)8=t8xkdQ9xHsRJfSAB@lEh z=?)mo=Te#Rs8TkCX)ow=Q0ZBSq^9HJ7PZCH9vd)`L6!l@S#jEGb96Y?qM?HGS}wA0 zZfwlTSxGIeL-DkU9GHwE<%nhrY+K{BeKQt&P?P2ljLurQc`FwUo%VF^u&c%MzC)|BNbRpJhM_WboX>i1huccm@k#a9{X)j-7tdKVJbOg@#(uu;c(QZRnM zHh7{ckR`$f&W?>SWhCO6*>e`#+nr~yIV|+f8kKoQ*p-^5vNZ)^`zGKY%+BQ!mP!y` zbaS;SFxbRYs$o*ZhmEhnvhDTGrq?@Lo_jzwJZ~41mN2=p?e#gEUhiyqy|dxDdwI74 zm0W{-dy7_-on7I(SRZ!XL5*5!)l#pP4dFob9c&7h-oa+IG=_~kXi_JkaILys$J@84 zK%#|fCyj&34T35nq*4N^Ag`L#qntvU3AdRr9_RGwAb=;Z9y?KmR!VKOf$*%2Z-k^B z7n)M8OG0L8JHV&-u7Ed$Z=?-Jorm zwuocP(OXI;XO*LOi0&%ARn!~0it_NO+t|D=q2kVvhYI@38C{@>`c))Dj9}{;8&&^n zV?A|p3Vx=I@&9KdLL2S0v6VKqf3}T1=yq(pK|dq`Mq7+F`CWL!%h=oEYBOwdKS_t% z+u~N-AURhUP33MSo}40>g0EY219TBbl-0D0RkNE|x>1k4jBXDrrI)FBN@H7Zo4udU zC}KEBP%7FU7{z|S3d14v*+7k7lj~>Fid~(CDx!-_WOfDpFL%1jeXrHK020h#~9cUkMUYGI3hmV~z-g@wutOpdVy;M;9@I7h@dal9a>hust@eOzb z#hsqkpr<3KL%Jor7UeSHS5OhAL-nd*xo=?420d3%WORC$&`Log>4?@9M2#d})WTk4 z35KiF8}we`K)8*@(r;hqw9w-~#VOF9=2a?HnnoN=dPp=WbA@v)`}#EmwCoamdYah4 zjS*E1TX|)(Qr}D<#z-O7ju(0kIo{EmpnI(sv}`1m7UhM8e?Kz}!CEisv>76)uqRtV z_EeMp6Y% zql!k2nylP8JvZq0i%K%Ff`v;?dTJG?(c#oOjq$8%4Dy?tUZLhMvvC{AswopYZlKbk zlB{MjlrA1!Tb=4EtVH6o{iS*Obc0a2IrBagG;Tu35*d*lxL^-6;m1C<&mq3`v-u9A zkzYftI6}@*O!7166%67wj^k(i^0|i-_<&z1AL0!D%b_fEUCs zaY_6QFN#laSxUSlOYkjOi&td?ugUFrUGBjZc>r(7qqrtd;<`-WJ8}}=mpR;!=kWu1 z8B6jyekk9>kK`@9Dc{3Q`5}HRe}|vQ-{Woh2i%f>!aMRK{8auOcjd=eak+5M<->b= z$c)(|V|B>5it#mkodbnq1kd4lHG)XJz|q40RZ3k{qX*^kU${idjYjzwe1nvS5pm(0 z9Ijpw5`VNQdQycKahad>YG{Q~^C|8LA^eZ~8@t8F5MpDy(WPinpY$?1Wo2dm!Ldhb M0z~i@~ literal 3188 zcmZuzS!^5E6+Q29I3rPGnObPAULwmfMcJY(CyHaa(ds0$rO2@oZ%SfO6P@v0Cn*=@Y%}5k% z6X3l2?tAy%bJv;Qe*TMJ0qDXd3sS&89M7e)77T&lOnfmOO~*4+(UFN6Cs7a(OZ><9 zUluUubI#&fGF*b3(&4^SXGf16K0GL}X&{@)7vh=1iFkU!@zFvpl`oxLbkY>(1^=>3 z`%{^|RF1qe)O0A7NfjRFVK^3RJt1HWWRp$+K5Vg3i5dZ4xb;LS1nO+~VJfP@hUHRQ zZIrmwb{nNG^^lE#OYO9=3FS&+myOLXwcADz6#|=wQW@vzg}DhQ_iTJ3?Fdv3WfSrA z3C2S0J*H8ZPUQuxAswS`fs#ZvolYg4q=)!S08#9-&>>J>4Bl|OFm0m~`w2fjK?O!Q z*2*BtrA|JU`PejCh$m);$eASRn{^m< ze|U_s3h-KwjYmTq?kV=JlHx|iV-|x;neYwc0X&D37MR?M`z+cxh0}B~?-cZ9fvOF-TzTc{a~QMnJYL{c1z%;4jQGYJGkRd>o zxFcrI-+!lmzc+iUT^S2sVyM>w6&pFclyK$?sceRAImMHr@%7r^iK;-B2-`M0Imwif zh-dQW95%DRz+fx8YGsYe0wd^4%~9Egf^dBk2#jVIatTKzh#TEp?FtMYVk*_>DB+*& zuEDa|^~zS)D;u3_P_;R4mywpR`DC-}bGEu(+2~v?-l;?tpUU+c)UNa&h`fhT#CHd^ z>QS#Ajq0&260E(09g*@oXi|^nh;aukkp^|Kkr&^ktVEd4PHnRa262=UMLG9X#869W z8^_H~A`BD3UfS(Mh<&;Rt(4p0+D8O!+!2ZPQ)o(gDv6Yp?BSi|Ug2$y+(vCf@-Etg z9XC)@A!o>_Pd2V`{KhTcE#C8KY$`55!v=fJ>-L)Qu#Ovb;t_4HOUsES3UQcthP$Xr zDJh9m;{fAObUZ*vz;*_9hc;ll_dEkajUi9RV{}dFD2trFji${B#`In_I~l#^4Qk5P z)o_MASk2S})a<63@B`Hx!WTR>H;6_d?{72O<#m)ZfGt;GMON{6o3GutuE}1KJXGBN zHoxMA$hnNo+J$Ni&U)6}K({dUKs!?&Ws&Ve9aFuP0al?6GqsQ4G4$b(Mz+PZzMhDF zJb@>PO@-ftQ5gu-a`zNsE?(o;|bCavUhRh+g<(&Ij_@SWSMP0!_%vH zwk_ljc1&+ghD#{=DWo)N>bNQRsu*Gd(6{lcFnpde*X&U!5?N;sHqRbV~wd`A05!A9PEPmDfE^uR9 zRl`1BX;SLL1Y(RAW9@mN=Z5DUy$Sg@dO^!ZQfX0MX!z@yVF)&Q(WuQ3NtHW^iW=X? z`02`t_rS)VI#|+HSHhdMYxN*jF?VtW{)44Tz8WtPXn+m;lA30klc!F_$-A6pQbkU) ziU!ADqmGIihH8I7Nha=M;i8wGdc|q>IQ3p*EUU&Kzs2hnYJP>Cs^?aPIB*lyN*Adl ztC@?^MaEU;iFr_TQ#p~8xc)LJ^ywy{a#7V_+=7ssWK?$IRd>h&Gq( zaBvRdC=O$Wz4aY-*KPLG&)HEQkoyroXggbTKT2$ zD3an39B~BG;v~NTp2v)s!K}#hmA{0Hc!e+S^T><0Q4sH7LA=jb?T1(vAK_*38+=jx z1FwnCa9&EhE;r!~*?pyDRX#BzKkpK5`G}B z;i~*8ekk9?HTg?immlLt@(;Kn|A?FN&-k(YD}EwB!HWDR-j<)@md}TG^lX`QC&k)q z@tJrH=Q&3>J@7idtR@esuW+L9^+&0%s)>V2`EPuUlpnj~U+@MglhN?u0$*E}Xcd2Q zDSA}L5JCj@26pv|Pa(vP4&$Jr#nz;SS4Bld#s6@;zAi`v-=KuV GH~$Zu{!-Hb diff --git a/bin/NeuralNetwork.class b/bin/NeuralNetwork.class index 480a6eee484f6fa8dd3b76b2c6e9fac875d7d39f..fe7c2e7af77c49cd2fc5f591ab40917c85829c57 100644 GIT binary patch delta 595 zcmZ9J&ubGw6vsc4-JRGp*@Vyy$tAV~tn8|_Dtl0fH-%n;roAQxQ|p6)XGg`-`r?SA!!p^EM4kKF81o3uk`m0ZQPw(s*=c{=D)UfKHYIj<@8<;>4) zX)YuuHJS|2BFia?Oi|-B`#8fmXF0?<>JpzIqCuOJoM)N~>=CMtj{UJ$vg5DK9Wtoo zG{Fv1qB_N0iP@svq6M5yifIZ;jSQszFf17l zcqn^b{?@T%f%Zo`EUd{XMId`7QM@RnW)qve3c7Dovnb|d0z78djcu_pfnw*5|AB?K zeJz~?FPY!DVDO1=b*TET6fD_-a*Ug4I ovj2Hvep2AL@thyeBUoptLn-dT`lp9m@@%)wV17LPB9StG0mX}6&Hw-a delta 560 zcmYk3PfHt76vfXZ@4eJ%G9#r4P7A4~3uVUEN+p7eD!3>Xq39;W7*Ii45L6Iap+aaI zQ;mPB&Z6L=;Hrx*th5={|gFFF;F@sx-c{HH_6XR$_ zk@W(4F@b(eqBMjlbW+j-$vBKhc+At!-b05LWG@Jb5HW}ktO>-4cuLcfQ$UKnQ2&zp zQ1y|jEUN}Y9cB#8+Wp8s++)9tWk!>|XNV#?%|zMlHB=6mMFP)y0DMLK>%dxgfx5P) zutGx`zg4_zz`8i&o0ax2RQ9h?Dk#pl1BP?EYDa5G+XnA)-x#gQS$dT8tLQQY3v)}NYB900erlSgKcJcZfqrwQUvers_wH_LIWYG*&w2fx?|IJtR(+=0 z_v7CezX3vAI`50Rt^Mxf>Jh6#Tfb(r$rd&!iqo-FdUZ0^6OX2Kwkk^6V*|-ZUwbUQ zH<8@wql<`%PPf8c*IK{9OAn9f#1y{fXgaU{StIIRZNb!`(exA0T@ia>PA(Q7gXkGM-%jFf5qr7Sj z>dl!hUNd>!ZrR%#ONS$av1H0Fa?Ip7Zwj1Le4ljXs;h4`I3f2H&8=bE;cb(LIH~YU z`{8RaR(0=)MbnE6-cfjL-{p*iCux+kz{OLLI|%5=R6kG zw-}reZk*r+H9lr?)})b-tRACQePSInmU%9itY?GulW|$;))DUtne?+gt2dhy^B$)uPP?xd6;Wi&B`6^;hxn1T&xifQ*1fSTG6a?YN)?3be1YI%7!TVsiJp_=SDh3Dq@o$fdBT{SmdQ=o4^zUgOQI?yy-RF|Cg|!k#@QAQ=wn2)!~;fVj9rfK|1;-s zO~3m(zX?*E;|#O~%Pz1d%aa>}k1j8geo1AU(Y4;8_qdmL-?;Q%X`r#ZOBl5!_HPP+x15#FAeF+um4+Rv{EZQ zHcYj^o?vF@)X{MQl>+#~EO!eeX~^#$rr7T4W4WI%3{!rZszjbEG|rP*HpndJ%j6nm zWfsWy9u{#gOIRpN(j?QkPiC1}%r;RSV5tmp8HZWS30gSGa!$*}o#jD(k@E`6Werv; zov@lto2q5CnoWnAC;Ma%e{*hfh2e|sQ)l=yR0*GnR3xQ;=bT6`sdk0)jLEibVM&J1 z1&t;JkMadyiZsGjN2fC?E1ngr;VkVEe3JrL(-9P1xqrd*Cz=WrO;V12gTUdF6LKw;vdsvTT%c3 delta 1721 zcmZ`({ZCtE6n#EB_gg2$QQaoBHb1Z81soB`j0J~dhoZrr zP#`8l6Ub@^#-m!eAs9OuiS|3tg@6hfJp$G;UwNAyC-9<-UIB+U5DSfHu~1}CMF@TR zb*WJ4LRiHB2KC>h672+rRJ?>f0r_yKcOVk#F}#OW#0;IaMH^(K5rGH$v=Pk{kA=b> zZ#1fn`a{Dp2ja+dU=**&I3U+^67k z%KN=OzX72d>~N6*IWT2Lq7- z*N_$swnW(QGJgtDTVAJNmc22ZpD1x)3%*rRiR*fcQYyaJN0g^+H&wLbh`y}c77l&P zUf~dc6*e;5s?XWo>Jmi90(S4RTB;=d4|`D}Ns|>S|103&ze;cx6yzWixp)*0z>PdS zg?v=QiG3(QGqQ;Q_N2n%AfBUSLnHjChoEmg8YpGZa~lq!2^RVn)31pyRbvwl(<-5b zUImFYSnC?Bm9RD%?GXP!k+GMfXjDZ&9@SP#9q8mO1IGvgJk+pGNEJyOzhN4Tf^4R; z*i2SU0hoFYEy9>(x_5F8R-=dl#<$RTW(i##$^yFmE_oioB>G*-JRvMkH=rBEb&qL!Oi02h83+RP%j!dk^G-SC=~T?~ zit*sRx+J~~)JPMGa4Kf>vjk(9ncO!? zJjwT&ywf^~OrwJDC@1FDn2Vx__Zl{B7niA)%8vak`pgA&r+)6O6=o`>?d;v z_zm@8oQpNV)jCW0A{T0kh^t(uSrYR*&pT-3%(n^|ZQ>EMi&AuoZ8#=&aJI8J)~VeP zo>i)8ykRoES!7|3w+uf07v_1hFo8Sx0Y7rLj`RMLxt~)wha?ur_cTKqI+>rRgIMHE zF&A_X94pLMlEEyxQa|SOHzc2MWvuXwUX@F57F?4ht5Co9NOyEt9!eh;FzpuZp}`}Xmz{jm4?*0=Ur-`=C?xm39D_s%__ ziEr1!EoLgX_PbQF!e~retYD==vlc1R3O#a0%#G=n8j-&2;cRATa8G}xGdqymw>Qi@ zwQ74~@s@Wt{+LC9P&qnF#O{|9EpE$qO_Es^N`$IMFA%c>aZ~C^nqBU8jnkY6#h8*# zQgv!wCgP^cmix3U_RADq^B+BIYH>4ej4fP>8>;8BLC=jXoK!(Z!calQwl0;+gYhP+ z62@XiiLHx#MzL77E@=wex*c$NXzN#HWF1@fUD!^#q&}Y|M;|>L7v==JInNF*($5tR zaGitP<`A z#WPw3uVH_q7`I}up6#>=GHGWMFXVDa;#Ygfph_$)G4@QHqDW=1!oT!4QKuo&&^f>L z7Oy($%9A<0+vRn#`?9Eg-Xqlr$kR;n-oVT7OC96AB&ii+K#(SViw}GhwI+}J?A(m> zHqP|!Y_FaWk>9gQi3o;8a*8OYNpOZr&azI<&75N!BTh$YnO1OmO6!a-qV@6hA3+I{ Apa1{> delta 713 zcmZ{iO-K}B9L9gMJG(Qxt*(_*JGxk|lHvzZhq9ooJcNY>QABjeXw}Tx4OuIqkV5*R z!kUYR4tWSKg;p?1f!TL%pIT{|m03a8t{$}iOmyr$%skJ$zj>bjyv$&%qac``zS9pZ zF$x^@(u(UFl~JolH!?;j4Kl)5h);~)9@aB_fl5?nfudT!GOAjWeJoxPhy;o| zt`IeShAzI3-=b~KJ)8Sotd9h;c_c*4Axdq!4c%tj02TkZCoZ?Z*)I9dcAKsk zx}kN>v>Tek*lbYan>uHjoC&mu=1h=js^V;(b&(&@{&t2Ipi>#4DoW9Q9h1;;J{Y=b?}ZNr*~+31bZ7$4B{UMtRFRF{?PkJ5d^I zrKU=hPPGj8US1AJ{YqD9+?=>tYx6Ou z_PWp>_k*1g;Dn@}bO&CDS9~^~rO8>@Bt*%7CFx)IDzqX4f3xbc8kVLT_EZ;l3*>d9 pVgkWwLC!Llb3`~#9v4_6_sz7klgrk0)_i5inm4;ln-tc=_ditGsPX^+ diff --git a/bin/Trainer.class b/bin/Trainer.class index a2e74a2fbeff0bad263d7ce623ce0930ad4c3cb1..1cb61b089bc0c6a7b574f756c133399e25e6eb73 100644 GIT binary patch delta 128 zcmcb~dXJUs)W2Q(7#JAL7_>KXr84p}*Z=?jpNm0;L6wI=fHWr807HF~~5e@GwX)s7|h9EM{b${E0Dula+ykfsKKO zfqk+!lfR1q*ER;_jX*t23|v5xkAWFTaxn-na5IPj6>$T3Vn8_t25}&d7f1^*ursJJ Ps53AEp$3r8#GnZPVm1#y diff --git a/src/Game.java b/src/Game.java index d7ab366..dc6d10f 100644 --- a/src/Game.java +++ b/src/Game.java @@ -23,17 +23,25 @@ public class Game { private double fitness = 0; boolean isDone = false; private int frames = 0; + public Individual indiv; + public static int me = 0; + public static int maxFrames = 100; + public boolean play = false; private Timer repaint = new Timer(0, new ActionListener(){ public void actionPerformed(ActionEvent e) { frame.repaint(); frames += 1; - if (m.y < 0 || frames > 300) { - frame.dispose(); + if (m.y < 0 || (frames >= maxFrames && !play)) { + Game.me++; + //System.out.println("ME"+Game.me); + if (indiv != null) + indiv.setDone(true); isDone = true; + frame.dispose(); if (isDone) { repaint.stop(); - System.out.println(fitness / 48); + //System.out.println(fitness / 48); } } } @@ -44,7 +52,7 @@ public static void main(String[] args) { } void start() { - System.out.println("THREAD: "+Thread.currentThread().getId()+ " "+getFitness()); + //System.out.println("THREAD: "+Thread.currentThread().getId()+ " "+getFitness()); makeFrame(); repaint.start(); } @@ -53,7 +61,7 @@ public double[][] getState() { double[][] doubles = new double[tilelayout.length][tilelayout[0].length - 1]; for(int i = 0; i < tilelayout.length; i++) { for(int j = 0; j < tilelayout.length - 1; j++) { - doubles[i][j] = tilelayout[i][j]*5; + doubles[i][j] = tilelayout[i][j] * 5; } } return doubles; @@ -137,10 +145,10 @@ private int[] getNewLine() { try { ans[(int) (Math.random() * (lastcol.length - y + HEIGHT)) + y - HEIGHT] = 1; } catch (IndexOutOfBoundsException e) { - System.out.println("ERRRRRROOOOOOOOOOOAAAAAAAARRRRRR"); - System.out.println(y); - System.out.println(HEIGHT); - System.out.println(lastcol.length); + //System.out.println("ERRRRRROOOOOOOOOOOAAAAAAAARRRRRR"); + //System.out.println(y); + //System.out.println(HEIGHT); + //System.out.println(lastcol.length); } } } diff --git a/src/GeneticAlgorithm.java b/src/GeneticAlgorithm.java index db44e4f..dd9bbda 100644 --- a/src/GeneticAlgorithm.java +++ b/src/GeneticAlgorithm.java @@ -9,13 +9,14 @@ public class GeneticAlgorithm { private double mutationRate; private int popSize; private int numInputs; + public static int numDone = 0; -/** - * @author - Sri Kondapalli - * @param mutationRate - - * @param popSize - * @param numInputs - */ + /** + * @author - Sri Kondapalli + * @param mutationRate - + * @param popSize + * @param numInputs + */ public GeneticAlgorithm(double mutationRate, int popSize, int numInputs) { this.mutationRate = mutationRate; @@ -25,43 +26,58 @@ public GeneticAlgorithm(double mutationRate, int popSize, int numInputs) { public void start(int times) throws InterruptedException, ExecutionException { for (int i = 0; i < times; i++) { + System.out.println("Starting generation "+(i+1)); main(); } } - + boolean firstTime = true; + /** + * @author Sri Kondapalli + * places an Individual ind into a sorted ArrayList + */ private void main() throws InterruptedException, ExecutionException { - ExecutorService service = Executors.newFixedThreadPool(10); + ExecutorService service = Executors.newFixedThreadPool(popSize); ArrayList> futures = new ArrayList>(); - for(int i = 0; i < popSize; i++) { - Individual ind = new Individual(numInputs); - futures.add(service.submit(ind)); + if (firstTime) { + for(int i = 0; i < popSize; i++) { + Individual ind = new Individual(numInputs); + futures.add(service.submit(ind)); + } + firstTime = false; } - /** - * @author Sri Kondapalli - * places an Individual ind into a sorted ArrayList - */ - Thread.sleep(5000); - for (int i = 0; i < futures.size() - 1; i++) { - System.out.println(i); - Individual ind = futures.get(i).get(); - // add in a sorted manner into individuals ArrayList. - if (individuals.size() == 0) individuals.add(ind); - System.out.println("GOT HERE " + individuals.size()); - - boolean didAdd = false; - int size = individuals.size(); - for(int j = 0; j < size; j++) { - if (ind.getFitness() >= individuals.get(j).getFitness()) { - individuals.add(j, ind); - didAdd = true; - } + else { + for (Individual indi : individuals) { + futures.add(service.submit(indi)); } - if (!didAdd) { - individuals.add(0, ind); + } + System.out.println("Population size is" + popSize); + double mean = 0; + double best = 0; + while (true) { + Thread.sleep(1); + if (GeneticAlgorithm.numDone >= popSize-1) { + System.out.println("Saving Results..."); + individuals = new ArrayList(); + for (int i = 0; i < futures.size(); i++) { + Individual ind = futures.get(i).get(); + mean += ind.getFitness(); + if (ind.getFitness()>best) + best = ind.getFitness(); + boolean didAdd = false; + int x = 0; + while (x= ind.getFitness()) { + x++; + didAdd = true; + } + individuals.add(x, ind); + } + break; } } - + System.out.println("Generation Score: "+(mean/individuals.size())); + System.out.println("Best Fitness: "+(best)); + GeneticAlgorithm.numDone = 0; select(); } @@ -74,28 +90,36 @@ private void select() { * Adds the best individuals from the individuals arrayList, and reproduces pairs of best 70 individuals * adds 30 new individuals to maintain population size(100). */ - + System.out.println("Selecting..."); + int initSize = individuals.size(); ArrayList theBest = new ArrayList(); - for(int i = 0; i < individuals.size()*0.03; i++) { + for(int i = 0; i < individuals.size() * 0.1; i++) { + //System.out.println("WAITING HERE12"); theBest.add(individuals.get(i)); } - for(int i = 0; i < individuals.size()*0.69; i++) { + for(int i = 0; i < individuals.size() * 0.69; i++) { + //System.out.println("WAITING HERE1" + " " + i + " " + individuals.size() * 0.69); NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); - NeuralNetwork m2 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); +// NeuralNetwork m2 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); theBest.add(new Individual(m1)); - theBest.add(new Individual(m2)); +// theBest.add(new Individual(m2)); } - for(int i = 0; i < individuals.size() * 0.30; i++) { + + while (theBest.size() < initSize) { + //System.out.println("WAITING HERE"); theBest.add(new Individual(numInputs)); } + individuals = theBest; - while(mutationRate - 0.1 >= 0.01) { - mutationRate -=0.1; + if (mutationRate >= 0.01) { + mutationRate = mutationRate * 0.5; } + Game.maxFrames += 10; + System.out.println("Finished generation starting next one"); + System.out.println("*********************************"); } - } diff --git a/src/Individual.java b/src/Individual.java index 56d3f77..cff36ea 100644 --- a/src/Individual.java +++ b/src/Individual.java @@ -7,7 +7,7 @@ public class Individual implements Callable { public Individual(int numInputs) { network = new NeuralNetwork(numInputs); network.addLayer(40, Activation.ReLu); - network.addLayer(4, Activation.Sigmoid); + network.addLayer(3, Activation.Sigmoid); } /** @@ -22,48 +22,45 @@ public double getFitness() { return network.getFitness(); } - + public void play() { - game = new Game(); - game.start(); - boolean isDone = false; - while (true) { - double[][] state = game.getState(); - ArrayList newState = new ArrayList(); +// System.out.println("PLAYING"); + double[][] state = game.getState(); + ArrayList newState = new ArrayList(); - for(int r = 0; r < state.length; r++) { - for(int c = 0; c < state[r].length; c++) { - newState.add(state[r][c]); - } + for(int r = 0; r < state.length; r++) { + for(int c = 0; c < state[r].length; c++) { + newState.add(state[r][c]); } + } - ArrayList actions = network.predict(newState, 0); - if (actions.get(0) == -1) { - continue; - } + ArrayList actions = network.predict(newState, 0); - boolean isMovingRight = false; - if (actions.get(0) >= 1) { - game.moveRight(); - isMovingRight = true; - } - if(actions.get(1) >= 1) { - game.jump(); - } - if(actions.get(2) >= 1) { - if (!isMovingRight) { - game.moveLeft(); - } - } - isDone = game.isDone; - if (isDone) { - network.setFitness(game.getFitness()); - System.out.println("done boi"); - break; + if (actions.get(0) == -1) { + return; + } + + boolean isMovingRight = false; + if (actions.size() >= 1 && actions.get(0) >= 1) { + game.moveRight(); + isMovingRight = true; + } + if(actions.size() >= 2 && actions.get(1) >= 1) { + game.jump(); + } + if(actions.size() >= 3 && actions.get(2) >= 1) { + if (!isMovingRight) { + game.moveLeft(); } } - game = null; } + + public boolean ifDone = false; + public void setDone(boolean f) { + //System.out.println("WHAT?"+GeneticAlgorithm.numDone); + ifDone = f; + } + public NeuralNetwork getNN() { return network; @@ -76,7 +73,15 @@ public String toString() { @Override public Individual call() throws Exception { - play(); + game = new Game(); + game.indiv = this; + game.start(); + while (!game.isDone) { + play(); + } + network.setFitness(game.getFitness()); + GeneticAlgorithm.numDone++; + //System.out.println("NUM DONE"+GeneticAlgorithm.numDone); return this; } } diff --git a/src/Mario.java b/src/Mario.java index 04920ae..3cdc99f 100644 --- a/src/Mario.java +++ b/src/Mario.java @@ -15,6 +15,7 @@ public class Mario{ double x_vel = 0; double y_vel = 0; boolean inAir = true; + boolean moved = false; public Mario(int x, int y) { this.x = x; @@ -28,22 +29,33 @@ public boolean collided(int x2, int y2) { } public void jump() { - y_vel = 48; + if (inAir == false) { + y_vel = 48; +// System.out.println("y"); + } } public void moveRight() { - x_vel += 1; + if (!moved) { + x_vel += 1; + moved = true; + } +// System.out.println("x+"); } public void moveLeft() { - x_vel -= 1; + if (!moved) { + x_vel -= 1; + moved = true; + } +// System.out.println("x-"); } public void key(int[] useKeys) { // System.out.print(useKeys[0] + " "); // System.out.print(useKeys[1] + " "); // System.out.println(useKeys[2]); - if ((useKeys[1] == -1) && (inAir == false)) { + if (useKeys[1] == -1) { jump(); } if (useKeys[0] == 1) { @@ -173,6 +185,7 @@ public int draw(Graphics g, int[][] t, int offset) { } // System.out.println(x_vel); // System.out.println(y_vel); + moved = false; return answer; } } diff --git a/src/NeuralNetwork.java b/src/NeuralNetwork.java index 007e513..8ba520a 100644 --- a/src/NeuralNetwork.java +++ b/src/NeuralNetwork.java @@ -87,14 +87,20 @@ public static NeuralNetwork reproduce(NeuralNetwork nn1, NeuralNetwork nn2, doub private ArrayList getMaxIndexs(ArrayList l, double thresh) { ArrayList maxIndexs = new ArrayList(); - + boolean didFind = false; for (int i=1; i thresh) { maxIndexs.add(i); + didFind = true; + } + else { + maxIndexs.add(0); } } - if (maxIndexs.size() == 0) + if (!didFind) { + maxIndexs = new ArrayList(); maxIndexs.add(-1); + } return maxIndexs; } diff --git a/src/NeuralNetworkTester.java b/src/NeuralNetworkTester.java index b4b3c98..4c35ad8 100644 --- a/src/NeuralNetworkTester.java +++ b/src/NeuralNetworkTester.java @@ -1,11 +1,8 @@ -import java.time.Duration; -import java.time.Instant; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.Future; public class NeuralNetworkTester implements Callable> { public static void main(String args[]) throws InterruptedException, ExecutionException { @@ -15,42 +12,33 @@ public static void main(String args[]) throws InterruptedException, ExecutionExc times++; System.out.println(times+" times"); Callable> callable = new NeuralNetworkTester(); - Callable> callable2 = new NeuralNetworkTester(); - - int t = 0; executor.submit(callable).get(); executor.submit(callable).get(); } } - @Override public ArrayList call() throws Exception { return testPredict(); } - public ArrayList testPredict() { - -// for (int i=0; i<50; i++) { - NeuralNetwork nn = new NeuralNetwork(5); - nn.addLayer(4, Activation.ReLu); - nn.addLayer(5, Activation.Sigmoid); - nn.addLayer(5, Activation.Sigmoid); - nn.addLayer(5, Activation.Sigmoid); - nn.addLayer(5, Activation.ReLu); - nn.addLayer(5, Activation.Sigmoid); - nn.addLayer(5, Activation.Tanh); - nn.addLayer(5, Activation.Sigmoid); - ArrayList in = new ArrayList(); - in.add(1.0); - in.add(2.0); - in.add(1.0); - in.add(2.0); - in.add(5.0); - return nn.predict(in); -// } - - + public ArrayList testPredict() { + NeuralNetwork nn = new NeuralNetwork(5); + nn.addLayer(4, Activation.ReLu); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.ReLu); + nn.addLayer(5, Activation.Sigmoid); + nn.addLayer(5, Activation.Tanh); + nn.addLayer(5, Activation.Sigmoid); + ArrayList in = new ArrayList(); + in.add(1.0); + in.add(2.0); + in.add(1.0); + in.add(2.0); + in.add(5.0); + return nn.predict(in); } public void testReproduction() { @@ -69,12 +57,14 @@ public void testReproduction() { didFail = true; System.out.println("FAIL"); } + for (int r=0; r Date: Sun, 19 May 2019 20:41:17 -0700 Subject: [PATCH 13/21] can move left --- .classpath | 6 +-- .project | 2 +- .settings/org.eclipse.jdt.core.prefs | 0 _classpath.xml | 10 ++++ _project.xml | 17 +++++++ bin/.gitignore | 12 +++++ bin/Game$1.class | Bin 1242 -> 1577 bytes bin/Game$2.class | Bin 773 -> 773 bytes bin/Game.class | Bin 5374 -> 6517 bytes bin/GeneticAlgorithm.class | Bin 3973 -> 4139 bytes bin/Individual.class | Bin 3020 -> 3104 bytes bin/NeuralNetwork.class | Bin 3978 -> 3978 bytes block.png | Bin data | 40 +++++++++++++++ ground.png | Bin mario.png | Bin src/Activation.java | 0 src/Game.java | 72 ++++++++++++++++++++++----- src/GeneticAlgorithm.java | 30 ++++++----- src/Individual.java | 9 ++-- src/Keyboard.java | 0 src/Mario.java | 0 src/NeuralNetwork.java | 11 ++-- src/NeuralNetworkTester.java | 0 src/Neuron.java | 2 +- src/Trainer.java | 0 26 files changed, 166 insertions(+), 45 deletions(-) mode change 100644 => 100755 .settings/org.eclipse.jdt.core.prefs create mode 100755 _classpath.xml create mode 100755 _project.xml create mode 100644 bin/.gitignore mode change 100644 => 100755 block.png create mode 100755 data mode change 100644 => 100755 ground.png mode change 100644 => 100755 mario.png mode change 100644 => 100755 src/Activation.java mode change 100644 => 100755 src/Game.java mode change 100644 => 100755 src/GeneticAlgorithm.java mode change 100644 => 100755 src/Individual.java mode change 100644 => 100755 src/Keyboard.java mode change 100644 => 100755 src/Mario.java mode change 100644 => 100755 src/NeuralNetwork.java mode change 100644 => 100755 src/NeuralNetworkTester.java mode change 100644 => 100755 src/Neuron.java mode change 100644 => 100755 src/Trainer.java diff --git a/.classpath b/.classpath index d655412..0cbf9cd 100644 --- a/.classpath +++ b/.classpath @@ -1,10 +1,6 @@ - - - - - + diff --git a/.project b/.project index eab011b..c68be4e 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - Full algorithm + Full Algorithm diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs old mode 100644 new mode 100755 diff --git a/_classpath.xml b/_classpath.xml new file mode 100755 index 0000000..d655412 --- /dev/null +++ b/_classpath.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_project.xml b/_project.xml new file mode 100755 index 0000000..eab011b --- /dev/null +++ b/_project.xml @@ -0,0 +1,17 @@ + + + Full algorithm + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..8e762e5 --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,12 @@ +/Activation.class +/Game$1.class +/Game$2.class +/Game.class +/GeneticAlgorithm.class +/Individual.class +/Keyboard.class +/Mario.class +/NeuralNetwork.class +/NeuralNetworkTester.class +/Neuron.class +/Trainer.class diff --git a/bin/Game$1.class b/bin/Game$1.class index 634fb659e4df2ca7636242daf8a09f1f47687209..f1d2bf43666071d91b2f513f090041a9546f6761 100644 GIT binary patch delta 791 zcmZva%TE(g6o{+mf)5xw0}jxKGs9zH?9Mew zR}z;dXrhTI*2aZP7ybpt|3%{+isHh%xc8iMzw^uQ%$*;luciL&*XJ)l9~(P*bs(!# z%Q?w;E(l7DM8b02#vVawb9~rHTG5u+p^LV{)$++f$z@^(WUoNqCu1$srHZ&B8Kzqh zNLqe6D!IxvLC8*-_L@M(NBzJySB;gZ&X~z~nCnXApe(t;O+nbTyjVJA3AEX???rcBYM?Pk)hs?{=vFM6;OM}3o86%ra-icfyDxs z-ZP}le_*Ick9_6uex&7z`=R!c3I8lmljm0Pa^gAl#oC=b_lh+mkF`z7SX-W@9YmHb zUb3x54pOd64N|7|Q|cFLq=qJgigUqfLFNc04+GLWE~@vPqXx=vEp%yrP#k z^i!b}8j2%QNtMdfu%yW#6r=GNhXAgs>a>TV$4@w6mNnJjsZxMd*3_w~=Y{n>NT|lW F^&1(5t_lDE delta 483 zcmZXQ&rVZO5XOI}Jy5tDiGYD7ng)g zFudfMB9wE3a@g>i5k-xc&w6_blb#BIm;LH|wk_T=7GYFj{bvp1OeiA0TO2LqU4>4p zBo_m(DZ@0+6}6rpbSz?|4Kq9xb=LEDHwwOxQDzMpJ}By(tu5F0y9N}G6X^*j=i15i zjE)0V%_48D4n_-)q>>T&Bx1#~;2OgA ZleoCAND*R{HOX4e2J7-IktxaY{sLB+U)lfw diff --git a/bin/Game$2.class b/bin/Game$2.class index c56c987c79704e482190bfad2f9c92a162598a92..b8cad7c25ec5a44f29b22ab0c562bd7a21fba91a 100644 GIT binary patch delta 43 zcmZo=Yh~M@!N_PnS(7oB(PHv+#^a1BljE5pdD9qJ8PXXf88R3Y88RmyWpV%j^m7Wc delta 43 zcmZo=Yh~M@!N_PjS(7oB(QNW`#^a2UljE5pd7~Lv8DbbD8Dbd}8R8}%WpV%j@e&Gn diff --git a/bin/Game.class b/bin/Game.class index a1a4e13027fd338e99fcf2c66936330a46af988d..1be5ab4215866637da9a6f32a85a45c0d8054828 100644 GIT binary patch literal 6517 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 literal 5374 zcmZ`-33yc175?AMo4hbQLI?ywf`SXpf(b^9Kmaib%SggdLV+<_dCa^d1CyEQED%KN zMvGh3YHQWHq19;X4w+D+)V9*au5Pt^ZC$!(7rSe*^gs8#$qXUo`||F4_ug~vIsf_3 zId^#ezfTtw;L)J3wEAoVx`y(t)^@8QX2p9Nf?KxQ;fw}fcZ#bTrnJjie?xjl zl&j~iklAJ~C#|?0J7#&U%yL=l(_plBSgB}&U-~wCXIg{5eYL%FOTtP;IOoqqV|L8i znaJ`mZ&z19Ly1fU+B8h=QinPQb!JjLnGz+5?(VeB-5U2A-O)_kPE)H!fs$ytEfJ@+ z+Ijp?mUG1yjYp!}HJI%Id5K1{me}SIx5o8Z{mK{a)04D=DpPjSipF`swWJd1*?!bvo(P_< zp|bi|&}ue_QD>O&p~S$MghUDZF&}4%*aFT}2LjHvMJC3U?mkBCsaiHRtew>2gv zIRLITF&R^2Zk>rrOqI9wCXRDfH<+lxR0Ep`Mlnb#Lgslx zY_8eh$3|Qzvzr;S>VSinwIkDDZ@1%_hI7K1Xd>PoO=s*lBks7l#l%dUz+h*3qvT47 zql@2tV+Q->;yIW0OX5!;A>F3ES@@Ykiw+X#=oA?AisbLyZug&hZvaw8S zERnW@q@pEw(Wh!M$iP*3^c(%ygYzYF*P1X;YT#2E%2bIFuv-(cM9PoraD#;6MoN)_ z)ZoWW_>6&@M<;-)DJDLPTj(yWXraRniI}M_=|}XcDA(au6Sv`Z!e&JxjKop9`jRXa z@l10~A^xq2{G=FhhlHG|c$aHQgJ^GK6^N(luOD~fEZMf##J#wWgr`kwQ+BtVO4*Ul z=tT_NaYYA?2rAQV!u=*5zyJZEX-u;`-87t7B;*jXXxSBh$ix@%C6+XvxgrtHrk&!V zSD)wL_lSu{@fcaf^>(+o&M4CB%yn3Ct4A?hBK(AjCnfxPlEBKueiMUoh@VO}MAK1K zzqEd`CYG=wYwUiqM#Gm)JcVJ0HEZl0Qt*TdHB!knmQ!Cip~|YKD`4QDA791S4SX$6 z1l4OgtW2+o=Wqo%kh0>DM4y3gFf|ob)D9MIyFZxC1iM?LYNVIRn@8Wb!^q z!YH|hmTWf@!;UCvp70L-WZ;i(`BsUQkBx~x<1b{cL{IHz<0^`eqaaXJw4DRgd~i$J zPHh)PpJ(8&EDQN?1%gG4(R%W&{iuW4+I6{kuv$d>xTUfjR8-u%k{LxtX};vB6i2 zY|OWCx|dhfR4~8bV;+B%8=7WFZhVJkb|$i^uq}M2D{^?ffXY+|#MvENnRjVBjoHi- zFYlBS;gL%Q-#k+C)yUg~8hK4nBX0<5WYbq8TfQ3E@Hs--z4~Ue=g5|W=^V$&-AawT zS*dwm0XTZ3FLRv2(@w-J?w`%CdXDnX@7;%!$|L)5$`kzZV2;dj1n*}$FA*P7vvLY= zU9Rjav|OZj)efPib{KV`iqnSBFo;He%nx}dd6GkD8pJ|=Hiv5WW8n~%3}RVr`GoSa zLul~~qP5od43>wy6)QVKdPSgf5UXpwgXpL&8$?jvJ}i$;d3=OgHio>z2!(iF*APBB z2&-Uh6E9Q(t4^>4s9C%hHPG2+!qhS;YF4{zf^J#q*sPrG-?0BXET2Qam+s&S^Q zai}lt-Lr1DS5x2Ix%bGMyFFT!65o5|<+{hI%&P)^0s{&xA#zKJ)Y(L78BXKKJ1thC zRT)<69PS!68BNF_P17pTh%9mUkbbkVoo`<3ptecSKfp8tDeW+SIaR#RFllnra=mHd zD9Du3oP{~;ETH0`yOJiYDng`m1d(0;Pshchb*!e2_Azzv8aK8bmyXsEq>i;?>bM+N zxH=kKviRsr@G&~&q)~}-u(L?m=Q`n$E3G4})v*{zx;;wa#*!SaB;EH2)2|-HHJrO< z7}tf$6O-`VB)m6->vQMkENj9Rawm*)Ic{QB^`Zv}KCeU+*E2nCVXEAP816?O9^s1Q;#3C(7oi2j zCr2)6ic9hJaW`UqiX9i58b*(cRtMrKbQXk9{UP1AC9vH&% zA`w2I@@Beht`b1`B!YES1u<@Xqu^?-s?)nzzc1$7C9IAY)7@Qk_cFSBIg{oJbaK29 zyOm4xxs&#d1bsf9RxTMhSvlvS)Twv|2kFrgoTOGg%Hf$PISil5oGHwlBa&6Dxdy(X zN%{B4jnd`MLbshs} z^?NY0?f{;hd$3ZE%-p)30*kk z5@V6-VtZ)bRYdD*7Tas-#&zr?*WygvK;Lhq#7&gB85i)o2X`RF-wc=FZiU`b)g>== z(etrre^VjlXSw+n-#pZq#vXg}K!i&C9n$G?sozPnjk6Bi_TI`)LwqXtkx2K_+oE}s{XbuN|9 zyZ6Z3QjB|~7_S!%Qiz-MO8qvp4C95+FkX_5xSG*8fLDg_lZv0_@besA8^Rk0@a7_4 z-E`l~@_D_YEmFl7Cg0l|B?cw=Qm(i>kY_eya?2BRqKiNLZpFJU_)b>d&z|=H!5kn> zA7smah>d0dEqIt!{SlVNN3j8qQSwO=cpv5W<95zJ$o2hXm}I3Bgh4k5ga?1a-+5Xa z8evpZFI;FP&fxi+tH(Oi*+_g4J#~-q9Eg&A_|wL-Ua2 z<)!#H-gCmiv~b#kl+;FPRK+E=T$#qANs;&QpD{!_A08z#y-4IRK5#|mP_5M7lG+)( zY!phrQ@M*}{);1H9J6q=Wfg^EXur5Ho9c_5u||uWP$c5fykm$g8!a-qNJQ6s$2e0r fq?L?z=DxfP|3g#VI<;|{+&U$MA&&BIk2CxaZ>W4g diff --git a/bin/GeneticAlgorithm.class b/bin/GeneticAlgorithm.class index 368f5a67018556db9e58a0a3851b6897a2a0386f..57496c00677319d0689b16656e42dc9abd6d34fd 100644 GIT binary patch literal 4139 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 literal 3973 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 diff --git a/bin/Individual.class b/bin/Individual.class index 308e79b71b77ec9a010ab7b302ba0d4d3756321f..c811f46d3caf177e46a12447cb05abc8966a4bb0 100644 GIT binary patch delta 1045 zcmZva+iw(Q7{-5JXJ%)2c1)YCwLn^-iAC6UZ7f!?Xk%kR(ITWM!EhlfotDAvEZv<} z@wAH8GoC&a@dWi$m8$eK5J(Ky#(3lZ;GLJo#2E0M*~F0O&3Aa7=X;-bo_Bt3J-y2L z>GFjifm=Dh;5=f~GCazt%>hNzq2hG0r&J8adv+hGhTepW$C$z>Plbw>;e__fJ-aG? z5bh2uUU6benuCh$j`Fl0jISH^#zKcflx!YTH2;s@Wr9FqAC60uY8<<`cThVYipmld`g$X^5fzTn>p<=OHPn# zSggo*C_Z<&gDN+4?Sfjk-d3r55Pml%n7P_9mXnZAg9I!bqTcNDCvx!fYf+<1gv*OV8emdOTL z?<1$pOrch$n`v&6lzKSM&77f^B{p$^J~oPOfK=>Ho-Wzb!d0kBEKQ;enWBMQQlWss zD%yFRf;ikOnkR%cI3lmE6IEURq@3#9Q^GxsnB_@drp4wNn>*FtSgPqSvR7D(X`||} zFwoxKDYnm2(|=|xaWd_xjbD$x#IRkQ8inld&~eIQy>R40?_C-iSl zW9g$6`r^d%D|}o}{?r_HKH{_Zw#*kNuly0a*15TeuNRp&_b)M@kFAZwdOaCAZzn6W zYUX~{Ff94*phNa9c5*wr7-U2jv&{ubQkrOJH<||JZ(8_ITXA$rAkxF4p3Sy3F3XDs JR)~`Q+&{zo;(q`D delta 1016 zcmZXS+iz4=6vltMbIx2&PwhB3<&vpJq?Aq>%f&W;fusQ~2`!RB4Wth`w&V2Fb_S;7 zIB2CH;0^G?1}k`>cmXfOP=!Mx5q&c;#y^0Bzrbf-OarccrU^t|_Fnt@zP0vR-`+Ee z{#@w%ar@^RKo^&0o##SPhjqN*GNf&*|A7W?qOVx-3i*C7KT_5M))AG{H?0A+U$3%L z>NVYGFHTo^-KBv8isXvk(QGB#F_talJ9d^!lK5oXvkp}bx*XySUA5DVM-*z4!QM33 zTYA=B6Rq-&ONCeT-*)TRdx`~j%RE&b%Iz(C#e!+|=cml3{D#CvjuT-h7y z9?KU?UU_8P*3^gae77c=kh|r7Q08Sl?JOJU4s-@X zvT9Q)^HT(A6zpkf#&D_YRQDuay~d z^tf=ApeKTA)AQ9fr?0ba&o$n^N~d{}^i@8nJ&nFdB<=H&IbGr7Gk5+m_tm&hd_Mh= z8SD9E`)Kjm;Ky&7pX= ie88{o>$gQZ51f&fF8qH?6%;fE*YQoTe#>{k{{4TO|J6otQE9hp&Qf*QpX8bL(SpiGD$f(znKT(c14f=eWgfq)7Y+FDHe*A`Y5 zHp2J@T3PrkwsszFaql_za=sg-qx5^^4tC?xLqIPBB+1avu5?A}oK*bkwwTc|S{bK{ z2`whI$S|kA&lDx5IhEfav_IaLnTc)3u$f=RXN452jIgfr4YF*qsJ=sazF$lu~p0X4mP#RYX+@L!y392)k| nUo%a+6qNgJXj6G|1KRb_EkoSdx1eP1tx4pa2N53aL1OkFw2CgO delta 270 zcmWNMO)Erk7{z~oT<&G=of;-XF-nTO&P|f?QZg}l=gR9$#59``g|c92aku}qg_VVk zy1oG`3!lZ-&e=St=RBu#&J*Y3{Cn*7WN>LGpo1J)M(AWi`#xQq(w)4z4Q61FMutc+ zOh$qnqs$1m7$;(aviLfo{qercRAO8E%D}Zrf`5KQHmpF9?Ry0F(nnKFsWj5;!B*%= maxFrames && !play)) { + if (m.y < 0) { + fitness -= 200; + } + Game.me++; //System.out.println("ME"+Game.me); if (indiv != null) @@ -40,8 +47,12 @@ public void actionPerformed(ActionEvent e) { frame.dispose(); if (isDone) { repaint.stop(); - - //System.out.println(fitness / 48); + try { + in.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } +// System.out.println("My fit: " + fitness); } } } @@ -95,10 +106,23 @@ public void paintComponent(Graphics g) { }; panel.setBackground(new Color(111,196,249)); frame.add(panel); - for (int x = 0; x < tilelayout[0].length; x++) { - tilelayout[tilelayout.length - 1][x] = 1; + +// for (int x = 0; x < tilelayout[0].length; x++) { +// tilelayout[tilelayout.length - 1][x] = 1; +// } +// tilelayout[tilelayout.length - 2][13] = 1; + + try { + in = new BufferedReader(new FileReader("data")); + String str; + for (int x = 0; x < tilelayout[0].length; x++) { + str = in.readLine(); + process(str, x); + } + } catch (IOException e) { + System.out.println("BRUHHHHH"); } - tilelayout[tilelayout.length - 2][13] = 1; + // printArray(tilelayout); panel.repaint(); panel.setPreferredSize(new Dimension(624, 624)); @@ -110,7 +134,19 @@ public void paintComponent(Graphics g) { } -/*/ private void printArray(int[][] t) { + private void process(String str, int x) { + int[] replace = new int[tilelayout.length]; + for (int y = 0; y < tilelayout.length; y++) { + char s = str.charAt(3 * y); + int i = Character.getNumericValue(s); + replace[y] = i; + } + for (int y = 0; y < tilelayout.length; y++) { + tilelayout[y][x] = replace[y]; + } + } + + /*/ private void printArray(int[][] t) { for (int [] y : t) { for (int x : y) { System.out.print(x + ", "); @@ -118,16 +154,25 @@ public void paintComponent(Graphics g) { System.out.println(); } } -/*/ + /*/ + private void loadNext() { for (int y = 0; y < tilelayout.length; y++) { for (int x = 1; x < tilelayout[0].length; x++) { tilelayout[y][x - 1] = tilelayout[y][x]; } } - int[] colay = getNewLine(); - for (int y = 0; y < tilelayout.length; y++) { - tilelayout[y][tilelayout[y].length - 1] = colay[y]; + try { + String str; + str = in.readLine(); + process(str, tilelayout[0].length - 1); + + } catch (Exception e) { +// e.printStackTrace(); + int[] colay = getNewLine(); + for (int y = 0; y < tilelayout.length; y++) { + tilelayout[y][tilelayout[y].length - 1] = colay[y]; + } } } @@ -162,8 +207,9 @@ private int[] getNewLine() { private void draw(Graphics g) { // System.out.println(offset); - offset += m.draw(g, tilelayout, offset); - fitness += offset; + int moved = m.draw(g, tilelayout, offset); + offset += moved; + fitness += moved; while (offset >= 48) { loadNext(); offset -= 48; diff --git a/src/GeneticAlgorithm.java b/src/GeneticAlgorithm.java old mode 100644 new mode 100755 index dd9bbda..fb376e1 --- a/src/GeneticAlgorithm.java +++ b/src/GeneticAlgorithm.java @@ -10,6 +10,7 @@ public class GeneticAlgorithm { private int popSize; private int numInputs; public static int numDone = 0; + public int oldBest = 0; /** * @author - Sri Kondapalli @@ -51,7 +52,7 @@ private void main() throws InterruptedException, ExecutionException { futures.add(service.submit(indi)); } } - System.out.println("Population size is" + popSize); + System.out.println("Population size is " + popSize); double mean = 0; double best = 0; while (true) { @@ -64,19 +65,26 @@ private void main() throws InterruptedException, ExecutionException { mean += ind.getFitness(); if (ind.getFitness()>best) best = ind.getFitness(); - boolean didAdd = false; int x = 0; - while (x= ind.getFitness()) { + while (x < individuals.size() && individuals.get(x).getFitness() >= ind.getFitness()) { x++; - didAdd = true; } individuals.add(x, ind); } break; } } - System.out.println("Generation Score: "+(mean/individuals.size())); - System.out.println("Best Fitness: "+(best)); + System.out.println("Generation Score: " + (mean / individuals.size())); + System.out.println("Best Fitness: "+ (best)); + Game.maxFrames += (int) ((best - oldBest) / 200.0) + 1; + mutationRate = mutationRate * (oldBest / best + 0.5); + if (mutationRate > 1) { + mutationRate = 0.9999; + } + + oldBest = (int) best; + System.out.println(Game.maxFrames); + System.out.println(mutationRate); GeneticAlgorithm.numDone = 0; select(); } @@ -93,14 +101,14 @@ private void select() { System.out.println("Selecting..."); int initSize = individuals.size(); ArrayList theBest = new ArrayList(); - for(int i = 0; i < individuals.size() * 0.1; i++) { + for(int i = 0; i < individuals.size() * 0.3; i++) { //System.out.println("WAITING HERE12"); theBest.add(individuals.get(i)); } - for(int i = 0; i < individuals.size() * 0.69; i++) { + for(int i = 0; i < individuals.size() * 0.7; i++) { //System.out.println("WAITING HERE1" + " " + i + " " + individuals.size() * 0.69); - NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); + NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get((int) (Math.random() * individuals.size() * 0.3)).getNN(), individuals.get(i).getNN(), mutationRate); // NeuralNetwork m2 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); theBest.add(new Individual(m1)); @@ -113,10 +121,6 @@ private void select() { } individuals = theBest; - if (mutationRate >= 0.01) { - mutationRate = mutationRate * 0.5; - } - Game.maxFrames += 10; System.out.println("Finished generation starting next one"); System.out.println("*********************************"); } diff --git a/src/Individual.java b/src/Individual.java old mode 100644 new mode 100755 index cff36ea..22bc439 --- a/src/Individual.java +++ b/src/Individual.java @@ -7,7 +7,7 @@ public class Individual implements Callable { public Individual(int numInputs) { network = new NeuralNetwork(numInputs); network.addLayer(40, Activation.ReLu); - network.addLayer(3, Activation.Sigmoid); + network.addLayer(4, Activation.Sigmoid); } /** @@ -40,18 +40,15 @@ public void play() { return; } - boolean isMovingRight = false; if (actions.size() >= 1 && actions.get(0) >= 1) { game.moveRight(); - isMovingRight = true; } if(actions.size() >= 2 && actions.get(1) >= 1) { game.jump(); } if(actions.size() >= 3 && actions.get(2) >= 1) { - if (!isMovingRight) { - game.moveLeft(); - } + System.out.println("Moving Left"); + game.moveLeft(); } } diff --git a/src/Keyboard.java b/src/Keyboard.java old mode 100644 new mode 100755 diff --git a/src/Mario.java b/src/Mario.java old mode 100644 new mode 100755 diff --git a/src/NeuralNetwork.java b/src/NeuralNetwork.java old mode 100644 new mode 100755 index 8ba520a..e3524ed --- a/src/NeuralNetwork.java +++ b/src/NeuralNetwork.java @@ -1,5 +1,4 @@ import java.util.ArrayList; -import java.util.Random; public class NeuralNetwork { private int numInputs = 0; @@ -40,8 +39,8 @@ public ArrayList predict(ArrayList input, double thresh) { ArrayList oldRes = input; ArrayList newRes = new ArrayList(); - for (int r=0; r> newLayers = new ArrayList>(); - for (int r=0; r()); } - for (int r=0; r Date: Mon, 20 May 2019 09:44:57 -0700 Subject: [PATCH 14/21] fixed NeuralNetwork --- bin/NeuralNetwork.class | Bin 3978 -> 5059 bytes src/NeuralNetwork.java | 42 ++++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/bin/NeuralNetwork.class b/bin/NeuralNetwork.class index 2e8dab7aad82accf4b72b4e20bcfa70ccfffd38e..a8e4c91c48c548e104bbcc3b548229d9d0c3e7c4 100644 GIT binary patch literal 5059 zcmai2>wi?$6IGS%m2`C{nC&9M6Gn~bMH(hVN~+-KF-}|pS{;w zd!I92`|Q2<0kq(g0E#q}c3PRV8Sk{5@nrgN0J?^Shs-gvIc_F~o4W=MS%Xdhehrms z)J`_{SZUjg+sDj-xTPVO$c(flQW58t;%~JClOIc4eXn?0V_+>JbitsBOT^7D5ADtM{bCn2 z(11qT4O@=bwbkEhsiC~xPFS6pkpU~c$0ekqJvnH`drgu=g1kZ9IcSrG^7c7w6S@%T zb5r2wkeNeHgOMLQF-}$ujVaeQ8j;69J)qV+IR9uf^4j%3>Q(kO=RN9K!gG{o? z17n^_c6yo58`jWU(B4ywLUd;`Ll7vE!anj%+Y*j7Y^7-{6n@>nR&1j_Q|V;N95x-2 zzO3MKo9lOmupK)BxMxo3xJw(@iCwIUF*BaAx`u?vY$*8w`nUa)HOYS=3aQP&{n$hX z$b5%+q%9G%j*uOnEoDZ@IS13$=s`Xt?{SWzfUGm>+;BLu3n6`+1EHg;#*GJ|_cit;Oohxl|^sv<7 zJ{B#Dr#FBD8meboTX!bm*dx}iBZF2-dPNBy)zHw9aa8B1>n7!O!}ge!sIy1w5=p0S zfGyJE>-st~5v$u!7s7rF$O;5}P8s(&X*)5@-Xk$s28J-qWJso}AM&*{QV<#?JlnuS zIHaM*O_)7QCC0m#BA=u^#HEdlun^hsW|MOJwYPNAKnjm>>CxGxKTpH#lf{X|26f#? z>5X_e2n>`S1=iU~PuV8GB#OkkBpaN(ZzepW9uaei~N0w)celI_Sh7*CE`63odECU81{H?n(}f+r_k13wY_@)UK) z6xdz&q)n+BJ!Lv<6cu?2@x)2s*o>;(4+S6~P{m2PrTj$@`RlBjmHCcjJkBFv_Aqt#7q$N{@Gl3kP){x3$- zV81Npe?DG|%ftyDdispoPm2DkS$^1W^vE2nVB-bt*YucCreJgeinR;AaRx%sYGG|9Y+ zTt!C{uPar2i+Qa?8LF_1=r!`%#rKC$4HGq3N4u}Ok)avu`NkNrfpawVv=Lunh9&5y zmBFkRpaWmyyUz1DRF3YqJNfM{HKP9yWdT%Zx2-Iq5AKtk?_#o9kkGbsuHZJ_uu1p8 z*yJm2@lT?=xFs-&NZ2R2RQcUhs{-nNdsv^smMi#%qVZ9Qq)41;fmv-TaD%$E9c$A4WQeRC3XB`7>!frzGAYnMb@ex8GFx^KA z8Fmh)aXg>^kg<09DxxQc@EG)O;4nIQ^`V?Tx|pz^1Z=@K`4mvl)zMmJKESm^R5EjS zZsu;z6gVrPe})ReDTsawpSJo2Rw-D!bFlU(fpu|i5oZLW4VBn4gnR&vkw`*X#DyNv_67LjrMQSBju+~BN!=r{WMBvu)nY3 zk!hG8%;j`(*yjx>;uI-Upo~e_zZC03iuJZAN9S|CsidLMXfW)XwG5YpgOMvZIEBNm zEb?ZkRo-!xkX`h(upahJAraPRm2eNs6x`rT(TXtcCBkjw{eEmD6x(?3Qb^ayuPCGxSCQeEPXA{xrWDeQT2CRn zIn&k3ULM_Ct)xidIF3*^&tWN!@+p`rJ=aH>r`4r&*w4hgk<%>iy|HZBwEc_xl zva1NBWx1ueigAdhtt@AHaf?rvQry_!A-sJG$0DcRL}gg7@?XJ|!lK^dn?z|?FZSLQ zz+{S)ep2O|z>=K1uwLZZEQjx7gc1n?8FmZEw15uK!VpK^G=b{$Jm9_l)xyh9O97Sv3XqO>h|SGF4qX& z#9J!jCHN`jQ$!D?_!)jq-$Lat@Jo(K7W^M4JYh`eT;^Ap;*}be0;ti}&cQf`2pk0|TpOS^SX&;qD&nR58X)i}&#XuY&nj zev?+|kFLFps~7oHq`I1v6Yv7reNnCDvg*&F&5-C-ollG4pyM*m-7cQ_9ET1>>!Ys{&S?ZPC?3N)TWh(H$tB|h! EAO8|;WB>pF literal 3978 zcmai0TXR#_8C_dCk}O5W#SsJ(88|CWt2n>bJYvz(USTddB;KbZDEAJ{qo!Uaq zsnpy>1(j2X%-gPGEy`+CAzU(VT2(F*WBO>#wM&D?t5x&nn7!x@^Z1lqbWFEawG^_g zY>u|xl-$bB@Cg4E+RQ>>Oad{(bZ+c;-nExZ*XH~FX$9j%xnM=GRiV2@4l#71JB}VC znC(&9vE31cV7h-g3WaTPL=h8{WE?xNlg<|HH<&67auGbuBVHn6+!sd(;TU#dkNDdw z$u#GZ>z@`+&&2T=JWCf$nz*FB`kF8u?w=LAbR7N2(5`3^=0rNz|NoW>9b>j*jn@|D ztm=7luEf;3#>#oKG;LOGS^JxYd(~zaI>t8il+eZ4KCcA6j+qVQ6ynXf6Jy7^;bW|9 zh2D)(ZdU4%`kv4)@@mR8^ViRs6+gE~rD_#y;nG1Lj7=;V^()`BtuWov-e-(PbhKO} z2qZ~sAI+vY$F+)9mA2Bt;W&=s3*={|TCSKy(gOC#&4G$$B7_75tLe=!p2bR1{!0z1IYpEZ|rPQhAccS5$vjFfY)R;|UW zd?=R+lNR5E*&F?!r~s8$XbD(zu?<`l4tz>gt@=p9Txe|cMEzlT!) zg*ZMh^+&4~(J$2U#Qsov6LmK&3F<~_i=!FQ;VeZ<@k~eXn!=9t0XA84TzkPfxtzBu zGAr6}MPcA<&DE15HOZEziuRJ_r0m6%Q+88x9E28^hf=0fNF7eaa0#zV1ap&&r`)RT z6ghh&hkP6buz)C=srAEtZA-U=MiZ|X$28d7onFD5VY)DW`z7*8#=|ukBiAWJ4!rfE zys7MmUWmg%nV}cgLw_2FIVXdTb69^KA@vq~90UeZj|3YZr>FW5U=abaZmTCJ>m#Cr zn{m8>Hx-^LXz5K0@98xyDtQ}Ui{PsYTh|lzDIhZWx-P~?MvJ4)50bjX;0x-!<;XC;ONCEjCrIRrA&A_aJ_pCsa5Q|xPoUJd%eD$QCP+PkI=~@zSS*5C5)YS9{)is4$8UT zGm3!$e(u$IZRKYd^XSHQVs`+&nBe+Vu1qAk20rIyhJ$#HE9QtnR;KjRAsl9fZJ5Oo zRup7)XYpCSHFye$)5?4IJl|#Yj`3e?iJ((Gy*I$O96mhnVe+CNp^o#c;B{kQ$ne1! z3I(&_6-)-RkrkwqA*m%1_DW4e^!Ki$v5KL47?BchMN}fvY(zZnJbsW2HF>-hR*A3= z+nvY1&LoW;5fe{8oCs%+%}D z{O655?M{aL4c$21lvT{>hW%4_eO`Axm*MW_o)5JRwAzg(L+h5wwq!JY5A&oFu}h3Dy}>KF2A1hFu%Od3JG@PZf6Q zHeSImx&Dy*f5j9Y@U1Xp-UEp?o{%2mD|`|mJw#PAq#Yk&k$VR1@37~>kU{kM3^_+D zk1H2(+2=}yt*T*(r*C5$`Le_Y)tlw{ke|xJm0f827|94!)K_4~R$_o^D zoKkzDfk#Nu;x@j+PnqH)RFudzoY{XD@5rPLXobbJs!EKsptJNMgd16g@jW(>HzK}| zH+^4&JR^C_w0q~b4OgC6E82~WR~q<{9 diff --git a/src/NeuralNetwork.java b/src/NeuralNetwork.java index e3524ed..ebeaed7 100755 --- a/src/NeuralNetwork.java +++ b/src/NeuralNetwork.java @@ -1,6 +1,8 @@ import java.util.ArrayList; +import java.util.Random; +import java.io.*; -public class NeuralNetwork { +public class NeuralNetwork implements Serializable { private int numInputs = 0; private double fitness = 0; private ArrayList> layers = new ArrayList>(); @@ -39,8 +41,8 @@ public ArrayList predict(ArrayList input, double thresh) { ArrayList oldRes = input; ArrayList newRes = new ArrayList(); - for (int r = 0; r < layers.size(); r++) { - for (int c = 0; c < layers.get(r).size(); c++) { + for (int r=0; r> newLayers = new ArrayList>(); - for (int r = 0; r < nn1.getLayers().size(); r++) { + for (int r=0; r()); } - for (int r = 0; r < nn1.getLayers().size(); r++) { - for (int c = 0; c < nn1.getLayers().get(r).size(); c++) { + for (int r=0; r getMaxIndexs(ArrayList l, double thresh) { return maxIndexs; } + public void save(String path) { + try { + FileOutputStream f = new FileOutputStream(path); + ObjectOutputStream out = new ObjectOutputStream(f); + out.writeObject(this); + out.close(); + f.close(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public static NeuralNetwork getFromFile(String path) throws EOFException { + try { + FileInputStream fi = new FileInputStream(path); + ObjectInputStream in; + in = new ObjectInputStream(fi); + NeuralNetwork net = (NeuralNetwork) in.readObject(); + in.close(); + fi.close(); + return net; + } + catch (Exception e) { + } + return null; + } + public void setFitness(double f) { fitness = f; From 585edaa7447a661090b77430cf093f087e52210d Mon Sep 17 00:00:00 2001 From: Abemarkar23 Date: Mon, 20 May 2019 20:14:33 -0700 Subject: [PATCH 15/21] more random --- bin/Game.class | Bin 6517 -> 6516 bytes bin/GeneticAlgorithm.class | Bin 4139 -> 4035 bytes bin/Individual.class | Bin 3104 -> 3054 bytes src/Game.java | 2 +- src/GeneticAlgorithm.java | 40 ++++++++++++++++++++++--------------- src/Individual.java | 11 +++++----- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/bin/Game.class b/bin/Game.class index 1be5ab4215866637da9a6f32a85a45c0d8054828..548b53549cdec331628c34520a65d720df31427d 100644 GIT binary patch delta 28 hcmexr^u=g{6)(RY10w?na4~OYP!SN>?8U3i0|01X1T5Ehz6Eu>zganjCB_Q%rBNdDY1QDYo-~t+7 zG&)8fj2kYvqEK28;);U%uJ1k?HTvX(Cg5qU8YeUN{%7tv^Plt0<*dOe#^aIxTfki2 zbs6p2jJ&U%?(HA)I}HjsV^YMds5%!_=M{F(lAIC)#RZd#)<^AqdPHHa3RVZ#HEgJ< z^!xn=<@A}{px<)pld`qE&rhS*GlN^)ad2CaR21A&zqYz4*s!&>exu1RI+*#{8TTr+jqS_nry7f(WgnsJN6P(#-7@&@ZJYy==0+$g8am?%HRG4gUTH^jN)4G|{&9MmW zBD_6hM>uN>G2YutN0$(?GeOpNJl1!!tz{F%s(}*KM5$_Jwc1aaI>Z`vL|RRgygJ52 z-S9C}B3&Ke5|;&>OYP-~^pYUMdRT>tjU1A=N~bskB)%rf#zCcVT{^aLSlQ?jl}JAg zu?hz-eXNX?=zL)g-BRWxBu3_6iypBkmN&~uvi!+~84_M(oE*EQuV(2WQ4Yg0YHHXz zn(SMuogV#UTi8LajGmPlVdovnBlN~1d*E;EW}uIoxpvkE?=wRsYuAi6)3{U6T)Ql*de=v3mOO4v1$$yTA(D1&Vy zm+eBOi5k(3G|Re!eX<{97bn@xSz3i>8$IlaabHNC79A`O-o-gy#HgfkoR=~1>14#g r&m%9c0wnW_*YXSgQ2d>*$0?3Q8zECUw2@^XE$TAI?Vi(&< zlO`m_(lpaV6Oz&pBPyc8z-0@FyP{TF6kHNxd}w?zzS~6m-RoLUa?iIf=l{<={cd-@ zHu-pD99YKfUaiyl{s(np$Z?k3wWKHyp9D+qcg@pSO_xrHVpBV0YKIl}f>nj(8j2%2 zJ;_<;OkzZ#Z-_KRw#Vz5qQPL$Su*{ebu`AAaB)K6*%59D7dM2PqQz^&@mige>`^$I z!%bhr8a1jot#gL63P&^&4}}zS3JTYRB40I!8$yxz&RBE(3XStzba6qE`M-c}XOc_F zboWOKuIS9=Peo3_Yqf>t&XRv>tmEeIWYQf_*HYu|(zNugxX?hIN@Zn4Rl?^8^fSLT z>gA7Eo4vX^MSGyKAHU`GIbvQqx7QC?wm)m{?`Q!p`%T;DXd7UDA4~gaH#i`Ql=uw} z+ETm`7^J&bz_s(1+=mIsU5Hy`HVeg9#5*h!PcS*DHzvNNO#Q+-wU70xgH7rHCvmt>fWOZ6hL+-iiQ91~u$RUgN3k|tmjumK&L^vZp29b)NY%1@S=2y+;-Cg8bS<*o$*k+KN^k|7d z(E$18N`D!AZpvwqFX{P&IkIy^=&2EUq5^d-dF&97Yx$5yJ|)I3n%OOS2Q75+wZPdT z(0#`ViJa$quJVIL(Mmx;-v5lEY$mu)wF#h)A!aO&-hRQ+D)|kbvb75jv)mB2o&)|g f-~9~mT%3=|Q!e>(-u#!3AK}fCrZ;6)8n^xfdtvd8 diff --git a/bin/Individual.class b/bin/Individual.class index c811f46d3caf177e46a12447cb05abc8966a4bb0..1888951c7a827c1e14b6a4c98450f0263a41fb7d 100644 GIT binary patch literal 3054 zcmZuz=~EkZ7=D&4*^q7vBA^wbtw#-^6P z@B64%y^mT_$Idu@cJv?cKXAscesLV@^X@K5z%oNNzu$X5@AJN!U;h2^CjguAjfN%# z(X^ej=B!-BC}>a>wCywIjQ)aQ=ljR@?lZHlhOmN|cUy6-LVvbsXDg0l+HU`lQ79OD z3#J0iHr)e7XTO5h%&1v$jKZjYkyN1OjajOMGu!#(`Sg-w=B%u1746+Kj#-{57IF%d zVX9cu!$q6A%9MggDqFB@%N?&rmUEhPVCstNi`e0tKBqRzR1SmTit!X7`%T zZa<&)OfhQ|CJe`tb8s0>1^(1{x_2Uq5W01oi8gT+)3Fk(G@PSg<&pxTI2&t4ZMCSK zr$a-e1sC8#4eN;BAnTYjq!t}<^b(12D?eMbSdpHo3zOoePse&}U}Z)wmoer|hiJ#s zjapur?u=Cy>w04dT8mwoP1~i4OOcXR&>mlgvzRJ2Gs>Iph~?U5nVJM{SR!Ap<5FBk z2ulTHUh3GYqXp3@QW(&1B?ZzO9oujf)1!xR*KpZ~=6LU(J;NHVX4mQr7<3$CK4X>L zCd@!qWBDWcH+Pj?Ak(Wz#UuCvL=*xZ!LTmsvZSz3TlTII+Wp%Onq?3{*GKM!=?0(nM zA($^M4nk1xQWvQP$b-fVka&qxg=^FekV%U2O6Hi|zso3j6Q{vqI%U)KhgywKc_bwd znu+}AC;^W5E~7C^b&KP!W7&BH9TeAF;NK=S+@s)(<=0nNtU}IoBDjxc^~p(1`=hXR zO%w<5fXwlO%jgxjm4$E+59>IDN4SZMQpvQ*#Ga*$^_7EQ$p{`J<^y8*gcv?qXQQ`3 z7hV6ah(!lt`LvFC+|9moVHFgtV$JpZiD~qjyRv3UHcVN=3yXv3`L9WYRNXE7cv;6Q z=qJFIY<0PQO~>m(E8&wvqA7S&#}%^lQg~a(J6I)qw=69Z^~+_*-q&#$A22j~SKB2j zk(g+~NBBg;#~k+UCU?G-9W3OFj^)nG>NtXp>^B#c-|wZ}3+74^_*};`c$V(Rixnqp zj#%;rX{{H1ku;Yx!%b=%ZpEQ=TLXlFrv_f0;+2$Y1aTmVwTv6$e=}4x$qwf$ut|0x zpDpqh;gkHuDn6r>wxW&a(|Ed&dh(}rp#6Jve8;a%=;CLX3czZd;oXQiUlM_l>4gE- zCXVB*L}&p$i4!<`vimsJEa2S4F`TO%#rahv>h8Lj8>7&0Gc$^ylXb`gIf22+;~3f%8aRS=q0Q?X_`_fa88gY>0#oS2oqXZnML3>g-(F?MzGAnI5mxEx00~4u0K&A=jD zZTJ}bu%Ga@)4D*b5W5`1EWfGrz8^OKLnzW(c;V}p_|2EyNtr`g0+D~wsexN#Q27VV zO55L9agxcZ8WjJU5+D|fF{+D--zw(i^C+C?CT;8ViSi!U!ZvPgpiQ_&n=s}`DWS~) z*6hztzjp?jrE%ZVypc0kHgKl7#u@Iyz<9(PSfJ+w4ou}VzAt;XiuaDFfUh8{dV! literal 3104 zcmZ`*Yj+#f72RWvG_rCN+X@bZ*lp4_L6T!!k|u=6F&LYq3bIXO>X4)lCelQiAkC3Nppk4>4?s(G<$X)qkizv_BVY3M7?T20Ta&W00t4SL0_(Irtl#W%+Z`_i=Q za7H`N!MN?%{sg@;h3o=fQ*PNxA%+2k?MQ2gWwHys&~S&sHYfwTG;HsRkisDD66YP_ zcDI6oWG{yB5d*{A-ek$Q7fs)G9fgl#FC(0>icJlw*tX;a<6{aR$0sx-&2qVDE?FMA z$P_xgB#|K;P`F2MjCs3KbM3Nh*>ToJs#4LF1jVNx?p;?jH5~2zic-oaGP3QZ-(Qf!DoWMW|lbAB_aF-^g z-6nUWFpWn@!J=7hT632)3}&XY#kO)nFVcDfrxZR7?kh%G#jnFF)K@-xUUu@RLJ>2> ztb113F8LZpBi}%Eo2lhD0&SU=SaS-G;WLcIjY_OSXHHQx1M?aN+Nl;C->O(%3TNWG&`4CC`u&+Z}t%W8`_?v&>pPiOU+c&A5xUQ`uXzE)o9< z*rIH)uwvc*3N=t9WRDP4eswWTOv2=|3zB4A;Y*TaQc@RW%Apa;B1Tcr;8<59okY29 z;hKVEcWB(1VY0nkhl@16($!=*aZq;`~Zg{}Z+?GYen1L5G+_`o7;ig?J zTV4|1;<9!(k6#Mg^Z4Erp2v6OOmgJwdkQb%`#kH+dfjr^1w-B462^)^S@<84+X-3t zV_Eo3w3*I*HS2oHiix-Jqnygk_&-O2~QQpBQ>&initZR3bqMnunZYsQr z*9brFHocN{(w1wfuf6GerHJfTp4yJ-H$7S(?4U40>d@c+xaY<@Nu0=IALGXOi}Tqd z_YUvX9yx#cX7fVvEr&AiCO-Q(YC@+6Fq&IKe=fF)ow;=kp4+pAJ6EwgcMH4wGb`BB z!an&nR~@ee;emlDNSe9t>;UiE1nNLTg-|l=NFT^ftf4)Dyw{ zt^i4eJ`s{8$_dwN%ZwW5nsu%}(!%}4b(}c2h6iV26U#UdJE||^j)Nn^hX(cg-o-;L zoIHC?*9LXYynp@nKd;5K;SqlPL!uwt(ZcE3(O3(!f5Vv;9`AVr`i;>Rp3tvjcgH-3 zsW99HvBt%!Z?0-vzaZAcb?h6BcUsdcFw>P5>=45hBK4qJr@1ZgA43wu=;xo0LF~mI z)+@{R5soLYpLgRuI7{y*STUE?T4bGGBC#)%(l>DkH*py6(OarJ5mbLYqAf|AhX#r3 zr>9S8^)Q|wj8cwwG3Hf%>5S08)3nC0L<~_#=>H7ALfe;V`wDG2BtO8Qfv*}kq5TJO zt^eQHcAJUn2DEUR7GQXIKcjvP&xS=~UZJ8AxjhtgTSzI+1IJm=e20J%n*vJU>ueDb z&^Pd0gf$k7fw+|L9WL)w&qRlM;+yK>K^HAP$&HBmhSu@?x%7)`__m->hAn(I{eu>M z)WXYKF{e8)hc+>JlrZv7iKP?q^`LiOi_oXovd1XOpReMG)I7I}Uxc;)^)ifH3%`-k zE&T5F+y9dIp>4T^Kd#^{{mGknDp-x6sd?gJivc6 zll*TY^$*)-DoRo+#=~Sd)<4OU@5YDHl^O{dab~o#b=O(|DCOzFt>C$eR`6c?FYNc8 AR{#J2 diff --git a/src/Game.java b/src/Game.java index c1b98c9..8de6708 100755 --- a/src/Game.java +++ b/src/Game.java @@ -27,7 +27,7 @@ public class Game { private int frames = 0; public Individual indiv; public static int me = 0; - public static int maxFrames = 150; + public static int maxFrames = 20; public boolean play = false; public BufferedReader in; private Timer repaint = new Timer(0, new ActionListener(){ diff --git a/src/GeneticAlgorithm.java b/src/GeneticAlgorithm.java index fb376e1..16a028d 100755 --- a/src/GeneticAlgorithm.java +++ b/src/GeneticAlgorithm.java @@ -76,11 +76,12 @@ private void main() throws InterruptedException, ExecutionException { } System.out.println("Generation Score: " + (mean / individuals.size())); System.out.println("Best Fitness: "+ (best)); - Game.maxFrames += (int) ((best - oldBest) / 200.0) + 1; - mutationRate = mutationRate * (oldBest / best + 0.5); - if (mutationRate > 1) { - mutationRate = 0.9999; - } + Game.maxFrames += 10;//(int) ((best - oldBest) / 200.0) + 1; + //mutationRate = mutationRate * (oldBest / best + 0.5); +// if (mutationRate > 1) { +// mutationRate = 0.9999; +// } + mutationRate = 0.99; oldBest = (int) best; System.out.println(Game.maxFrames); @@ -101,25 +102,32 @@ private void select() { System.out.println("Selecting..."); int initSize = individuals.size(); ArrayList theBest = new ArrayList(); - for(int i = 0; i < individuals.size() * 0.3; i++) { - //System.out.println("WAITING HERE12"); +// for(int i = 0; i < individuals.size() * 0.3; i++) { +// //System.out.println("WAITING HERE12"); +// theBest.add(individuals.get(i)); +// +// } +// for(int i = 0; i < individuals.size() * 0.7; i++) { +// //System.out.println("WAITING HERE1" + " " + i + " " + individuals.size() * 0.69); +// NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get((int) (Math.random() * individuals.size() * 0.3)).getNN(), individuals.get(i).getNN(), mutationRate); +//// NeuralNetwork m2 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); +// +// theBest.add(new Individual(m1)); +//// theBest.add(new Individual(m2)); +// } + for (int i=0; i<3; i++) theBest.add(individuals.get(i)); - - } - for(int i = 0; i < individuals.size() * 0.7; i++) { - //System.out.println("WAITING HERE1" + " " + i + " " + individuals.size() * 0.69); - NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get((int) (Math.random() * individuals.size() * 0.3)).getNN(), individuals.get(i).getNN(), mutationRate); -// NeuralNetwork m2 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i + 1).getNN(), mutationRate); - + + for (int i=0; i<5; i++) { + NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i+1).getNN(), 0.9); theBest.add(new Individual(m1)); -// theBest.add(new Individual(m2)); } while (theBest.size() < initSize) { //System.out.println("WAITING HERE"); theBest.add(new Individual(numInputs)); } - + Individual.predictionThreshold += Individual.predictionThreshold*0.03; individuals = theBest; System.out.println("Finished generation starting next one"); System.out.println("*********************************"); diff --git a/src/Individual.java b/src/Individual.java index 22bc439..1ab9b2f 100755 --- a/src/Individual.java +++ b/src/Individual.java @@ -6,7 +6,7 @@ public class Individual implements Callable { private Game game; public Individual(int numInputs) { network = new NeuralNetwork(numInputs); - network.addLayer(40, Activation.ReLu); +// network.addLayer(40, Activation.ReLu); network.addLayer(4, Activation.Sigmoid); } @@ -22,7 +22,7 @@ public double getFitness() { return network.getFitness(); } - + public static double predictionThreshold = 0.9; public void play() { // System.out.println("PLAYING"); double[][] state = game.getState(); @@ -34,7 +34,7 @@ public void play() { } } - ArrayList actions = network.predict(newState, 0); + ArrayList actions = network.predict(newState, predictionThreshold); if (actions.get(0) == -1) { return; @@ -44,11 +44,10 @@ public void play() { game.moveRight(); } if(actions.size() >= 2 && actions.get(1) >= 1) { - game.jump(); + game.moveLeft(); } if(actions.size() >= 3 && actions.get(2) >= 1) { - System.out.println("Moving Left"); - game.moveLeft(); + game.jump(); } } From cf763a667a436d305f55823918c9e7396f4e1109 Mon Sep 17 00:00:00 2001 From: IceGawd <35550454+IceGawd@users.noreply.github.com> Date: Mon, 20 May 2019 20:17:22 -0700 Subject: [PATCH 16/21] Switcharooni Sneak 100 I pulled a sneaky on ya --- data | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/data b/data index d15196b..a780344 100755 --- a/data +++ b/data @@ -1,6 +1,21 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1 +0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1 +0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 @@ -23,18 +38,3 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1 -0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1 -0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 -0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1 \ No newline at end of file From 53f326f6cd083fb053d8a96b81fe227d82f94cea Mon Sep 17 00:00:00 2001 From: IceGawd <35550454+IceGawd@users.noreply.github.com> Date: Tue, 21 May 2019 13:46:49 -0700 Subject: [PATCH 17/21] Update Made inputs that are given relative to Mario instead of the screen --- src/Game.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Game.java b/src/Game.java index 8de6708..ca095b1 100755 --- a/src/Game.java +++ b/src/Game.java @@ -27,7 +27,7 @@ public class Game { private int frames = 0; public Individual indiv; public static int me = 0; - public static int maxFrames = 20; + public static int maxFrames = 50; public boolean play = false; public BufferedReader in; private Timer repaint = new Timer(0, new ActionListener(){ @@ -70,11 +70,24 @@ void start() { public double[][] getState() { double[][] doubles = new double[tilelayout.length][tilelayout[0].length - 1]; - for(int i = 0; i < tilelayout.length; i++) { - for(int j = 0; j < tilelayout.length - 1; j++) { - doubles[i][j] = tilelayout[i][j] * 5; + /*/ + for (int i = 0; i < tilelayout.length; i++) { + for (int j = 0; j < tilelayout.length - 1; j++) { + doubles[i][j] = tilelayout[i][j] * 5.0; } } + /*/ + for (int i = m.tiley - 6; i < m.tiley + 6; i++) { + if (i < 0) continue; + if (i > 13) continue; + for (int j = m.tilex - 6; j < m.tilex + 6; j++) { + if (j < 0) continue; + if (j > 13) continue; + doubles[i][j] = tilelayout[i][j] * 5.0; + } + } + + return doubles; } @@ -231,4 +244,3 @@ private void draw(Graphics g) { } } } - From ec9b0609b7bb13d6ce52e02ce6d942dd0fddd95b Mon Sep 17 00:00:00 2001 From: IceGawd <35550454+IceGawd@users.noreply.github.com> Date: Wed, 22 May 2019 13:36:30 -0700 Subject: [PATCH 18/21] Mario Its-a-me --- src/Mario.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Mario.java b/src/Mario.java index 3cdc99f..9855fac 100755 --- a/src/Mario.java +++ b/src/Mario.java @@ -9,6 +9,8 @@ public class Mario{ int x = 0; int y = 0; + int tilex = 0; + int tiley = 0; int prev_x = 0; int prev_y = 0; final int MAX_SPEED = 24; @@ -74,8 +76,8 @@ public void key(int[] useKeys) { public int draw(Graphics g, int[][] t, int offset) { int answer = 0; - int tilex = (int) Math.ceil(x / 48.0); - int tiley = (int) Math.ceil((624 - y) / 48.0); + tilex = (int) Math.ceil(x / 48.0); + tiley = (int) Math.ceil((624 - y) / 48.0); g.setColor(Color.RED); g.drawLine((tilex * 48) - offset, (tiley * 48), (tilex * 48) + 48 - offset, (tiley * 48)); g.drawLine((tilex * 48) - offset, (tiley * 48), (tilex * 48) - offset, (tiley * 48) + 48); @@ -168,6 +170,7 @@ public int draw(Graphics g, int[][] t, int offset) { x_vel = x_vel * 0.9; if (inAir) { y_vel = y_vel - 5; + x_vel = x_vel * 0.9; } if (x > 312) { answer = x - 312; From 548baffdf189b10127ca7136fa8a2bc1c458fb85 Mon Sep 17 00:00:00 2001 From: IceGawd <35550454+IceGawd@users.noreply.github.com> Date: Wed, 22 May 2019 14:03:59 -0700 Subject: [PATCH 19/21] Thresh hold works --- src/NeuralNetwork.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NeuralNetwork.java b/src/NeuralNetwork.java index ebeaed7..c04b4d1 100755 --- a/src/NeuralNetwork.java +++ b/src/NeuralNetwork.java @@ -48,7 +48,7 @@ public ArrayList predict(ArrayList input, double thresh) { oldRes = newRes; newRes = new ArrayList(); } - return getMaxIndexs(oldRes, 0.5); + return getMaxIndexs(oldRes, thresh); } public ArrayList predict(ArrayList input) { From c7b0c218d6b4f70e166cc90c40fe59dfebfe3453 Mon Sep 17 00:00:00 2001 From: Abemarkar23 Date: Wed, 22 May 2019 16:44:50 -0700 Subject: [PATCH 20/21] fixed stffz --- bin/Game$1.class | Bin 1577 -> 1861 bytes bin/Game$2.class | Bin 773 -> 773 bytes bin/Game.class | Bin 6516 -> 6643 bytes bin/GeneticAlgorithm.class | Bin 4035 -> 4269 bytes bin/Individual.class | Bin 3054 -> 3275 bytes bin/Mario.class | Bin 3303 -> 3441 bytes bin/NeuralNetwork.class | Bin 5059 -> 5048 bytes src/Game.java | 5 +++-- src/GeneticAlgorithm.java | 9 +++++++-- src/Individual.java | 35 +++++++++++++++++++++++++---------- 10 files changed, 35 insertions(+), 14 deletions(-) diff --git a/bin/Game$1.class b/bin/Game$1.class index f1d2bf43666071d91b2f513f090041a9546f6761..c7a7de3f3c3f87bb33512aa4e627b68516e5399f 100644 GIT binary patch delta 991 zcmZXT+j9(Q7{-6!Oh-%aS2iL-hWSt<~ ztl2`lqQ=do-C>1Jb_5$YJ!EGR79DIi*(M}EvYI5F3e$7^wtUV}7_q*PdZ&)Fi`|Mz zt{0Y6pT%!=DgTY|-xK6f=|MGtn8fA~J~iO|R{hE3${(YjYI~?5DrfIa`GYa1R5$+_dYsu~ta!k!Fp%fsyVM6k z?>MU)Nc4~M`xqOHqfgloq@U6Djw#=EMun}x)_Bg2U>&Ei!k)0W<2H#fx3@xXm^)nI z*dwuUVTJzE7@1cTd+Yrd42O-YD~wk7r^2}>C~k3wdkl!;siJvH^*INN78;q$Qs%Lq z7@aI&FN-+BVg`wee@i$m)&E&03@e0VCHLiTd&nAIlb~L>ngbVh^M+|ONGOI#`$ZXf rAA?I=Cc+iT{=%fCO|yz714fe|u1YGxHLlBQ$YF*Xa$5pZvdZ-pat7%4 delta 617 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 b=fG=rs`}g^mGa2QI5mNZjJ zxMU#VPU7wGMnWtgcZ$r=(}7Awtr$@dZ%~zs%Ed%NLg399V4b0$KytG8zt&l6uYdpl z{^G^MFX?CQpXdc%<*%c9hpSZQbvg`!RM=>jjdm-Xp2^-hI*L68d(Dfk3$@1-Mr}A6 zUJz?+j`;n4oq8;TZc>WONH`V@Dh7MJGlJo^)=)GUjlMJrWjOjGm3?bNphXEB8A;~tgXXW6vtUE`nHP%D;UR0Lad@ia655X*Rn6jL$Q_zH_8;82qWcXwID?xH0g%KD&Hw-a delta 830 zcmYL`Sx8i26vuy`Gv2u~UYBgbQ5!NNnZ)cR4J4P+777hgTp^5_7Ah+-C5u)o>cN&9 z^$<~6R#sX%&WstFW&6I)tS-ia_@J}`R+O2Isf0+IdOP`7a%_gX{F0gSPQ$TK?xJq35ZCL56JHR796}H`Om)TjFhKT3^4$;1;*dAGSj6 zjzJ=K%>sR#ZkI#u8$2*q=#$hF^MLNrbe<_Dnj7sYzC-rO5%x4R9H5T-2BYd!mXp(d z($Za#t$tE_$m-!lfHrZ`dr1p$&f;TSdXNjgdAlGdV{tSI8qsJ_8i+ zf?2$0HXkYE6GePs4&Ru|cjl-B=BrflRVKx%m=d*|MQR;os)2H~g$mU|rD~;09idts z6BRD$w1KG5pky#rB3&Ki5|@QxoZ82g<)R}(gnKB(z`_)w>7+}Btd;nxcoq&TjccOT z!ck?RTf9j6X$V)?WZcE!3S9=xqDQLi_@t5Xw*|fC)|g6H2V-T&DWhzYo{^H_7e4WR z^K;Df+#KPQ;tsHLh?)SwaAd9h7dyGp$3TuX;|4WViPj*)0lXD07UkB@{Jw84iA~<# z!##POJY2KP$G!9nKPjQ(9|u?vvQNeShrfV$>AwPylq4=Z!)8g78#^rjHr}E|nF4c?W*&+{HrJ;gN6lGdLv_F%# zY|9-`5K1H`sdS`}H6w@q{YUxysSyh9*RcV*thVdeh$dNe=xFv=59rv0Ch^s>&GGW= zdDA)N#}Q8#GDd#Va4dNbgpvNhnwl6*PR0;Ir;ZPyML_rH*o?S_q=Jp>0*@hqE>Zii zsP*X35N$*+_Gx&CSs!HlbB5$V$9_D_3{F_N*@DGP=;`WapTIn-vs#ZaZX=sb8}p{a zDkVm1wY(&_Gge7XR}0EyH`?XdQM*`nxfM^;)kcmfHoeK2?ug~uW{Fx%>5y1`LdQqJ z6syI&F)uM3(b0%l48u68VT2n}PaPivs}&`}glo90P&ko1dv-{}F;=?DnnA}g=F?Wm zjbRL(F^uC$4JX#oZKzOY&UHM6lT62)kuRGkE+}YC3?fbTCv^d_>g14;VM+|I4_WrM^~|3yuChM} zbUj3WO|FBA43KT94>DJ)8>FO9lsD4H%%$T-(Q7je&(WQd>H2-HCZ;`hk^o_*e0-dl zO(g61%TV3IgzH##PC*N|tGV~3eHyMQxUXJ(xNPOKrW3`Nc&yqk{TKWmczkCJSMj1W z?@M*O3SealT*X&(yo^^koQz`8v{}OT^;Gqh17m$re2qCDkb|$v!PlxZ^rr19^#291 z3Lq!HspIqb0?EQDl~>Tjn5+J?DTdM6$e-7Byn%yEoh8Fv#NXHPgH@(DO?lQ7AhZbHtMSsJWVzy;6O46X&aKxMhdChiY;hz}67=11`A!+AI(BVHfR& z_ziQaH^^k?h1wv~kUx0!E^upAkgqQ;a4zc<^mL7>ypJ4q<7wiKfJ4UtsbC zb;M+I)npfKRSo#QZw?H^39zLGym<}0nGQrfaNa%v_Ap^YqzF^}^U7anRl@rl&mXQ}D18@WQ!7Xx4-G70cj$n+h?efIj{U9bzB@Qx!Ni$s zs?w@b^6tXDe_abH9bH`fU95L6V`~Lx#(P2)oc$f1t-xq_6Y5e=1*W=y2W#YfZS@V# zEMuE`jwM~hNl^@oqPhl9RlKx}c2R6!L{bzZ3)s~Yu2qcti1speh@wXh)g#9=+8AOx zlh?sZ;Q>}~C$=*&Nj@Lt`v5w5+w9?0n7}l;@Ep2v1wHs2_HwZFa$r1!1?9lR zFOu3$qE`tQqg=cWS{G^}?C1Lt}yFNvV Shbl>Ez>4>K2fy{6@B9x?@4B!6 literal 3054 zcmZuz=~EkZ7=D&4*^q7vBA^wbtw#-^6P z@B64%y^mT_$Idu@cJv?cKXAscesLV@^X@K5z%oNNzu$X5@AJN!U;h2^CjguAjfN%# z(X^ej=B!-BC}>a>wCywIjQ)aQ=ljR@?lZHlhOmN|cUy6-LVvbsXDg0l+HU`lQ79OD z3#J0iHr)e7XTO5h%&1v$jKZjYkyN1OjajOMGu!#(`Sg-w=B%u1746+Kj#-{57IF%d zVX9cu!$q6A%9MggDqFB@%N?&rmUEhPVCstNi`e0tKBqRzR1SmTit!X7`%T zZa<&)OfhQ|CJe`tb8s0>1^(1{x_2Uq5W01oi8gT+)3Fk(G@PSg<&pxTI2&t4ZMCSK zr$a-e1sC8#4eN;BAnTYjq!t}<^b(12D?eMbSdpHo3zOoePse&}U}Z)wmoer|hiJ#s zjapur?u=Cy>w04dT8mwoP1~i4OOcXR&>mlgvzRJ2Gs>Iph~?U5nVJM{SR!Ap<5FBk z2ulTHUh3GYqXp3@QW(&1B?ZzO9oujf)1!xR*KpZ~=6LU(J;NHVX4mQr7<3$CK4X>L zCd@!qWBDWcH+Pj?Ak(Wz#UuCvL=*xZ!LTmsvZSz3TlTII+Wp%Onq?3{*GKM!=?0(nM zA($^M4nk1xQWvQP$b-fVka&qxg=^FekV%U2O6Hi|zso3j6Q{vqI%U)KhgywKc_bwd znu+}AC;^W5E~7C^b&KP!W7&BH9TeAF;NK=S+@s)(<=0nNtU}IoBDjxc^~p(1`=hXR zO%w<5fXwlO%jgxjm4$E+59>IDN4SZMQpvQ*#Ga*$^_7EQ$p{`J<^y8*gcv?qXQQ`3 z7hV6ah(!lt`LvFC+|9moVHFgtV$JpZiD~qjyRv3UHcVN=3yXv3`L9WYRNXE7cv;6Q z=qJFIY<0PQO~>m(E8&wvqA7S&#}%^lQg~a(J6I)qw=69Z^~+_*-q&#$A22j~SKB2j zk(g+~NBBg;#~k+UCU?G-9W3OFj^)nG>NtXp>^B#c-|wZ}3+74^_*};`c$V(Rixnqp zj#%;rX{{H1ku;Yx!%b=%ZpEQ=TLXlFrv_f0;+2$Y1aTmVwTv6$e=}4x$qwf$ut|0x zpDpqh;gkHuDn6r>wxW&a(|Ed&dh(}rp#6Jve8;a%=;CLX3czZd;oXQiUlM_l>4gE- zCXVB*L}&p$i4!<`vimsJEa2S4F`TO%#rahv>h8Lj8>7&0Gc$^ylXb`gIf22+;~3f%8aRS=q0Q?X_`_fa88gY>0#oS2oqXZnML3>g-(F?MzGAnI5mxEx00~4u0K&A=jD zZTJ}bu%Ga@)4D*b5W5`1EWfGrz8^OKLnzW(c;V}p_|2EyNtr`g0+D~wsexN#Q27VV zO55L9agxcZ8WjJU5+D|fF{+D--zw(i^C+C?CT;8ViSi!U!ZvPgpiQ_&n=s}`DWS~) z*6hztzjp?jrE%ZVypc0kHgKl7#u@Iyz<9(PSfJ+w4ou}VzAt;XiuaDFfUh8{dV! diff --git a/bin/Mario.class b/bin/Mario.class index cdacd8c61cc236afe8998e3b89db69aedd06d493..bc847363c9b5aafb546544a73f4fc148ec3e4a6a 100644 GIT binary patch literal 3441 zcmaJ@TX0j?6#Yrxbz+=6B4T9z$Kjw~C) zFtklOF{KG<(nkuROxmHPY3MX*vBSWm&EzxF{`9MV{o%9y%CsL%rqi|0m0t;oXMD~+ z`|PtHYd>^9`rm^;0cgXId@vL|y|G*>>w~2b9E;7wn$xjNvbk?~%!%g})GYs_{J%iS zd@AkmtaqNhlR0PR92qV_PI2#nQ|J1Rc6WCvtm({Vrt+~&ejt{fc1&8V;?vo4GftZ7 zDB!u^(wbp)HL*HhhyjS&4+Ta$CfjAo&qf~81SIFgSOiT4 z9R+Lcq2=K9yXI%7M@F2SlhCg<6z6TsLOM(W(QJj*6+yd_(dcJ2X@1}El#`ora_ylr z-i|$PwRk@$5R$iV+4wfT!y3tDr!#a=5_iPA|DS)6zrT7r%H20U%n|BEprU=662_6>SUml@Sn}Eon!0kosF+|w!Plj^m=E@a}P?x^Yt3i1_E5!_WGVpuXnb* z-r4ZneUz=hdaji`y-%xR_fYsfRE5oX)XGvP%O+XsW!Wmr6X9UhJe~{(<`I%561L{i zC^yaFT6wpD@7|><15a~(hHijnEY7H6h83Wj>*!<^sXE?mp>qwKOO2dJJ9x93^JpJk zIzWkos3s5C?7D_l?Bt0~YG{d3=zxtY>}^}Jw+&y_&{8Mk5qtafJGF(6IByDuk5H8;SxY;OH{cJK z;{fpyELvl%VZ}RpR$o@pKHwT}M5e$Sq>hvSynVmMWTK zCbRd^e@(if)R@$Tw1Qb5`2$Wa;F}R%YznrF)+I>PlPH{nEkjGJ1;oEdY)OXlj}s&N zF$z};uQc^|d1@B#ZlcI-Z1J?@Hj2Z+688C1a<@awND9Id{;G%;ki3p{!rm&)&ix6Q z6MS?7#a5f=4t8o4R$@uX=G9891cA|NeAXRUW}BzNbDg-}LnQF}Ev$Ek3XgTcmNZ4F z-qkp?r144dyiwFH%jow%yNRHFe}~b@Tv`st8j^r^Q!FHAnzU2a(8_FSrz+gZMmaZb ziIVi{=(HzRLNvP3>7bVK_qpgcYP0n2G1?y@b-HZ)JxtukzdqT?WfV=}gVJM6JTPdUmN^lLl2duB#!7~_oaf|a{5~#UDWtGYIFSOU zuF!BVNW+oec%2Ba2dVjc90-xmT-TPWJ-1OVdPybNG2C3xYHu=|%#;8a3ec+}7h9%{ z@!h7|+zP)k%@x*ND8n)4jH`Ij9hfS>W(InB>f_JCQI57_XknY4L_aR$1m5O1+21jM ze~|MCr|~bG!N)kOs^O@5ejJ7P`O|`N)yj{aHe^&1&#P&E%3Q>hx`G*X9p}|8%&NQm z{+P!_^#GUD`?#z=Ji=SXfACw=z}sdq?wS?& zomr3Hn-RQY?!vp~KK#+_#69yc=FMYRFbD9!9Ku60i9efZe4vNfad$K=4l^^0EBHPK z7snN@;s-M7NWH`n#$R;4dRays5ioI$Kd&B@G>Tk`o>$@({E+uD2*arU6pvJ3m)+Q* jK7~@7cUqsIOHOK2f+(oc($Y_Gwx&8rYp?Q!f!F>IqwAKM literal 3303 zcmaJ@ZA@F&8Gg?3^#|rc%!dOMXp#m3HWU+*(G2HM(?cbzn+pkrVHtol@w%T*fy~Hfh zYU!Ty-uImMeV_N!_gA0({1*T^@roBxz}+9urLtZa0)ff+d_0nlXT~D~qmx!5FCZ59 z#P}=ZJ!iRSp_t8F%y29YA{iPQYEp)#5$X5HW5IX;)P9=qfB63Un*lAo|_)E za>wJNX-lBIFPn&`hZr68?l6t~L~2&R+oz)z74Rjp>2xZooY2@$`_X~zUThO6Erhc_ zo}V!BIdsyI_$U<^&9M-}Di=DqEOIFs%*PW`{qdPqLz8pUGoJ3J7)SmXY89ztsqqOW z#i!^#YmB68%3>be&BKhEpV#)8=t8xkdQ9xHsRJfSAB@lEh z=?)mo=Te#Rs8TkCX)ow=Q0ZBSq^9HJ7PZCH9vd)`L6!l@S#jEGb96Y?qM?HGS}wA0 zZfwlTSxGIeL-DkU9GHwE<%nhrY+K{BeKQt&P?P2ljLurQc`FwUo%VF^u&c%MzC)|BNbRpJhM_WboX>i1huccm@k#a9{X)j-7tdKVJbOg@#(uu;c(QZRnM zHh7{ckR`$f&W?>SWhCO6*>e`#+nr~yIV|+f8kKoQ*p-^5vNZ)^`zGKY%+BQ!mP!y` zbaS;SFxbRYs$o*ZhmEhnvhDTGrq?@Lo_jzwJZ~41mN2=p?e#gEUhiyqy|dxDdwI74 zm0W{-dy7_-on7I(SRZ!XL5*5!)l#pP4dFob9c&7h-oa+IG=_~kXi_JkaILys$J@84 zK%#|fCyj&34T35nq*4N^Ag`L#qntvU3AdRr9_RGwAb=;Z9y?KmR!VKOf$*%2Z-k^B z7n)M8OG0L8JHV&-u7Ed$Z=?-Jorm zwuocP(OXI;XO*LOi0&%ARn!~0it_NO+t|D=q2kVvhYI@38C{@>`c))Dj9}{;8&&^n zV?A|p3Vx=I@&9KdLL2S0v6VKqf3}T1=yq(pK|dq`Mq7+F`CWL!%h=oEYBOwdKS_t% z+u~N-AURhUP33MSo}40>g0EY219TBbl-0D0RkNE|x>1k4jBXDrrI)FBN@H7Zo4udU zC}KEBP%7FU7{z|S3d14v*+7k7lj~>Fid~(CDx!-_WOfDpFL%1jeXrHK020h#~9cUkMUYGI3hmV~z-g@wutOpdVy;M;9@I7h@dal9a>hust@eOzb z#hsqkpr<3KL%Jor7UeSHS5OhAL-nd*xo=?420d3%WORC$&`Log>4?@9M2#d})WTk4 z35KiF8}we`K)8*@(r;hqw9w-~#VOF9=2a?HnnoN=dPp=WbA@v)`}#EmwCoamdYah4 zjS*E1TX|)(Qr}D<#z-O7ju(0kIo{EmpnI(sv}`1m7UhM8e?Kz}!CEisv>76)uqRtV z_EeMp6Y% zql!k2nylP8JvZq0i%K%Ff`v;?dTJG?(c#oOjq$8%4Dy?tUZLhMvvC{AswopYZlKbk zlB{MjlrA1!Tb=4EtVH6o{iS*Obc0a2IrBagG;Tu35*d*lxL^-6;m1C<&mq3`v-u9A zkzYftI6}@*O!7166%67wj^k(i^0|i-_<&z1AL0!D%b_fEUCs zaY_6QFN#laSxUSlOYkjOi&td?ugUFrUGBjZc>r(7qqrtd;<`-WJ8}}=mpR;!=kWu1 z8B6jyekk9>kK`@9Dc{3Q`5}HRe}|vQ-{Woh2i%f>!aMRK{8auOcjd=eak+5M<->b= z$c)(|V|B>5it#mkodbnq1kd4lHG)XJz|q40RZ3k{qX*^kU${idjYjzwe1nvS5pm(0 z9Ijpw5`VNQdQycKahad>YG{Q~^C|8LA^eZ~8@t8F5MpDy(WPinpY$?1Wo2dm!Ldhb M0z~i@~ diff --git a/bin/NeuralNetwork.class b/bin/NeuralNetwork.class index a8e4c91c48c548e104bbcc3b548229d9d0c3e7c4..642d6c7e78f871f7396980141c584951be723752 100644 GIT binary patch delta 1472 zcmYjR>r<3f9DdI3d)aq+_u|6FF3!qLV0VF89A~hxruxt*7#A&rR*_s}L2S7stXWz_ zQ5I^Y2ZM|-GbIWGQg+Erq_FD@ANo-LLVWCVIo9vIyF<;p`<`=txAUCmIlp(MY_ZJx z%l%tR0IKoxy!Eu%VgJvDH&tEcm!K$EC;NJl%OJT3>7P904+%&*Et$`Ku9c#f~i zKBZen4|@5Za&OU#I$pvFhOGA9cv~#m6p6*73}%1eaVuWNpo&-ckm6yl@{3Bh^cI7M z+by0fD^B5{iqi~ve2XQo%8C)36}aAE@Mdsz^@bYb1AXxU!WNBm8`wtho{n=k&yTBq z-v~x^TtF^^d??o29~DJMtr*8e6(8{1s)v2Ze^-BFpYa)sxA=30T;se{cSlz&THCW; z+KOp`<~m=qY_iN?RsfmfcFjkNuXNnNO}a zMV^U9Em)p|CllDqciQ~EG&-?Y8l^^f#aG`lgRN(Ze)-@Fq8N>?@FXq~e=cJ1V`9#XV%q5wTp^pl zrNY#vVqBuoPjQuu*T^VQ>XZTOQU+LA3e(|W5?|D%Fe4CtDR9g$gEi2&K(Z$)=jzy; zfvXssO&I4B8@BBdFz7B~Ba&Dor;DDiaf|lJBUw`0ha(D0u(? delta 1530 zcmYLJTTok76kR8|xi<+nNeP4i6(~g@1Tw)7Q%5>JW=d@+4=EjJET92W$}>nqsgD-1 z^?}6)o(dJ|(<)Y!f|LXsZPD7Q?eOV${p+XyPRF{>O$y26o^$uvd+n9A_Pr~`H;c`8 z{=0S^fDd;U%_sG#^0R-_9evDT@T;ieXY>zP6Q7oLmG4)Pfo2BD_a!7F>FogRZ)ySh76aVk182PhOmkOyvpwz!WD0*coRn%QaZvzZM~t!VDC_fLGLQr zVa5nX6}-iex3px84T^c;X@%a#xQBdG-ech!H~Am ze_aO^XZV`(SMIkA>Dnj#=S5+({%H5_SRea?SH$?1oDAP!g(X0(8(Lf*OiR^y@(_T@A3I6?Ft9!-4I1k#-7= z53q%@MdfbP6Go!4e!a4u|EuQb?;%VJW$Dm>R9frkTt}1oMjo0@^iWj#FuOB^i$`^zx|`I4p3*%3wdg@^a`K6w@g^gd-4 zes>fd{2z;hb#Q~V@QH&_^qf$bLlJR@97V}0>{`|36EbtiBCOq>%964SQS|fu*5;AH zq)cl#L^~nV8p$JMvS1ZM6q8Vf3plLFBz* zwgPsH-?p{Ba6BnsC~2n&%{W0ZVP^pEP;X&p1)kLG6oO}Hc7$+TGcl3>9`D(-x$=Fq z6E|Vn6*5<%)fLBBpfrY)HF1mw%3}Da) zau(+(VxnH>Ni7}hq~Aq+NvH*cdkJ4rO#E{NI(i(YB})AovlRS>f)bTp)@Ynd(kPB& zF5r&g`|3F61)l}cb!io>meyEl6f2&EYPO)UD8S=7qA`)WtxC|K$-`#+h--9cr*9lT zQJ-uw^=GnEuhEdfI*0~kT*nQ%3JIQ}GcoP5yLcI^+-@(+JFmSm8GgmlWRjPl#FQA^ zS1G5(?#gRUo^(>N82db;ebcR9#um3#;9RorEut4Aoh2TU-?U~v$`&|k9QFWVWyWxe o=cW}|=-s%U`UkI1%V4+o!8C7v!uE~l$3k{m34-BIg3;m5|7C4FQ2+n{ diff --git a/src/Game.java b/src/Game.java index ca095b1..7c98d6b 100755 --- a/src/Game.java +++ b/src/Game.java @@ -34,7 +34,8 @@ public class Game { public void actionPerformed(ActionEvent e) { frame.repaint(); frames += 1; - if (m.y < 0 || (frames >= maxFrames && !play)) { + if (m.y < 0 || frames >= maxFrames) { + //System.out.println("done"+GeneticAlgorithm.numDone); if (m.y < 0) { fitness -= 200; } @@ -52,7 +53,7 @@ public void actionPerformed(ActionEvent e) { } catch (IOException e1) { e1.printStackTrace(); } -// System.out.println("My fit: " + fitness); + System.out.println("My fit: " + fitness); } } } diff --git a/src/GeneticAlgorithm.java b/src/GeneticAlgorithm.java index 16a028d..1e26f82 100755 --- a/src/GeneticAlgorithm.java +++ b/src/GeneticAlgorithm.java @@ -57,6 +57,7 @@ private void main() throws InterruptedException, ExecutionException { double best = 0; while (true) { Thread.sleep(1); + //System.out.println("num done: "+numDone); if (GeneticAlgorithm.numDone >= popSize-1) { System.out.println("Saving Results..."); individuals = new ArrayList(); @@ -81,7 +82,7 @@ private void main() throws InterruptedException, ExecutionException { // if (mutationRate > 1) { // mutationRate = 0.9999; // } - mutationRate = 0.99; + //mutationRate = 0.99; oldBest = (int) best; System.out.println(Game.maxFrames); @@ -119,7 +120,7 @@ private void select() { theBest.add(individuals.get(i)); for (int i=0; i<5; i++) { - NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i+1).getNN(), 0.9); + NeuralNetwork m1 = NeuralNetwork.reproduce(individuals.get(i).getNN(), individuals.get(i+1).getNN(), mutationRate); theBest.add(new Individual(m1)); } @@ -127,9 +128,13 @@ private void select() { //System.out.println("WAITING HERE"); theBest.add(new Individual(numInputs)); } + + mutationRate -= mutationRate*0.06; + Individual.predictionThreshold += Individual.predictionThreshold*0.03; individuals = theBest; System.out.println("Finished generation starting next one"); + System.out.println(Individual.jump+", "+Individual.left+", "+Individual.right); System.out.println("*********************************"); } } diff --git a/src/Individual.java b/src/Individual.java index 1ab9b2f..30e4f0a 100755 --- a/src/Individual.java +++ b/src/Individual.java @@ -39,22 +39,30 @@ public void play() { if (actions.get(0) == -1) { return; } - + if (actions.size() >= 1 && actions.get(0) >= 1) { game.moveRight(); + right++; } - if(actions.size() >= 2 && actions.get(1) >= 1) { + else if(actions.size() >= 2 && actions.get(1) >= 1) { game.moveLeft(); + left++; } - if(actions.size() >= 3 && actions.get(2) >= 1) { + else if(actions.size() >= 3 && actions.get(2) >= 1) { game.jump(); + jump++; } } + public static int right = 0; + public static int left = 0; + public static int jump = 0; - public boolean ifDone = false; + public boolean isDone = false; public void setDone(boolean f) { - //System.out.println("WHAT?"+GeneticAlgorithm.numDone); - ifDone = f; + this.isDone = f; + //GeneticAlgorithm.numDone++; + //network.setFitness(game.getFitness()); + //System.out.println("INDIVDONE "+GeneticAlgorithm.numDone); } public NeuralNetwork getNN() { @@ -68,16 +76,23 @@ public String toString() { } @Override - public Individual call() throws Exception { + public Individual call() { game = new Game(); game.indiv = this; game.start(); - while (!game.isDone) { - play(); + while (true) { + try { + Thread.sleep(1); + if (game.isDone || isDone) + break; + else + play(); + } + + catch (Exception e) {} } network.setFitness(game.getFitness()); GeneticAlgorithm.numDone++; - //System.out.println("NUM DONE"+GeneticAlgorithm.numDone); return this; } } From 356dde185cbf9bc22559f37e775a4a10e9df233d Mon Sep 17 00:00:00 2001 From: IceGawd <35550454+IceGawd@users.noreply.github.com> Date: Thu, 23 May 2019 18:53:12 -0700 Subject: [PATCH 21/21] Fixed fitness errors --- src/Game.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Game.java b/src/Game.java index 7c98d6b..1c321a9 100755 --- a/src/Game.java +++ b/src/Game.java @@ -34,13 +34,14 @@ public class Game { public void actionPerformed(ActionEvent e) { frame.repaint(); frames += 1; - if (m.y < 0 || frames >= maxFrames) { + if (m.y < 0 || (frames >= maxFrames && !play)) { //System.out.println("done"+GeneticAlgorithm.numDone); if (m.y < 0) { fitness -= 200; } Game.me++; + fitness += m.x; //System.out.println("ME"+Game.me); if (indiv != null) indiv.setDone(true); @@ -80,7 +81,7 @@ public double[][] getState() { /*/ for (int i = m.tiley - 6; i < m.tiley + 6; i++) { if (i < 0) continue; - if (i > 13) continue; + if (i > 12) continue; for (int j = m.tilex - 6; j < m.tilex + 6; j++) { if (j < 0) continue; if (j > 13) continue;