From d495ebe8bdd73f41358fd7c1578dee65efa87ce4 Mon Sep 17 00:00:00 2001 From: BrunoDatoMeneses <bruno.dato.meneses@gmail.com> Date: Wed, 18 Sep 2019 15:15:25 +0200 Subject: [PATCH] ENH: multiUI for AMAKFX with randomAnt example --- AMAKFX/src/fr/irit/smac/amak/Agent.java | 1 + AMAKFX/src/fr/irit/smac/amak/Amas.java | 7 +- AMAKFX/src/fr/irit/smac/amak/Environment.java | 24 +-- AMAKFX/src/fr/irit/smac/amak/Scheduler.java | 17 +- .../amak/examples/randomants/AntExample.java | 176 +++++++++--------- .../randomantsMultiUi/AntExampleMutliUI.java | 1 + .../AntsLaunchExampleMultiUI.java | 2 - 7 files changed, 117 insertions(+), 111 deletions(-) diff --git a/AMAKFX/src/fr/irit/smac/amak/Agent.java b/AMAKFX/src/fr/irit/smac/amak/Agent.java index 63e97500..1de07ab9 100644 --- a/AMAKFX/src/fr/irit/smac/amak/Agent.java +++ b/AMAKFX/src/fr/irit/smac/amak/Agent.java @@ -315,6 +315,7 @@ public abstract class Agent<A extends Amas<E>, E extends Environment> implements */ @Override public void run() { + ExecutionPolicy executionPolicy = amas.getExecutionPolicy(); if (executionPolicy == ExecutionPolicy.TWO_PHASES) { diff --git a/AMAKFX/src/fr/irit/smac/amak/Amas.java b/AMAKFX/src/fr/irit/smac/amak/Amas.java index 930f06c0..f56acaf8 100644 --- a/AMAKFX/src/fr/irit/smac/amak/Amas.java +++ b/AMAKFX/src/fr/irit/smac/amak/Amas.java @@ -169,14 +169,15 @@ public class Amas<E extends Environment> implements Schedulable { vuiMulti.addTabbedDefaultPanel(amasMultiUIWindow); executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(Configuration.allowedSimultaneousAgentsExecution); + + //this.scheduler = environment.getScheduler(); if (scheduling == Scheduling.DEFAULT) { - //MainWindow.instance(); - this.scheduler = Scheduler.getDefaultScheduler(window); + + this.scheduler = Scheduler.getDefaultMultiUIScheduler(window); this.scheduler.add(this); } else { this.scheduler = new Scheduler(this); if (scheduling == Scheduling.UI && !Configuration.commandLineMode) { - //MainWindow.instance(); amasMultiUIWindow.addToolbar(new SchedulerToolbar("Amas #" + id, getScheduler())); } } diff --git a/AMAKFX/src/fr/irit/smac/amak/Environment.java b/AMAKFX/src/fr/irit/smac/amak/Environment.java index 1d87b8ee..e048ea29 100644 --- a/AMAKFX/src/fr/irit/smac/amak/Environment.java +++ b/AMAKFX/src/fr/irit/smac/amak/Environment.java @@ -67,22 +67,22 @@ public abstract class Environment implements Schedulable { public Environment(AmasMultiUIWindow window, Scheduling _scheduling, Object... params) { amasMultiUIWindow = window; - if (_scheduling == Scheduling.DEFAULT) { - this.scheduler = Scheduler.getDefaultScheduler(window); - this.scheduler.add(this); - } else { - this.scheduler = new Scheduler(this); - if (_scheduling == Scheduling.UI && !Configuration.commandLineMode) - amasMultiUIWindow.addToolbar(new SchedulerToolbar("Environment #" + id, getScheduler())); - } - - this.scheduler.lock(); +// if (_scheduling == Scheduling.DEFAULT) { +// this.scheduler = Scheduler.getDefaultMultiUIScheduler(window); +// this.scheduler.add(this); +// } else { +// this.scheduler = new Scheduler(this); +// if (_scheduling == Scheduling.UI && !Configuration.commandLineMode) +// amasMultiUIWindow.addToolbar(new SchedulerToolbar("Environment #" + id, getScheduler())); +// } +// +// this.scheduler.lock(); this.params = params; onInitialization(); onInitialEntitiesCreation(); if (!Configuration.commandLineMode) onRenderingInitialization(); - this.scheduler.unlock(); +// this.scheduler.unlock(); } /** @@ -165,4 +165,6 @@ public abstract class Environment implements Schedulable { @Override public void onSchedulingStops() { } + + } diff --git a/AMAKFX/src/fr/irit/smac/amak/Scheduler.java b/AMAKFX/src/fr/irit/smac/amak/Scheduler.java index f509d7f4..2c6a1a18 100644 --- a/AMAKFX/src/fr/irit/smac/amak/Scheduler.java +++ b/AMAKFX/src/fr/irit/smac/amak/Scheduler.java @@ -60,6 +60,8 @@ public class Scheduler implements Runnable, Serializable { * The default scheduler */ private static Scheduler defaultScheduler; + + /** * The schedulables that must be added */ @@ -120,16 +122,17 @@ public class Scheduler implements Runnable, Serializable { return defaultScheduler; } - public static Scheduler getDefaultScheduler(AmasMultiUIWindow window) { - if (defaultScheduler == null) { - defaultScheduler = new Scheduler(); + + + + + public static Scheduler getDefaultMultiUIScheduler(AmasMultiUIWindow window) { + Scheduler multiUIScheduler = new Scheduler(); if (!Configuration.commandLineMode) { - //MainWindow.instance(); - SchedulerToolbar st = new SchedulerToolbar("Default", defaultScheduler); + SchedulerToolbar st = new SchedulerToolbar("Default", multiUIScheduler); window.addToolbar(st); } - } - return defaultScheduler; + return multiUIScheduler; } /** diff --git a/AMAKFX/src/fr/irit/smac/amak/examples/randomants/AntExample.java b/AMAKFX/src/fr/irit/smac/amak/examples/randomants/AntExample.java index 8186b0d4..9a847c63 100644 --- a/AMAKFX/src/fr/irit/smac/amak/examples/randomants/AntExample.java +++ b/AMAKFX/src/fr/irit/smac/amak/examples/randomants/AntExample.java @@ -1,88 +1,88 @@ -package fr.irit.smac.amak.examples.randomants; - -import fr.irit.smac.amak.Agent; -import fr.irit.smac.amak.ui.VUI; -import fr.irit.smac.amak.ui.drawables.DrawableImage; - -public class AntExample extends Agent<AntHillExample, WorldExample> { - - private boolean dead = false; - - /** - * X coordinate of the ant in the world - */ - public double dx; - /** - * Y coordinate of the ant in the world - */ - public double dy; - /** - * Angle in radians - */ - private double angle = Math.random() * Math.PI * 2; - private DrawableImage image; - - /** - * Constructor of the ant - * - * @param amas - * the amas the ant belongs to - * @param startX - * Initial X coordinate - * @param startY - * Initial Y coordinate - */ - public AntExample(AntHillExample amas, double startX, double startY) { - super(amas, startX, startY); - } - @Override - public void onInitialization() { - dx = (double) params[0]; - dy = (double) params[1]; - } - - @Override - protected void onRenderingInitialization() { - image = VUI.get().createAndAddImage(dx, dy, "file:resources/ant.png"); - image.setName("Ant "+getId()); - } - - /** - * Move in a random direction - */ - @Override - protected void onDecideAndAct() { - double random = amas.getEnvironment().getRandom().nextGaussian(); - angle += random * 0.1; - dx += Math.cos(angle); - dy += Math.sin(angle); - while (dx >= getAmas().getEnvironment().getWidth() / 2) - dx -= getAmas().getEnvironment().getWidth(); - while (dy >= getAmas().getEnvironment().getHeight() / 2) - dy -= getAmas().getEnvironment().getHeight(); - while (dx < -getAmas().getEnvironment().getWidth() / 2) - dx += getAmas().getEnvironment().getWidth(); - while (dy < -getAmas().getEnvironment().getHeight() / 2) - dy += getAmas().getEnvironment().getHeight(); - - if (amas.getEnvironment().getRandom().nextDouble() < 0.001) { - dead = true; - destroy(); - } - - if (amas.getEnvironment().getRandom().nextDouble() < 0.001) { - new AntExample(getAmas(), dx, dy); - } - } - - @Override - public void onUpdateRender() { - image.move(dx, dy); - image.setAngle(angle); - image.setInfo("Ant "+getId()+"\nPosition "+dx+" "+dy+"\nAngle "+angle); - if(dead) { - image.setFilename("file:Resources/ant_dead.png"); - image.setInfo("Ant "+getId()+"\nPosition "+dx+" "+dy+"\nAngle "+angle+"\nDead"); - } - } -} +package fr.irit.smac.amak.examples.randomants; + +import fr.irit.smac.amak.Agent; +import fr.irit.smac.amak.ui.VUI; +import fr.irit.smac.amak.ui.drawables.DrawableImage; + +public class AntExample extends Agent<AntHillExample, WorldExample> { + + private boolean dead = false; + + /** + * X coordinate of the ant in the world + */ + public double dx; + /** + * Y coordinate of the ant in the world + */ + public double dy; + /** + * Angle in radians + */ + private double angle = Math.random() * Math.PI * 2; + private DrawableImage image; + + /** + * Constructor of the ant + * + * @param amas + * the amas the ant belongs to + * @param startX + * Initial X coordinate + * @param startY + * Initial Y coordinate + */ + public AntExample(AntHillExample amas, double startX, double startY) { + super(amas, startX, startY); + } + @Override + public void onInitialization() { + dx = (double) params[0]; + dy = (double) params[1]; + } + + @Override + protected void onRenderingInitialization() { + image = VUI.get().createAndAddImage(dx, dy, "file:resources/ant.png"); + image.setName("Ant "+getId()); + } + + /** + * Move in a random direction + */ + @Override + protected void onDecideAndAct() { + double random = amas.getEnvironment().getRandom().nextGaussian(); + angle += random * 0.1; + dx += Math.cos(angle); + dy += Math.sin(angle); + while (dx >= getAmas().getEnvironment().getWidth() / 2) + dx -= getAmas().getEnvironment().getWidth(); + while (dy >= getAmas().getEnvironment().getHeight() / 2) + dy -= getAmas().getEnvironment().getHeight(); + while (dx < -getAmas().getEnvironment().getWidth() / 2) + dx += getAmas().getEnvironment().getWidth(); + while (dy < -getAmas().getEnvironment().getHeight() / 2) + dy += getAmas().getEnvironment().getHeight(); + + if (amas.getEnvironment().getRandom().nextDouble() < 0.001) { + dead = true; + destroy(); + } + + if (amas.getEnvironment().getRandom().nextDouble() < 0.001) { + new AntExample(getAmas(), dx, dy); + } + } + + @Override + public void onUpdateRender() { + image.move(dx, dy); + image.setAngle(angle); + image.setInfo("Ant "+getId()+"\nPosition "+dx+" "+dy+"\nAngle "+angle); + if(dead) { + image.setFilename("file:Resources/ant_dead.png"); + image.setInfo("Ant "+getId()+"\nPosition "+dx+" "+dy+"\nAngle "+angle+"\nDead"); + } + } +} diff --git a/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntExampleMutliUI.java b/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntExampleMutliUI.java index 4b09958e..a8b731ca 100644 --- a/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntExampleMutliUI.java +++ b/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntExampleMutliUI.java @@ -55,6 +55,7 @@ public class AntExampleMutliUI extends Agent<AntHillExampleMultiUI, WorldExample */ @Override protected void onDecideAndAct() { + double random = amas.getEnvironment().getRandom().nextGaussian(); angle += random * 0.1; dx += Math.cos(angle); diff --git a/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntsLaunchExampleMultiUI.java b/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntsLaunchExampleMultiUI.java index 51e5a90c..560e6cf4 100644 --- a/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntsLaunchExampleMultiUI.java +++ b/AMAKFX/src/fr/irit/smac/amak/examples/randomantsMultiUi/AntsLaunchExampleMultiUI.java @@ -35,8 +35,6 @@ public class AntsLaunchExampleMultiUI extends Application{ AntHillExampleMultiUI amas1 = new AntHillExampleMultiUI(window, VUIMulti.getDefault(), env); - - AntHillExampleMultiUI amas2 = new AntHillExampleMultiUI(window2, VUIMulti.getDefault(), env2); } -- GitLab