summaryrefslogtreecommitdiff
path: root/src/ch/epfl/maze/main/Console.java
blob: 0c273e10bc6d3a0eb0c1ea46bbe0ce29967f897c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package ch.epfl.maze.main;

import ch.epfl.maze.physical.Daedalus;
import ch.epfl.maze.physical.Maze;
import ch.epfl.maze.physical.pacman.*;
import ch.epfl.maze.physical.zoo.Hamster;
import ch.epfl.maze.physical.zoo.Monkey;
import ch.epfl.maze.physical.zoo.Mouse;
import ch.epfl.maze.physical.zoo.Panda;
import ch.epfl.maze.simulation.DaedalusSimulation;
import ch.epfl.maze.simulation.MazeSimulation;
import ch.epfl.maze.simulation.Simulation;
import ch.epfl.maze.util.LabyrinthGenerator;
import ch.epfl.maze.util.Statistics;
import ch.epfl.maze.util.Vector2D;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * Mini-project main program that will run the simulations multiple times and
 * show statistics on the console.
 *
 * @author EPFL
 */
public class Console {

    /**
     * Number of simulations launched.
     */
    public static final int NUMBER_OF_SIMULATIONS = 1000;

    public static void main(String[] args) {
        Simulation simulation;

        simulation = getMazeSimulation();
        //simulation = getDaedalusSimulation();

        System.out.print("Launching " + NUMBER_OF_SIMULATIONS + " simulations...");
        Map<String, List<Integer>> results =
                Statistics.computeStatistics(simulation, NUMBER_OF_SIMULATIONS);
        System.out.println(" done !");

        printStats(results);
    }

    /**
     * Creates a {@code MazeSimulation} suitable for statistics.
     * <p>
     * Note that there should be only <b>ONE</b> animal of each kind in the
     * corresponding {@code Maze}.
     *
     * @return A {@code MazeSimulation} suitable for statistics
     */
    public static Simulation getMazeSimulation() {
        int[][] labyrinth = LabyrinthGenerator.getMedium();
        Maze m = new Maze(labyrinth);
        Simulation simulation = new MazeSimulation(m);

        // adds a Mouse
        m.addAnimal(new Mouse(m.getStart()));

        // adds a Monkey
        m.addAnimal(new Monkey(m.getStart()));

        // adds a Hamster
        m.addAnimal(new Hamster(m.getStart()));

        // adds a Bear (if this bonus is coded)
        // m.addAnimal(new Bear(m.getStart()));

        // adds a Panda
        m.addAnimal(new Panda(m.getStart()));

        return simulation;
    }

    /**
     * Creates a {@code DaedalusSimulation} suitable for statistics.
     * <p>
     * Note that there should be only <b>ONE</b> animal of each kind in the
     * corresponding {@code Daedalus}.
     *
     * @return A {@code DaedalusSimulation} suitable for statistics
     */
    public static Simulation getDaedalusSimulation() {
        int[][] labyrinth = LabyrinthGenerator.getPacMan();
        Daedalus d = new Daedalus(labyrinth);
        Simulation simulation = new DaedalusSimulation(d);

        // adds Pac-Man
        d.addPrey(new PacMan(new Vector2D(9, 15)));

        // adds Blinky
        d.addPredator(new Blinky(new Vector2D(17, 1)));

        // adds Pinky
        d.addPredator(new Pinky(new Vector2D(1, 1)));

        // adds Inky
        d.addPredator(new Inky(new Vector2D(17, 17)));

        // adds Clyde
        d.addPredator(new Clyde(new Vector2D(1, 17)));

        return simulation;
    }

    /**
     * Pretty-prints the statistics computed in the parameters.
     *
     * @param results Statistics of arrival times for every animals/preys
     */
    public static void printStats(Map<String, List<Integer>> results) {
        // computes statistics
        for (Map.Entry<String, List<Integer>> entry : results.entrySet()) {
            String name = entry.getKey();
            List<Integer> list = entry.getValue();
            if (list.isEmpty()) {
                continue;
            }
            Collections.sort(list);

            String max, min, std, mean, median, total;
            // handles infinite values
            if (Statistics.total(list) == Integer.MAX_VALUE) {
                total = "Infinite";
                mean = "Infinite";
                std = "Infinite";
                max = "Infinite";
            } else {
                total = Integer.toString(Statistics.total(list));
                mean = Integer.toString(Statistics.mean(list));
                std = Double.toString(Statistics.std(list));
                max = Integer.toString(list.get(list.size() - 1));
            }
            // min and median are special
            min = (list.get(0) == Integer.MAX_VALUE) ?
                    "Infinite" : Integer.toString(list.get(0));
            median = (list.get(list.size() / 2) == Integer.MAX_VALUE) ?
                    "Infinite" : Integer.toString(list.get(list.size() / 2));

            System.out.println("\n\n========== " + name + " ==========\n");
            System.out.println(" * total number of steps : " + total);
            System.out.println(" * average steps : " + mean);
            System.out.println(" * median steps : " + median);
            System.out.println(" * standard deviation : " + std);
            System.out.println(" * minimum steps : " + min);
            System.out.println(" * maximum steps : " + max);
            System.out.println("\nDistribution :");
            Statistics.printDistribution(list);
        }
    }

}