diff --git a/src/main/java/agents/Agent.java b/src/main/java/agents/Agent.java index 07fba3ca7c4a95a1fad565c22740022945f3b228..fcd55ead1704e7f779be11bd9b460cfd34f00ef8 100644 --- a/src/main/java/agents/Agent.java +++ b/src/main/java/agents/Agent.java @@ -1,6 +1,6 @@ package agents; -public interface Agent { +import behaviors.Wakeable; - void wakeUp(); +public interface Agent extends Wakeable { } diff --git a/src/main/java/agents/Agent2D.java b/src/main/java/agents/Agent2D.java index efc183b074d4b9676452696b70608233d7897348..58d03143159f92ad9a2ae83f2aaf2bfce7edfd05 100644 --- a/src/main/java/agents/Agent2D.java +++ b/src/main/java/agents/Agent2D.java @@ -1,8 +1,7 @@ package agents; -import java.awt.*; +import behaviors.Positionable2D; -public interface Agent2D extends Agent { +public interface Agent2D extends Agent, Positionable2D { - Point getPosition(); } diff --git a/src/main/java/agents/FairInfectionRWAgent.java b/src/main/java/agents/FairInfectionRWAgent.java index 69883ee5c563728aa60cebe34c31d64dcbcf6709..260525253a5526bf4676b742573dfce8e9a9832e 100644 --- a/src/main/java/agents/FairInfectionRWAgent.java +++ b/src/main/java/agents/FairInfectionRWAgent.java @@ -7,7 +7,7 @@ import java.awt.*; public class FairInfectionRWAgent extends RandomWalkingAgent implements SEIRSAgent { - public FairInfectionRWAgent(Point position, int seed, SEIRSEnvironment environment) { + public FairInfectionRWAgent(Point position, long seed, SEIRSEnvironment environment) { super(position, seed, environment); } @@ -16,7 +16,7 @@ public class FairInfectionRWAgent extends RandomWalkingAgent implements SEIRSAge boolean isExposed = false; int roll = r.nextInt(10000)+1; if (this.environment.getInfectedNeighbors(position).size() != 0) { - if (roll <= YamlReader.getParams().getInfectionRate()*10000) { + if (roll <= YamlReader.getParams().infectionRate()*10000) { isExposed = true; } } diff --git a/src/main/java/agents/RandomWalkingAgent.java b/src/main/java/agents/RandomWalkingAgent.java index 6cc0bb889f7fc35293ebf60de74697574888a4a6..94187e770f7fe05b9ab615d20f84d1a5ac3a288b 100644 --- a/src/main/java/agents/RandomWalkingAgent.java +++ b/src/main/java/agents/RandomWalkingAgent.java @@ -2,35 +2,27 @@ package agents; import agents.states.SEIRSState; import agents.states.SuceptibleSEIRSState; +import behaviors.Randomized; import environment.SEIRSEnvironment; import utils.YamlReader; import java.awt.Point; -import java.security.SecureRandom; import java.util.List; -import java.util.Random; -@SuppressWarnings("ThrowablePrintedToSystemOut") -public class RandomWalkingAgent implements SEIRSAgent { +public class RandomWalkingAgent extends Randomized implements SEIRSAgent { protected Point position; - protected Random r; protected final SEIRSEnvironment environment; protected SEIRSState state; private List<Point> authorizedPositions; private Point nextPosition; - public RandomWalkingAgent(Point position, int seed, SEIRSEnvironment environment) { + public RandomWalkingAgent(Point position, long seed, SEIRSEnvironment environment) { + super(seed); this.position = position; this.state = new SuceptibleSEIRSState(this); this.environment = environment; - try{ - r = SecureRandom.getInstance("SHA1PRNG", "SUN"); - }catch (Exception e) { - System.err.println(e); - System.exit(1); - } r.setSeed(seed); } diff --git a/src/main/java/behaviors/Positionable2D.java b/src/main/java/behaviors/Positionable2D.java new file mode 100644 index 0000000000000000000000000000000000000000..ea57469bc49188d301116367ad3589b977365e8d --- /dev/null +++ b/src/main/java/behaviors/Positionable2D.java @@ -0,0 +1,8 @@ +package behaviors; + +import java.awt.*; + +public interface Positionable2D { + + Point getPosition(); +} diff --git a/src/main/java/behaviors/Randomized.java b/src/main/java/behaviors/Randomized.java new file mode 100644 index 0000000000000000000000000000000000000000..f0cf39fc7656616ee8668cea89be3764320f74d3 --- /dev/null +++ b/src/main/java/behaviors/Randomized.java @@ -0,0 +1,21 @@ +package behaviors; + +import java.security.SecureRandom; +import java.util.Random; + +public abstract class Randomized { + + protected Random r; + + @SuppressWarnings("ThrowablePrintedToSystemOut") + public Randomized(long seed) { + try{ + r = SecureRandom.getInstance("SHA1PRNG", "SUN"); + }catch (Exception e) { + System.err.println(e); + System.exit(1); + } + r.setSeed(seed); + } + +} diff --git a/src/main/java/behaviors/Wakeable.java b/src/main/java/behaviors/Wakeable.java new file mode 100644 index 0000000000000000000000000000000000000000..dfb18696f438cbcecbdf1413030aecf10bb1fe07 --- /dev/null +++ b/src/main/java/behaviors/Wakeable.java @@ -0,0 +1,5 @@ +package behaviors; + +public interface Wakeable { + void wakeUp(); +} \ No newline at end of file diff --git a/src/main/java/environment/ChunkedSEIRSEnvironment.java b/src/main/java/environment/ChunkedSEIRSEnvironment.java index 1bc7f5109c9ddd629d9ced94e129fa0cb6670740..7bfbe659b79c6e7c67d9c4b1f4c4b90ee5dca5fc 100644 --- a/src/main/java/environment/ChunkedSEIRSEnvironment.java +++ b/src/main/java/environment/ChunkedSEIRSEnvironment.java @@ -1,9 +1,9 @@ package environment; -import agents.Agent2D; import agents.SEIRSAgent; import agents.states.InfectedSEIRSState; import agents.states.SEIRSState; +import behaviors.Positionable2D; import java.awt.*; import java.util.ArrayList; @@ -79,7 +79,7 @@ public class ChunkedSEIRSEnvironment implements SEIRSEnvironment { } @Override - public List<Point> perceiveAuthorizedPositions(Agent2D agent) { + public List<Point> perceiveAuthorizedPositions(Positionable2D agent) { List<Point> authorizedPosition = new ArrayList<>(); for (int move = 0; move < MAX_MOVEMENT; move++) { @@ -102,7 +102,7 @@ public class ChunkedSEIRSEnvironment implements SEIRSEnvironment { } @Override - public void notifyNewPosition(Point newPosition, Agent2D agent) { + public void notifyNewPosition(Point newPosition, Positionable2D agent) { if (chunks == null) { initiateChunks(); } diff --git a/src/main/java/environment/Environment2D.java b/src/main/java/environment/Environment2D.java index 531dac593f8d02961405f4cdcb9c868e898ac8d5..261a895812a044abc06a586e9a7d7805cda7c8ac 100644 --- a/src/main/java/environment/Environment2D.java +++ b/src/main/java/environment/Environment2D.java @@ -1,6 +1,6 @@ package environment; -import agents.Agent2D; +import behaviors.Positionable2D; import java.awt.*; import java.util.List; @@ -20,7 +20,7 @@ public interface Environment2D extends Environment { int DOWN_RIGHT = 8; int MAX_CHUNK = 9; - List<Point> perceiveAuthorizedPositions(Agent2D agent); - void notifyNewPosition(Point newPosition, Agent2D agent); + List<Point> perceiveAuthorizedPositions(Positionable2D agent); + void notifyNewPosition(Point newPosition, Positionable2D agent); int getSize(); } diff --git a/src/main/java/environment/WrappingChunkedSEIRSEnvironment.java b/src/main/java/environment/WrappingChunkedSEIRSEnvironment.java index 2ec979b1879510bb80ee28a937f8aa0ec2ca8e30..4cfaa5271aa06c9edbfb3d4374b9c9802839091b 100644 --- a/src/main/java/environment/WrappingChunkedSEIRSEnvironment.java +++ b/src/main/java/environment/WrappingChunkedSEIRSEnvironment.java @@ -1,7 +1,7 @@ package environment; -import agents.Agent2D; import agents.SEIRSAgent; +import behaviors.Positionable2D; import java.awt.*; import java.util.ArrayList; @@ -29,7 +29,7 @@ public class WrappingChunkedSEIRSEnvironment extends ChunkedSEIRSEnvironment imp } @Override - public List<Point> perceiveAuthorizedPositions(Agent2D agent) { + public List<Point> perceiveAuthorizedPositions(Positionable2D agent) { List<Point> authorisedPositions = new ArrayList<>(); for (int move = 0; move < MAX_MOVEMENT; move++) { Point position = getNextPosition(move,agent.getPosition()); diff --git a/src/main/java/models/Parameters.java b/src/main/java/models/Parameters.java index 7c27d7c0f8a54b94b13ba999f965b504524c5cb0..4f0bc859b90e8d5b94707e8fd0f4f7cec56b5c66 100644 --- a/src/main/java/models/Parameters.java +++ b/src/main/java/models/Parameters.java @@ -2,7 +2,7 @@ package models; @SuppressWarnings("unused") public record Parameters( - int seed, + long seed, int population, int size, int nbOfPatientZero, diff --git a/src/main/java/scheduler/FairAsynchronousScheduler.java b/src/main/java/scheduler/FairAsynchronousScheduler.java index 4c5cf0decf777edeb47e258b1767b9fcb9ae9a6b..de564d945497d27fe3702b08999b4dfa4c8d18b7 100644 --- a/src/main/java/scheduler/FairAsynchronousScheduler.java +++ b/src/main/java/scheduler/FairAsynchronousScheduler.java @@ -1,6 +1,6 @@ package scheduler; -import agents.Agent; +import behaviors.Wakeable; import java.util.Arrays; import java.util.List; @@ -12,19 +12,19 @@ import java.util.stream.Collectors; public class FairAsynchronousScheduler implements Scheduler { private final ExecutorService executor = Executors.newSingleThreadExecutor(); - private Queue<Agent> queue; + private Queue<Wakeable> queue; @Override - public void init(Agent[] agents) { + public void init(Wakeable[] agents) { this.queue = new ConcurrentLinkedQueue<>(Arrays.stream(agents).toList()); } @Override public void doNextCycle() { - List<Future<Agent>> results = queue.parallelStream().map(agent -> executor.submit(() -> {agent.wakeUp(); return agent;})).toList(); - Function<Future<Agent>, Agent> futureTreatment = futureAgent -> { + List<Future<Wakeable>> results = queue.parallelStream().map(entity -> executor.submit(() -> {entity.wakeUp(); return entity;})).toList(); + Function<Future<Wakeable>, Wakeable> futureTreatment = futureEntity -> { try { - return futureAgent.get(); + return futureEntity.get(); } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } diff --git a/src/main/java/scheduler/FairSynchronousScheduler.java b/src/main/java/scheduler/FairSynchronousScheduler.java index 50df63223cbd9d05efe917cd18010569c459dd12..b99e892d8b33f23f3c5f992b35e92e1f70613652 100644 --- a/src/main/java/scheduler/FairSynchronousScheduler.java +++ b/src/main/java/scheduler/FairSynchronousScheduler.java @@ -1,26 +1,17 @@ package scheduler; -import agents.Agent; +import behaviors.Randomized; +import behaviors.Wakeable; -import java.security.SecureRandom; import java.util.*; -@SuppressWarnings("ThrowablePrintedToSystemOut") -public class FairSynchronousScheduler implements Scheduler { +public class FairSynchronousScheduler extends Randomized implements Scheduler { - private Agent[] agents; + private Wakeable[] agents; private Stack<Integer> executionOrder; - private Random r; - public FairSynchronousScheduler(Integer seed) { - - try{ - r = SecureRandom.getInstance("SHA1PRNG", "SUN"); - }catch (Exception e) { - System.err.println(e); - System.exit(1); - } - r.setSeed(seed); + public FairSynchronousScheduler(long seed) { + super(seed); } private void generateExecutionOrder() { @@ -38,7 +29,7 @@ public class FairSynchronousScheduler implements Scheduler { } @Override - public void init(Agent[] agents) { + public void init(Wakeable[] agents) { this.agents = agents; executionOrder = new Stack<>(); } diff --git a/src/main/java/scheduler/Scheduler.java b/src/main/java/scheduler/Scheduler.java index bb2437f7d4ed4c41f50fbfb6b235c5e924f18525..670d786367e2f0cedac36c7a94d9feb9d2753754 100644 --- a/src/main/java/scheduler/Scheduler.java +++ b/src/main/java/scheduler/Scheduler.java @@ -1,10 +1,10 @@ package scheduler; -import agents.Agent; +import behaviors.Wakeable; public interface Scheduler { - void init(Agent[] agents); + void init(Wakeable[] agents); void doNextCycle(); } diff --git a/src/main/java/sma/SEIRS_SMA.java b/src/main/java/sma/SEIRS_SMA.java index ffd5778207418c3358b6483d1f11353e82b7e8eb..12f9669f0f7787db3f71d972d2515315c877e9c4 100644 --- a/src/main/java/sma/SEIRS_SMA.java +++ b/src/main/java/sma/SEIRS_SMA.java @@ -3,6 +3,7 @@ package sma; import agents.FairInfectionRWAgent; import agents.SEIRSAgent; import agents.states.InfectedSEIRSState; +import behaviors.Randomized; import environment.SEIRSEnvironment; import environment.WrappingChunkedSEIRSEnvironment; import models.Parameters; @@ -19,26 +20,38 @@ import view.StatisticsCanvas; import java.awt.*; import java.io.IOException; -import java.security.SecureRandom; import java.time.Duration; import java.time.Instant; import java.util.Date; import java.util.HashMap; -@SuppressWarnings({"InfiniteLoopStatement", "ThrowablePrintedToSystemOut"}) -public class SEIRS_SMA implements SMA{ +@SuppressWarnings("InfiniteLoopStatement") +public class SEIRS_SMA extends Randomized implements SMA{ - private Parameters parameters; - private SEIRSAgent[] agents; + private final Parameters parameters; + private final SEIRSAgent[] agents; private SEIRSEnvironment environment; private Scheduler scheduler; private StatisticsCanvas statisticsCanvas; private DisplaySquaredEnvironment display; - private SecureRandom r; private final FrameBuilder fb = new FrameBuilder(); private HashMap<String,Integer> stats; + public SEIRS_SMA(Parameters params) { + super(params.seed()); + parameters = YamlReader.getParams(); + r.setSeed(parameters.seed()); + agents = new RandomWalkingAgent[parameters.population()]; + initEnvironment(); + initPopulation(); + infectPatientZero(); + initScheduler(); + if (parameters.graphicalMode()) { + initGraphics(); + } + } + private void initGraphics() { statisticsCanvas = new StatisticsCanvas(300,parameters.size()); display = new DisplaySquaredEnvironment(environment,agents); @@ -119,28 +132,6 @@ public class SEIRS_SMA implements SMA{ } } - - @Override - public void init() { - parameters = YamlReader.getParams(); - try{ - r = SecureRandom.getInstance("SHA1PRNG", "SUN"); - }catch (Exception e) { - System.err.println(e); - System.exit(1); - } - r.setSeed(parameters.seed()); - agents = new RandomWalkingAgent[parameters.population()]; - initEnvironment(); - initPopulation(); - infectPatientZero(); - initScheduler(); - if (parameters.graphicalMode()) { - initGraphics(); - } - } - - @Override public void run() { Instant startTime = Instant.now(); @@ -164,8 +155,7 @@ public class SEIRS_SMA implements SMA{ } public static void main(String[] args) { - SMA sma = new SEIRS_SMA(); - sma.init(); + SMA sma = new SEIRS_SMA(YamlReader.getParams()); sma.run(); } } diff --git a/src/main/java/sma/SMA.java b/src/main/java/sma/SMA.java index 1d6ec46a27f130e81cffbe0b35f355d818aad4e0..977ae5dabd0fe04ce768d27d461231d6e22d058d 100644 --- a/src/main/java/sma/SMA.java +++ b/src/main/java/sma/SMA.java @@ -1,7 +1,5 @@ package sma; public interface SMA{ - - void init(); void run(); } diff --git a/src/main/java/view/DisplaySquaredEnvironment.java b/src/main/java/view/DisplaySquaredEnvironment.java index 5d948df47534f0142e9b12647256f095fbd04d64..9979a7582dccba83661daee319cf5d6514546318 100644 --- a/src/main/java/view/DisplaySquaredEnvironment.java +++ b/src/main/java/view/DisplaySquaredEnvironment.java @@ -10,7 +10,6 @@ import java.awt.*; public class DisplaySquaredEnvironment extends JPanel { - private final SEIRSAgent[] SEIRSAgents; public DisplaySquaredEnvironment(SEIRSEnvironment environment, SEIRSAgent[] SEIRSAgents) { diff --git a/src/main/java/view/StatisticsCanvas.java b/src/main/java/view/StatisticsCanvas.java index 0aff6b279c5e080d8a4003e4d79de2acb39a51f9..785c5b5a36feae802c9f69f83e0b7a2e5220ff73 100644 --- a/src/main/java/view/StatisticsCanvas.java +++ b/src/main/java/view/StatisticsCanvas.java @@ -15,7 +15,7 @@ public class StatisticsCanvas extends JPanel { public StatisticsCanvas(int width,int height) { this.setDoubleBuffered(false); values = new HashMap<>(); - total = YamlReader.getParams().getPopulation(); + total = YamlReader.getParams().population(); setSize(width, height); setVisible(true); } diff --git a/src/main/resources/output.png b/src/main/resources/output.png index 3ed5fabfa0eedf57027acae44ace198dfc976a4d..69b8e62af45708270f5e740429befd1f656ec7e1 100644 Binary files a/src/main/resources/output.png and b/src/main/resources/output.png differ diff --git a/src/main/resources/parameters.yaml b/src/main/resources/parameters.yaml index a7e09b7db38122e90ac2ae1889043a78d7187e6a..78cea5de543adc070cb5755a13862ff21f8807fb 100644 --- a/src/main/resources/parameters.yaml +++ b/src/main/resources/parameters.yaml @@ -2,7 +2,7 @@ graphicalMode: true incubationRate: 0.3 infectionRate: 0.8 looseImmunityRate: 0.008 -recoveryRate: 0.1429 +recoveryRate: 0.14 nbOfCycles: 2000 nbOfPatientZero: 1 population: 3000 @@ -11,4 +11,4 @@ size: 1000 wrappingWorld : true synchronousMode: false timeBetweenCycles: 0 -infectionStacks : true \ No newline at end of file +infectionStacks : false \ No newline at end of file