From d47385fd168416ec6946a39f13c96671844a7238 Mon Sep 17 00:00:00 2001 From: Yong Zhu Date: Wed, 12 Jun 2019 05:36:44 -0600 Subject: [PATCH] Reorganized, no weight --- .../java/com/github/drinkjava2/frog/Env.java | 28 +++- .../java/com/github/drinkjava2/frog/Frog.java | 82 +++------- .../drinkjava2/frog/brain/BrainPicture.java | 46 ++---- .../github/drinkjava2/frog/brain/Cell.java | 19 ++- .../github/drinkjava2/frog/brain/Input.java | 6 +- .../github/drinkjava2/frog/brain/Organ.java | 64 ++++---- .../github/drinkjava2/frog/brain/Output.java | 6 +- .../github/drinkjava2/frog/brain/Zone.java | 22 ++- .../drinkjava2/frog/brain/group/Group.java | 28 +++- .../frog/brain/group/RandomConnectGroup.java | 94 ++++++----- .../drinkjava2/frog/brain/organ/Eat.java | 17 +- .../drinkjava2/frog/brain/organ/Eye.java | 16 +- .../drinkjava2/frog/brain/organ/Hungry.java | 7 +- .../github/drinkjava2/frog/egg/CellGroup.java | 14 ++ .../com/github/drinkjava2/frog/egg/Egg.java | 147 +++++------------- .../github/drinkjava2/frog/egg/EggTool.java | 37 +++-- .../drinkjava2/frog/util/RandomUtils.java | 53 +++++++ eggs.ser | Bin 0 -> 282415 bytes 18 files changed, 364 insertions(+), 322 deletions(-) create mode 100644 core/src/main/java/com/github/drinkjava2/frog/egg/CellGroup.java create mode 100644 core/src/main/java/com/github/drinkjava2/frog/util/RandomUtils.java create mode 100644 eggs.ser diff --git a/core/src/main/java/com/github/drinkjava2/frog/Env.java b/core/src/main/java/com/github/drinkjava2/frog/Env.java index 8df9378..8504bca 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/Env.java +++ b/core/src/main/java/com/github/drinkjava2/frog/Env.java @@ -21,7 +21,7 @@ import com.github.drinkjava2.frog.egg.EggTool; @SuppressWarnings("serial") public class Env extends JPanel { /** Speed of test */ - public static final int SHOW_SPEED = 80; // 测试速度,1~1000,可调, 数值越小,速度越慢 + public static final int SHOW_SPEED = 1; // 测试速度,1~1000,可调, 数值越小,速度越慢 public static final int ENV_WIDTH = 400; // 虚拟环境的宽度, 可调 @@ -40,6 +40,8 @@ public class Env extends JPanel { /** Delete eggs at beginning of each run */ public static final boolean DELETE_EGGS = false;// 每次运行是否先删除保存的蛋 + public static final boolean DEBUG_MODE = false; // Debug 模式下会打印出更多的调试信息 + static { if (DELETE_EGGS) EggTool.deleteEggs(); @@ -53,7 +55,7 @@ public class Env extends JPanel { public static boolean pause = false; // 暂停按钮按下将暂停测试 - public static final boolean[][] foods = new boolean[ENV_WIDTH][ENV_HEIGHT];// 食物数组定义 + private static final boolean[][] foods = new boolean[ENV_WIDTH][ENV_HEIGHT];// 食物数组定义 public List frogs = new ArrayList<>(); @@ -65,6 +67,26 @@ public class Env extends JPanel { this.setBounds(1, 1, ENV_WIDTH, ENV_HEIGHT); } + public static boolean insideEnv(int x, int y) { + return !(x < 0 || y < 0 || x >= ENV_WIDTH || y >= ENV_HEIGHT); + } + + public static boolean outsideEnv(int x, int y) { + return x < 0 || y < 0 || x >= ENV_WIDTH || y >= ENV_HEIGHT; + } + + public static boolean foundFood(int x, int y) { + return !(x < 0 || y < 0 || x >= ENV_WIDTH || y >= ENV_HEIGHT) && Env.foods[x][y]; + } + + public static boolean foundAndDeleteFood(int x, int y) {// 如果x,y有食物,将其清0,返回true + if (foundFood(x, y)) { + foods[x][y] = false; + return true; + } + return false; + } + private void rebuildFrogAndFood() { frogs.clear(); for (int i = 0; i < ENV_WIDTH; i++) {// 清除食物 @@ -124,7 +146,7 @@ public class Env extends JPanel { for (int i = 0; i < STEPS_PER_ROUND; i++) { if (allDead) { System.out.println("All dead at round:" + i); - break; // 全死光了就直接跳到下一轮,以节省时间 + break; // 青蛙全死光了就直接跳到下一轮,以节省时间 } allDead = true; for (Frog frog : frogs) diff --git a/core/src/main/java/com/github/drinkjava2/frog/Frog.java b/core/src/main/java/com/github/drinkjava2/frog/Frog.java index 9bfe216..1607324 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/Frog.java +++ b/core/src/main/java/com/github/drinkjava2/frog/Frog.java @@ -15,43 +15,35 @@ import java.awt.Image; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; -import java.util.Random; import javax.imageio.ImageIO; import com.github.drinkjava2.frog.brain.Cell; import com.github.drinkjava2.frog.brain.Input; import com.github.drinkjava2.frog.brain.Organ; -import com.github.drinkjava2.frog.brain.Output; -import com.github.drinkjava2.frog.brain.Zone; -import com.github.drinkjava2.frog.brain.group.RandomConnectGroup; import com.github.drinkjava2.frog.egg.Egg; /** - * Frog = brain + organ, but now let's only focus on brain, organs are hard - * coded in egg + * Frog = organs + brain cells * - * 青蛙由脑细胞和器官组成,目前脑细胞可以变异、进化、遗传,以由电脑自动生成神经网络,但是器官在蛋里硬编码,不许进化,将来可以考虑器官的进化 + * 青蛙由器官组成,器官中的Group类会生成各种脑细胞 * * @author Yong Zhu * @since 1.0 */ public class Frog { - public RandomConnectGroup[] cellGroups; - /** brain cells */ public List cells = new ArrayList<>(); /** organs */ public List organs = new ArrayList<>(); - public int x; // frog在env中的x坐标 - public int y; // frog在env中的y坐标 - public long energy = 10000; // 能量为0则死掉 - public boolean alive = true; // 设为false表示青蛙死掉了,将不参与任何计算和显示,以节省时间 + public int x; // frog在Env中的x坐标 + public int y; // frog在Env中的y坐标 + public long frogEngery = 100000; // 能量为0则死掉 + public boolean alive = true; // 设为false表示青蛙死掉了,将不参与计算和显示,以节省时间 - static final Random r = new Random(); static Image frogImg; static { try { @@ -64,62 +56,36 @@ public class Frog { public Frog(int x, int y, Egg egg) { this.x = x; this.y = y; - - // Brain cells - if (egg.cellGroups != null) { - cellGroups = new RandomConnectGroup[egg.cellGroups.length]; - for (int k = 0; k < egg.cellGroups.length; k++) { - RandomConnectGroup g = egg.cellGroups[k]; - cellGroups[k] = new RandomConnectGroup(g); - for (int i = 0; i < g.cellQty; i++) {// 开始根据蛋来创建脑细胞 - Cell c = new Cell(); - c.group = k; - int cellQTY = Math.round(g.inputQtyPerCell); - c.inputs = new Input[cellQTY]; - for (int j = 0; j < cellQTY; j++) { - c.inputs[j] = new Input(); - c.inputs[j].cell = c; - Zone.copyXY(randomPosInZone(g.groupInputZone), c.inputs[j]); - c.inputs[j].radius = g.cellInputRadius; - } - cellQTY = Math.round(g.outputQtyPerCell); - c.outputs = new Output[cellQTY]; - for (int j = 0; j < cellQTY; j++) { - c.outputs[j] = new Output(); - c.outputs[j].cell = c; - Zone.copyXY(randomPosInZone(g.groupOutputZone), c.outputs[j]); - c.outputs[j].radius = g.cellOutputRadius; - } - cells.add(c); - } - } + for (Organ org : egg.organs) { + organs.add(org); + org.init(this);// 每个新器官初始化,如果是Group类,它们会生成许多脑细胞 } - - for (Organ org : egg.organs) - organs.add(org.newCopy()); - } public boolean active(Env v) { - energy -= 20; - if (!alive) + frogEngery -= 1; + if (!alive) { + frogEngery -= 50;// 死了需要消耗更多的能量,退出生存竞争 return false; - if (energy < 0) { + } + if (frogEngery < 0) { // 如果能量小于0则死 alive = false; return false; } - - for (Organ o : organs) + // for (Cell cell1 : cells) {// 大脑主循环 + // if (cell1.energy > 0) + // cell1.energy--; + // for (Input input : cell1.inputs) { + // // TODO + // } + // } + for (Organ o : organs) { // 调用每个Organ的active方法 o.active(this); + } return alive; } - private static Zone randomPosInZone(Zone z) { - return new Zone(z.x - z.radius + z.radius * 2 * r.nextFloat(), z.y - z.radius + z.radius * 2 * r.nextFloat(), - 0); - } - - public void show(Graphics g) { + public void show(Graphics g) {// 显示青蛙的图象 if (!alive) return; g.drawImage(frogImg, x - 8, y - 8, 16, 16, null); diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/BrainPicture.java b/core/src/main/java/com/github/drinkjava2/frog/brain/BrainPicture.java index 78aa207..966622e 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/BrainPicture.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/BrainPicture.java @@ -15,7 +15,6 @@ import javax.swing.JPanel; import com.github.drinkjava2.frog.Application; import com.github.drinkjava2.frog.Frog; -import com.github.drinkjava2.frog.brain.group.RandomConnectGroup; /** * BrainPicture show first frog's brain structure, for debug purpose only @@ -36,30 +35,30 @@ public class BrainPicture extends JPanel { this.setBounds(x, y, brainDispWidth + 1, brainDispWidth + 1); } - void drawZone(Graphics g, Zone z) { + public void drawZone(Graphics g, Zone z) { float rate = brainDispWidth / brainWidth; int x = Math.round(z.x * rate); int y = Math.round(z.y * rate); - int radius = Math.round(z.radius * rate); + int radius = Math.round(z.r * rate); g.drawRect(x - radius, y - radius, radius * 2, radius * 2); } - void drawCircle(Graphics g, Zone z) { + public void drawCircle(Graphics g, Zone z) { float rate = brainDispWidth / brainWidth; int x = Math.round(z.x * rate); int y = Math.round(z.y * rate); g.drawArc(x - 5, y - 5, 10, 10, 0, 360); } - void fillZone(Graphics g, Zone z) { + public void fillZone(Graphics g, Zone z) { float rate = brainDispWidth / brainWidth; int x = Math.round(z.x * rate); int y = Math.round(z.y * rate); - int radius = Math.round(z.radius * rate); + int radius = Math.round(z.r * rate); g.fillRect(x - radius, y - radius, radius * 2, radius * 2); } - void drawLine(Graphics g, Zone z1, Zone z2) { + public void drawLine(Graphics g, Zone z1, Zone z2) { float rate = brainDispWidth / brainWidth; int x1 = Math.round(z1.x * rate); int y1 = Math.round(z1.y * rate); @@ -68,11 +67,11 @@ public class BrainPicture extends JPanel { g.drawLine(x1, y1, x2, y2); } - void drawText(Graphics g, Zone z, String text) { + public void drawText(Graphics g, Zone z, String text) { float rate = brainDispWidth / brainWidth; int x = Math.round(z.x * rate); int y = Math.round(z.y * rate); - g.drawString(text, x - text.length() * 3, y); + g.drawString(text, x - text.length() * 3 - 2, y); } private static final Color[] rainbow = new Color[] { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, MAGENTA }; @@ -84,8 +83,10 @@ public class BrainPicture extends JPanel { return rainbow[nextColor++]; } - private static Color color(float i) { - if (i <= 1) + public static Color color(float i) { + if (i == 0) + return Color.black; + if (i == 1) return Color.RED; if (i <= 3) return Color.ORANGE; @@ -109,26 +110,7 @@ public class BrainPicture extends JPanel { g.setColor(Color.black); g.drawRect(0, 0, brainDispWidth, brainDispWidth); - for (Organ organ : frog.organs) { - g.setColor(Color.BLACK); - drawZone(g, organ); - if (organ.name != null) - drawText(g, organ, String.valueOf(organ.name)); - } - - for (RandomConnectGroup group : frog.cellGroups) { - if (!group.inherit) - g.setColor(Color.lightGray); // 如果是本轮随机生成的,灰色表示 - else - g.setColor(color(group.cellQty)); // 如果是继承的,彩虹色表示,颜色数越往后表示数量越多 - drawLine(g, group.groupInputZone, group.groupOutputZone); - drawZone(g, group.groupInputZone); - fillZone(g, group.groupOutputZone); - if (group.fat > 0) { - g.setColor(Color.BLACK); - drawCircle(g, group.groupOutputZone); // 如果胖了,表示激活过了,下次下蛋少不了这一组 - } - } - + for (Organ organ : frog.organs) + organ.drawOnBrainPicture(this); // each organ draw itself } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/Cell.java b/core/src/main/java/com/github/drinkjava2/frog/brain/Cell.java index 3889841..0321019 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/Cell.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/Cell.java @@ -10,16 +10,25 @@ */ package com.github.drinkjava2.frog.brain; +import com.github.drinkjava2.frog.brain.group.Group; + /** - * Cell is a brain nerve cell, this is the basic unit of frog's brain + * Cell is the basic unit of frog's brain * * @author Yong Zhu * @since 1.0 */ public class Cell { - public int group; // this cell belong to which group - public Input[] inputs; // inputs of cell - public Output[] outputs; // outputs of cell - public long energy; + // this cell belong to frog's which organ + public Group group; + + // inputs of cell + public Input[] inputs; // 每个细胞有一组输入触突 + + // outputs of cell + public Output[] outputs; // 每个细胞有一组输出触突 + + // energy of cell, energy got from food + public long energy; // 每个细胞当前的能量值 } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/Input.java b/core/src/main/java/com/github/drinkjava2/frog/brain/Input.java index de84b46..78f16b4 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/Input.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/Input.java @@ -18,5 +18,9 @@ package com.github.drinkjava2.frog.brain; */ @SuppressWarnings("serial") public class Input extends Zone { - public Cell cell; + public Cell cell; // 这个输入触突属于哪个脑细胞 + + public Input(Zone z) { + super(z); + } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/Organ.java b/core/src/main/java/com/github/drinkjava2/frog/brain/Organ.java index 44cf425..f6d7a91 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/Organ.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/Organ.java @@ -10,6 +10,9 @@ */ package com.github.drinkjava2.frog.brain; +import java.awt.Color; +import java.awt.Graphics; + import com.github.drinkjava2.frog.Frog; /** @@ -20,20 +23,23 @@ import com.github.drinkjava2.frog.Frog; * @author Yong Zhu * @since 1.0.4 */ -public class Organ extends Zone { +public abstract class Organ extends Zone { private static final long serialVersionUID = 1L; - public String name; // 显示在脑图上的器官名称 - public long fat = 0; // 如果细胞活跃多,fat值高,则保留(以及变异)的可能性大,反之则舍弃掉 - public int qtyLimit = 5; // 最多允许数量 - public boolean inherit = false; // 器官是继承来的,还是变异来的,后者淘汰率会高 + public String name; // 显示在脑图上的器官名称,可选 + + public long fat = 0; // 如果活跃多,fat值高,则保留(及变异)的可能性大,反之则很可能丢弃掉 + + public boolean allowBorrow() { // 是否允许在精子中将这个器官借出 + return false; + } /** If active in this organ's zone? */ public boolean outputActive(Frog f) { for (Cell cell : f.cells) { for (Output output : cell.outputs) { // if (cell.energy > 10 && this.nearby(output)) { - f.cellGroups[cell.group].fat++; - cell.energy -= 30; + cell.group.fat++; + cell.energy -= 1; return true; } } @@ -41,43 +47,49 @@ public class Organ extends Zone { return false; } + /** Set X, Y, Radius, name of current Organ */ + public Organ setXYRN(float x, float y, float r, String name) { + this.x = x; + this.y = y; + this.r = r; + this.name = name; + return this; + } + + /** Child class can override this method to drawing picture */ + public void drawOnBrainPicture(BrainPicture pic) {// 把自已这个器官在脑图上显示出来,子类可以重写这个方法 + Graphics g = pic.getGraphics();// border + g.setColor(Color.BLACK); // 缺省是黑色 + pic.drawZone(g, this); + if (this.name != null) + pic.drawText(g, this, String.valueOf(this.name)); + } + /** make a new copy of current organ */ - public Organ newCopy() { // 新建一份,用于从蛋复制到Frog + public Organ newCopy() { // 创建一个当前器官的副本 Organ newOrgan = null; try { newOrgan = this.getClass().newInstance(); copyXYR(this, newOrgan); newOrgan.name = this.name; - newOrgan.fat = this.fat; + newOrgan.fat = this.fat; return newOrgan; } catch (Exception e) { throw new UnknownError("Can not make new Organ copy for " + this); } } - /** Set X, Y, Radius of current Organ */ - public Organ setXYR(float x, float y, float radius) { - this.x = x; - this.y = y; - this.radius = radius; - return this; - } - - /** Set X, Y, Radius, name of current Organ */ - public Organ setXYRN(float x, float y, float radius, String name) { - this.x = x; - this.y = y; - this.radius = radius; - this.name = name; - return this; + /** Only call once when frog created , Child class can override this method */ + public void init(Frog f) { // 仅在Frog生成时这个方法会调用一次,缺省啥也不干,通常用于Group子类的初始化 } /** Only call once when frog created , Child class can override this method */ - public void init(Frog f) { + public Organ[] vary() { // 在下蛋时每个器官会调用这个方法,缺省返回自已的副本,Group类通常要覆盖这个方法 + return new Organ[] { newCopy() }; } /** Each loop step call active method, Child class can override this method */ - public void active(Frog f) { + public void active(Frog f) { // 每一步都会调用器官的active方法 ,缺省啥也不干 } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/Output.java b/core/src/main/java/com/github/drinkjava2/frog/brain/Output.java index 03816b4..b794b93 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/Output.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/Output.java @@ -18,5 +18,9 @@ package com.github.drinkjava2.frog.brain; */ @SuppressWarnings("serial") public class Output extends Zone { - public Cell cell; + public Cell cell; // 这个输出触突属于哪个脑细胞 + + public Output(Zone z) { + super(z); + } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/Zone.java b/core/src/main/java/com/github/drinkjava2/frog/brain/Zone.java index 18e8e31..bd443cf 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/Zone.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/Zone.java @@ -22,18 +22,19 @@ import com.github.drinkjava2.frog.Env; */ public class Zone implements Serializable { private static final long serialVersionUID = 1L; + public float x; public float y; - public float radius;// so width of the zone= radius*2 + public float r;// r为这个矩形区边长的一半 public Zone() { - // 空构造器不能省,FastJSON实例化时要用到 + // 空构造器不能省 } - public Zone(float x, float y, float radius) { + public Zone(float x, float y, float r) { this.x = x; this.y = y; - this.radius = radius; + this.r = r; if (this.x < 0) this.x = 0; if (this.y < 0) @@ -47,11 +48,11 @@ public class Zone implements Serializable { public Zone(Zone z) { this.x = z.x; this.y = z.y; - this.radius = z.radius; + this.r = z.r; } public boolean nearby(Zone z) { - float dist = radius + z.radius; + float dist = r + z.r; return (Math.abs(x - z.x) < dist && Math.abs(y - z.y) < dist); } @@ -71,6 +72,13 @@ public class Zone implements Serializable { public static void copyXYR(Zone from, Zone to) { to.x = from.x; to.y = from.y; - to.radius = from.radius; + to.r = from.r; + } + + public void setXYR(float x, float y, float r) { + this.x = x; + this.y = y; + this.r = r; } + } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/group/Group.java b/core/src/main/java/com/github/drinkjava2/frog/brain/group/Group.java index 5cbe408..6328118 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/group/Group.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/group/Group.java @@ -10,6 +10,7 @@ */ package com.github.drinkjava2.frog.brain.group; +import com.github.drinkjava2.frog.Frog; import com.github.drinkjava2.frog.brain.Organ; /** @@ -19,15 +20,32 @@ import com.github.drinkjava2.frog.brain.Organ; * * 为了与旧版CellGroup区分,新版的这个类命名为Group,它代表了一组分布于一个正方形内的细胞群,细胞数量、每个细胞的触突连接方式等参数由当前Group决定, * 可以说每一种Group代表了一种神经网络算法, 通过无数个Group随机的分布、进化、变异,达到最终脑结构适应环境的变化 - * CellGroup会参与遗传和进化,但是它生成的细胞不会参与遗传。 各个Group生成的细胞相加总和就是脑细胞总数。 + * Group会参与遗传和进化,但是它生成的细胞不会参与遗传。 各个Group生成的细胞相加总和就是脑细胞总数。 * - * Group在脑活动中不起作用,可以把Group比作播种机,把种子排列好后,就撒手不管了,在遗传过程中有一个fat参数,如果细胞活跃多,则保留及变异的可能性大,反之则舍弃掉。 - * Group是器官的一种,所以蛋里存放着所有Group的位置、大小、内部参数等信息,但是蛋里面不保存具体的细胞。这样通过控制有多少个"播种机",就可以控制大脑的结构了。 - * Group可以进行位置、大小变动、复制、分裂等多种形式的变异,原则上Group遗传的一下代与父代是同一个播种类型,但不排除也有可能突变成另一个类型的Group。 + * Group在脑活动中不起作用,可以把Group比作播种机,把种子排列好后,就撒手不管了,在遗传过程中有一个fat参数,如果细胞活跃多,则Group保留及变异的可能性大,反之则舍弃掉。 + * Group是器官的一种,所以蛋里存放着所有Group的位置、大小、内部参数等信息,但是蛋里面不保存具体的细胞。这样通过控制有多少个"播种机",就可以控制大脑的结构了,这样可以缩小蛋的尺寸。 + * 原则上Group遗传的一下代与父代是同一个播种(算法)类型,但不排除也有可能突变成另一个类型的Group。 * * @author Yong Zhu * @since 1.0 */ -public class Group extends Organ { +public abstract class Group extends Organ { private static final long serialVersionUID = 1L; + + @Override + public boolean allowBorrow() { // 是否允许在精子中将这个器官借出 + return true; + } + + /** Each loop step call active method, Child class can override this method */ + @Override + public void active(Frog f) { // 每一步都会调用器官的active方法 + f.frogEngery -= 3; // 每个器官运动都要消耗能量, 死了也要消耗能量 + if (!f.alive) + return; + if (f.frogEngery < 0) { // 如果能量小于0则死 + f.alive = false; + return; + } + } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/group/RandomConnectGroup.java b/core/src/main/java/com/github/drinkjava2/frog/brain/group/RandomConnectGroup.java index 263c459..c47ebe4 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/group/RandomConnectGroup.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/group/RandomConnectGroup.java @@ -10,17 +10,25 @@ */ package com.github.drinkjava2.frog.brain.group; -import java.util.Random; +import java.awt.Color; +import java.awt.Graphics; +import com.github.drinkjava2.frog.Frog; +import com.github.drinkjava2.frog.brain.BrainPicture; +import com.github.drinkjava2.frog.brain.Cell; +import com.github.drinkjava2.frog.brain.Input; +import com.github.drinkjava2.frog.brain.Organ; +import com.github.drinkjava2.frog.brain.Output; import com.github.drinkjava2.frog.brain.Zone; +import com.github.drinkjava2.frog.util.RandomUtils; /** * RandomConnectGroup * - * 这是一个随机方式连接两端的Group,它是从旧版的CellGroup改造过来,这是一种最简单的神经元排列方式,只有 - * 它代表一组细胞,触突输入区和输出区分别位于Zone内的任意随机两点。至于是否合理则由frog的遗传进化来决定,不合理的RandomConnectGroup会被淘汰掉。 + * 这是一个随机方式连接两端的Group,它是从旧版的CellGroup改造过来,这是一种最简单的神经元排列方式,只有一组细胞,触突输入区和输出区分别位于Zone内的任意随机两点。 + * 至于是否合理则由frog的遗传进化来决定,不合理的RandomConnectGroup会被淘汰掉。 * - * (还没改造完成,在不破坏原有外在表现的基础上,要平滑将它改造成一个标准Group的子类,也是第一个子类 ) + * (还没改造完成,在不破坏原有外在表现的基础上,要平滑将它改造成一个标准Group的子类,也是第一个子类 ) * * @author Yong Zhu * @since 1.0 @@ -28,50 +36,58 @@ import com.github.drinkjava2.frog.brain.Zone; public class RandomConnectGroup extends Group { private static final long serialVersionUID = 1L; - // TODO need delete below fields, use grid replace - public Zone groupInputZone; // input distribute zone + public Zone inputZone; // 输入触突区 + public Zone outputZone; // 输出触突区 - public Zone groupOutputZone; // output distribute zone + @Override + public void init(Frog f) { + if (inputZone == null) + inputZone = RandomUtils.randomPosInZone(this); + if (outputZone == null) + outputZone = RandomUtils.randomPosInZone(this); - public float cellInputRadius; // input radius of each cell - public float cellOutputRadius; // output radius of each cell + Cell c = new Cell(); + Input in = new Input(inputZone); + in.cell = c; + c.inputs = new Input[] { in }; - public float inputQtyPerCell; // input qty per cell - public float outputQtyPerCell; // output qty per cell - // TODO need delete above fields + Output out = new Output(outputZone); + out.cell = c; + c.outputs = new Output[] { out }; - public float cellQty; // how many nerve cells in this CellGroup - - private static final Random r = new Random(); - - public RandomConnectGroup() { + c.group = this; + f.cells.add(c); + } + @Override + public Organ[] vary() { + if (fat <= 0) + if (RandomUtils.percent(30)) + return new Organ[] {}; + if (RandomUtils.percent(80)) + return new Organ[] { this }; + return new Organ[] { this, newRandomConnGroup(this) }; } - public RandomConnectGroup(RandomConnectGroup g) {// clone old CellGroup - groupInputZone = new Zone(g.groupInputZone); - groupOutputZone = new Zone(g.groupOutputZone); - cellInputRadius = g.cellInputRadius; - cellOutputRadius = g.cellOutputRadius; - cellQty = g.cellQty; - inputQtyPerCell = g.inputQtyPerCell; - outputQtyPerCell = g.outputQtyPerCell; - fat = g.fat; - inherit = g.inherit; + public static RandomConnectGroup newRandomConnGroup(Zone z) { + RandomConnectGroup newOne = new RandomConnectGroup(); + newOne.inputZone = RandomUtils.randomPosInZone(z); + newOne.outputZone = RandomUtils.randomPosInZone(z); + return newOne; } - public RandomConnectGroup(float brainWidth, int randomCellQtyPerGroup, int randomInputQtyPerCell, - int randomOutQtyPerCell) { - inherit = false; - groupInputZone = new Zone(r.nextFloat() * brainWidth, r.nextFloat() * brainWidth, - (float) (r.nextFloat() * brainWidth * .01)); - groupOutputZone = new Zone(r.nextFloat() * brainWidth, r.nextFloat() * brainWidth, - (float) (r.nextFloat() * brainWidth * .01)); - cellQty = 1 + r.nextInt(randomCellQtyPerGroup); - cellInputRadius = (float) (0.001 + r.nextFloat() * 2); - cellOutputRadius = (float) (0.001 + r.nextFloat() * 2); - inputQtyPerCell = 1 + r.nextInt(randomInputQtyPerCell); - outputQtyPerCell = 1 + r.nextInt(randomOutQtyPerCell); + /** Child class can override this method to drawing picture */ + public void drawOnBrainPicture(BrainPicture pic) {// 把自已这个器官在脑图上显示出来,子类可以重写这个方法 + Graphics g = pic.getGraphics();// border + g.setColor(Color.gray); // 缺省是灰色 + pic.drawZone(g, this); + pic.drawLine(g, inputZone, outputZone); + pic.drawZone(g, inputZone); + pic.fillZone(g, outputZone); + if (fat > 0) { + g.setColor(Color.red); + pic.drawCircle(g, outputZone); // 如果胖了,表示激活过了,下次下蛋少不了这一组 + } } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eat.java b/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eat.java index 39fb62e..4d7d29d 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eat.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eat.java @@ -15,24 +15,15 @@ import com.github.drinkjava2.frog.Frog; import com.github.drinkjava2.frog.brain.Organ; /** - * Move up frog 1 unit if outputs of nerve cells active in this zone + * Eat food at current x, y position */ -public class Eat extends Organ { +public class Eat extends Organ {// Eat这个类将食物转化为能量,能量小于0,则青蛙死掉 private static final long serialVersionUID = 1L; @Override public void active(Frog f) { - int x = f.x; - int y = f.y; - if (x < 0 || x >= Env.ENV_WIDTH || y < 0 || y >= Env.ENV_HEIGHT) {// 越界者死! - f.alive = false; - return; - } - - if (Env.foods[x][y]) { - Env.foods[x][y] = false; - f.energy = f.energy + 1000;// 吃掉food,能量境加 - } + if (Env.foundAndDeleteFood(f.x, f.y)) + f.frogEngery = f.frogEngery + 1000;// 如果青蛙的坐标与食物重合,吃掉food,能量境加 } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eye.java b/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eye.java index 2a245c3..198924c 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eye.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Eye.java @@ -27,15 +27,11 @@ import com.github.drinkjava2.frog.brain.Zone; public class Eye extends Organ { private static final long serialVersionUID = 1L; - private static boolean hasFood(int x, int y) { - return x >= 0 && y >= 0 && x < Env.ENV_WIDTH && y < Env.ENV_HEIGHT && Env.foods[x][y]; - } - @Override public void active(Frog f) { // 第一个眼睛只能观察上、下、左、右四个方向有没有食物 - float qRadius = radius / 4; - float q3Radius = (float) (radius * .75); + float qRadius = r / 4; + float q3Radius = (float) (r * .75); Zone seeUp = new Zone(x, y + q3Radius, qRadius); Zone seeDown = new Zone(x, y - q3Radius, qRadius); Zone seeLeft = new Zone(x - q3Radius, y, qRadius); @@ -49,28 +45,28 @@ public class Eye extends Organ { int seeDist = 10; for (int i = 1; i < seeDist; i++) - if (hasFood(f.x, f.y + i)) { + if (Env.foundFood(f.x, f.y + i)) { seeFood = true; foodAtUp = true; break; } for (int i = 1; i < seeDist; i++) - if (hasFood(f.x, f.y - i)) { + if (Env.foundFood(f.x, f.y - i)) { seeFood = true; foodAtDown = true; break; } for (int i = 1; i < seeDist; i++) - if (hasFood(f.x - i, f.y)) { + if (Env.foundFood(f.x - i, f.y)) { seeFood = true; foodAtLeft = true; break; } for (int i = 1; i < seeDist; i++) - if (hasFood(f.x + i, f.y)) { + if (Env.foundFood(f.x + i, f.y)) { seeFood = true; foodAtRight = true; break; diff --git a/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Hungry.java b/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Hungry.java index 0e3363f..dcd05f1 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Hungry.java +++ b/core/src/main/java/com/github/drinkjava2/frog/brain/organ/Hungry.java @@ -23,11 +23,8 @@ public class Hungry extends Organ { @Override public void active(Frog f) { - for (Cell cell : f.cells) { - if (cell.energy > 0) - cell.energy--; - - if (f.energy < 10000 && cell.energy < 100) + for (Cell cell : f.cells) { + if (f.frogEngery < 10000 && cell.energy < 1000) for (Input input : cell.inputs) if (input.nearby(this)) // input zone near by hungry zone cell.energy += 2; diff --git a/core/src/main/java/com/github/drinkjava2/frog/egg/CellGroup.java b/core/src/main/java/com/github/drinkjava2/frog/egg/CellGroup.java new file mode 100644 index 0000000..6768e40 --- /dev/null +++ b/core/src/main/java/com/github/drinkjava2/frog/egg/CellGroup.java @@ -0,0 +1,14 @@ +/* + * Copyright 2018 the original author or authors. + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by + * applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS + * OF ANY KIND, either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + */ +package com.github.drinkjava2.frog.egg; + +public class CellGroup { +} diff --git a/core/src/main/java/com/github/drinkjava2/frog/egg/Egg.java b/core/src/main/java/com/github/drinkjava2/frog/egg/Egg.java index 8be97fd..9419561 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/egg/Egg.java +++ b/core/src/main/java/com/github/drinkjava2/frog/egg/Egg.java @@ -13,12 +13,10 @@ package com.github.drinkjava2.frog.egg; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import java.util.Random; -import com.github.drinkjava2.frog.Env; import com.github.drinkjava2.frog.Frog; import com.github.drinkjava2.frog.brain.Organ; -import com.github.drinkjava2.frog.brain.Zone; +import com.github.drinkjava2.frog.brain.group.Group; import com.github.drinkjava2.frog.brain.group.RandomConnectGroup; import com.github.drinkjava2.frog.brain.organ.Eat; import com.github.drinkjava2.frog.brain.organ.Eye; @@ -27,6 +25,7 @@ import com.github.drinkjava2.frog.brain.organ.MoveDown; import com.github.drinkjava2.frog.brain.organ.MoveLeft; import com.github.drinkjava2.frog.brain.organ.MoveRight; import com.github.drinkjava2.frog.brain.organ.MoveUp; +import com.github.drinkjava2.frog.util.RandomUtils; /** * Egg is the static structure description of frog, can save as text file, to @@ -40,109 +39,12 @@ import com.github.drinkjava2.frog.brain.organ.MoveUp; */ public class Egg implements Serializable { private static final long serialVersionUID = 1L; - public int randomCellGroupQty = 30; // 随机生成多少个组 - public int randomCellQtyPerGroup = 3; // 每个组有多少个脑细胞 - public int randomInputQtyPerCell = 3;// 每个脑细胞有多少个输入触突 - public int randomOutQtyPerCell = 2; // 每个脑细胞有多少个输出触突 - public RandomConnectGroup[] cellGroups; + public List organs = new ArrayList<>(); - public List organs = new ArrayList(); + public List groups = new ArrayList<>(); - public Egg() { - // default constructor - } - - private static Random r = new Random(); - - /** Create a egg by join 2 eggs, x+y=zygote */ - public Egg(Egg x, Egg y) { - // 模拟XY染色体,不能做简单加法,会撑暴内存的,现在每次只随机加一个y的cellgroup进来,这也不太好,因为基因会越加越多,只好用用进废退原则来加大淘汰率。 - - // x里原来的CellGroup - cellGroups = new RandomConnectGroup[x.cellGroups.length + 1 + randomCellGroupQty]; - for (int i = 0; i < x.cellGroups.length; i++) { - RandomConnectGroup oldCellGroup = x.cellGroups[i]; - RandomConnectGroup cellGroup = new RandomConnectGroup(); - cellGroups[i] = cellGroup; - cellGroup.inherit = true; - cellGroup.groupInputZone = new Zone(oldCellGroup.groupInputZone); - cellGroup.groupOutputZone = new Zone(oldCellGroup.groupOutputZone); - cellGroup.cellQty = oldCellGroup.cellQty; - cellGroup.cellInputRadius = oldCellGroup.cellInputRadius; - cellGroup.cellOutputRadius = oldCellGroup.cellOutputRadius; - cellGroup.inputQtyPerCell = oldCellGroup.inputQtyPerCell; - cellGroup.outputQtyPerCell = oldCellGroup.outputQtyPerCell; - } - - // 从y里借一个CellGroup - RandomConnectGroup randomY = y.cellGroups[r.nextInt(y.cellGroups.length)]; - RandomConnectGroup cellGroup = new RandomConnectGroup(randomY); - cellGroups[x.cellGroups.length] = cellGroup; - - // 随机生成一批CellGroup - for (int i = 0; i < randomCellGroupQty; i++) - cellGroups[i + x.cellGroups.length + 1] = new RandomConnectGroup(Env.FROG_BRAIN_WIDTH, x.randomCellQtyPerGroup, - x.randomInputQtyPerCell, x.randomOutQtyPerCell); - - addInitialOrgans(); - } - - /** create a brand new Egg */ - public static Egg createBrandNewEgg() { // 无中生有,创建一个蛋,先有蛋,后有鸡 - Egg egg = new Egg(); - egg.cellGroups = new RandomConnectGroup[egg.randomCellGroupQty]; - for (int i = 0; i < egg.randomCellGroupQty; i++) - egg.cellGroups[i] = new RandomConnectGroup(Env.FROG_BRAIN_WIDTH, egg.randomCellQtyPerGroup, - egg.randomInputQtyPerCell, egg.randomOutQtyPerCell); - egg.addInitialOrgans(); - return egg; - } - - private static boolean percent(int percent) { - return r.nextInt(100) < percent; - } - - private static float vary(float f) { // 大部分时候不变,有极小机会变异,有极极小机会大变异,有极极极小机会大大大变异 - int i = r.nextInt(100); - if (i < 95) - return f; - float rate = .05f; - if (i > 97) - rate = .1f; - return (float) (f * ((1 - rate) + r.nextFloat() * rate * 2)); - } - - /** Create egg from frog */ - public Egg(Frog frog) { // 青蛙下蛋,蛋的基因生成遵循用进废退、随机变异两个原则 - List gpList = new ArrayList<>(); - for (int i = 0; i < frog.cellGroups.length; i++) { - if (frog.cellGroups[i].fat <= 0) { - if (!frog.cellGroups[i].inherit) - continue;// 从未激活过的神经元,并且就是本轮随机生成的,丢弃之 - if (percent(5)) - continue;// 继承下来的神经元,但是本轮并没用到, 扔掉又可惜,可以小概率丢掉 - } - RandomConnectGroup cellGroup = new RandomConnectGroup(); - RandomConnectGroup oldGp = frog.cellGroups[i]; - cellGroup.groupInputZone = new Zone(vary(oldGp.groupInputZone.x), vary(oldGp.groupInputZone.y), - vary(oldGp.groupInputZone.radius)); - cellGroup.groupOutputZone = new Zone(vary(oldGp.groupOutputZone.x), vary(oldGp.groupOutputZone.y), - vary(oldGp.groupOutputZone.radius)); - cellGroup.cellQty = Math.round(vary(oldGp.cellQty)); - cellGroup.cellInputRadius = vary(oldGp.cellInputRadius); - cellGroup.cellOutputRadius = vary(oldGp.cellOutputRadius); - cellGroup.inputQtyPerCell = Math.round(vary(oldGp.inputQtyPerCell)); - cellGroup.outputQtyPerCell = Math.round(vary(oldGp.outputQtyPerCell)); - cellGroup.inherit = true; - gpList.add(cellGroup); - } - cellGroups = gpList.toArray(new RandomConnectGroup[gpList.size()]); - addInitialOrgans(); - } - - /** Hard code add initial organs */ - public void addInitialOrgans() { // 这是硬编码添加初始器官, 器官的数量、位置、内部参数会参加遗传、变异 + public Egg() {// 无中生有,创建一个蛋,先有蛋,后有鸡 organs.add(new Hungry().setXYRN(300, 100, 100, "Hungry")); organs.add(new MoveUp().setXYRN(800, 100, 60, "Up")); organs.add(new MoveDown().setXYRN(800, 400, 60, "Down")); @@ -150,7 +52,44 @@ public class Egg implements Serializable { organs.add(new MoveRight().setXYRN(900, 250, 60, "Right")); organs.add(new Eat().setXYRN(0, 0, 0, "Eat")); organs.add(new Eye().setXYRN(100, 400, 100, "Eye")); - //organs.add(new Eye().setXYRN(100, 700, 100, "Eye")); + for (int i = 0; i <10; i++) { + organs.add( new RandomConnectGroup().setXYRN(500, 500, 500, null)); + } + + } + + /** Create egg from frog */ + public Egg(Frog frog) { // 青蛙下蛋,每个青蛙的器官会创建自已的副本或变异,可以是0或多个 + for (Organ organ : frog.organs) + for (Organ newOrgan : organ.vary()) + organs.add(newOrgan); + for (int i = 0; i <10; i++) { + organs.add( new RandomConnectGroup().setXYRN(500, 500, 500, null)); + } + } + + /** + * Create a egg by join 2 eggs, x+y=zygote 模拟X、Y 染色体合并,两个蛋生成一个新的蛋, X从Y里借一个器官, + * 不用担心器官会越来越多,因为通过用进废退原则来筛选,没用到的器官会在几代之后被自然淘汰掉 + * 器官不是越多越好,因为器官需要消耗能量,器官数量多了,在生存竞争中也是劣势 + * + */ + public Egg(Egg x, Egg y) { + // x里原来的organ + for (Organ organ : x.organs) + for (Organ newOrgan : organ.vary()) + organs.add(newOrgan); + + // 从y里借一个organ + int yOrganSize = y.organs.size(); + if (yOrganSize > 0) { + Organ o = y.organs.get(RandomUtils.nextInt(yOrganSize)); + if (o.allowBorrow()) + organs.add(o); + } + for (int i = 0; i <10; i++) { + organs.add( new RandomConnectGroup().setXYRN(500, 500, 500, null)); + } } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/egg/EggTool.java b/core/src/main/java/com/github/drinkjava2/frog/egg/EggTool.java index ca6f278..508631b 100644 --- a/core/src/main/java/com/github/drinkjava2/frog/egg/EggTool.java +++ b/core/src/main/java/com/github/drinkjava2/frog/egg/EggTool.java @@ -23,10 +23,11 @@ import java.util.List; import com.github.drinkjava2.frog.Application; import com.github.drinkjava2.frog.Env; import com.github.drinkjava2.frog.Frog; +import com.github.drinkjava2.frog.brain.Organ; import com.github.drinkjava2.frog.util.FrogFileUtils; /** - * EggTool store public static methods of egg + * EggTool save eggs to disk * * @author Yong Zhu * @since 1.0 @@ -34,18 +35,30 @@ import com.github.drinkjava2.frog.util.FrogFileUtils; public class EggTool { /** + * Frogs which have higher energy lay eggs + * * 利用Java串行机制存盘。 能量多(也就是吃的更多,更fat)的Frog下蛋并存盘, 以进行下一伦测试,能量少的Frog被淘汰,没有下蛋的资格。 + * 用能量的多少来简化生存竟争模拟 */ public static void layEggs(Env env) { sortFrogsOrderByEnergyDesc(env); - System.out.print("First frog has " + env.frogs.get(0).cellGroups.length + " cellgroups, energy=" - + env.frogs.get(0).energy); - System.out.print(", Last frog energy=" + env.frogs.get(env.frogs.size() - 1).energy + ", "); + + Frog first = env.frogs.get(0); + Frog last = env.frogs.get(env.frogs.size() - 1); + + System.out.print("First frog has " + first.organs.size() + " organs, energy=" + first.frogEngery); + System.out.print(", Last frog has " + last.organs.size() + " organs, energy=" + last.frogEngery); + if (Env.DEBUG_MODE) + for (int i = 0; i < first.organs.size(); i++) { + Organ org = first.organs.get(i); + System.out.println("Organ(" + i + ")=" + org + ", fat=" + org.fat); + } + try { List newEggs = new ArrayList<>(); for (int i = 0; i < Env.EGG_QTY; i++) newEggs.add(new Egg(env.frogs.get(i))); - System.out.print("EggCellGroups=" + newEggs.get(0).cellGroups.length + ", "); + System.out.print("organs =" + newEggs.get(0).organs.size() + ", "); FileOutputStream fo = new FileOutputStream(Application.CLASSPATH + "eggs.ser"); ObjectOutputStream so = new ObjectOutputStream(fo); @@ -53,20 +66,19 @@ public class EggTool { so.close(); env.eggs = newEggs; - System.out - .println("Saved " + env.eggs.size() + " eggs to file '" + Application.CLASSPATH + "eggs.ser" + "'"); + System.out.println( + ", Saved " + env.eggs.size() + " eggs to file '" + Application.CLASSPATH + "eggs.ser" + "'"); } catch (IOException e) { System.out.println(e); } } - private static void sortFrogsOrderByEnergyDesc(Env env) { + private static void sortFrogsOrderByEnergyDesc(Env env) {// 按能量多少给青蛙排序 Collections.sort(env.frogs, new Comparator() { - public int compare(Frog a, Frog b) { - if (a.energy > b.energy) + if (a.frogEngery > b.frogEngery) return -1; - else if (a.energy == b.energy) + else if (a.frogEngery == b.frogEngery) return 0; else return 1; @@ -75,7 +87,6 @@ public class EggTool { } public static void deleteEggs() { - FrogFileUtils.deleteFile(Application.CLASSPATH + "eggs.json"); FrogFileUtils.deleteFile(Application.CLASSPATH + "eggs.ser"); } @@ -100,7 +111,7 @@ public class EggTool { + " new eggs to do test."); env.eggs = new ArrayList(); for (int i = 0; i < Env.EGG_QTY; i++) - env.eggs.add(Egg.createBrandNewEgg()); + env.eggs.add(new Egg()); } } diff --git a/core/src/main/java/com/github/drinkjava2/frog/util/RandomUtils.java b/core/src/main/java/com/github/drinkjava2/frog/util/RandomUtils.java new file mode 100644 index 0000000..6249053 --- /dev/null +++ b/core/src/main/java/com/github/drinkjava2/frog/util/RandomUtils.java @@ -0,0 +1,53 @@ +/* Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by + * applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS + * OF ANY KIND, either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + */ +package com.github.drinkjava2.frog.util; + +import java.util.Random; + +import com.github.drinkjava2.frog.brain.Zone; + +/** + * Random Utilities used in this project + * + * @author Yong Zhu + * @since 1.0 + */ +public class RandomUtils { + private static final Random rand = new Random(); + + public static int nextInt(int i) { + return rand.nextInt(i); + } + + public static float nextFloat() { + return rand.nextFloat(); + } + + public static Zone randomPosInZone(Zone z) { + return new Zone(z.x - z.r + z.r * 2 * rand.nextFloat(), z.y - z.r + z.r * 2 * rand.nextFloat(), + z.r * rand.nextFloat() * .02f); + } + + public static boolean percent(int percent) { + return rand.nextInt(100) < percent; + } + + public static float vary(float f) { // 大部分时候不变,有极小机会变异,有极极小机会大变异,有极极极小机会大大大变异 + int i = rand.nextInt(100); + if (i < 95) + return f; + float rate = .05f; + if (i > 97) + rate = .1f; + return (float) (f * ((1 - rate) + rand.nextFloat() * rate * 2)); + } + +} diff --git a/eggs.ser b/eggs.ser new file mode 100644 index 0000000000000000000000000000000000000000..29b6de0d412ba5ff34ffa25240dae87899c5fe1d GIT binary patch literal 282415 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

GM~bAV@o60`FrIzf3zi1xONW5Lx(BU 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 literal 0 HcmV?d00001