Browse Source

MaJ sujet + quelques implementation supplémentaires

Arthur Bit-Monnot 1 year ago
parent
commit
60b74477ca

+ 14
- 3
README.md View File

@@ -81,7 +81,18 @@ This notably ensures that sources have been recompiled whenever necessary.
81 81
 
82 82
 ## IDE Support
83 83
 
84
-Most IDEs should provide support for importing gradle projects.
84
+Most IDEs should provide support for importing gradle projects. However, our experience has been best with IntelliJ so far and we would recommend it.
85 85
 
86
-- **Eclipse**: https://www.vogella.com/tutorials/EclipseGradle/article.html
87
-- **IntelliJ**: https://www.jetbrains.com/help/idea/gradle.html#gradle_import_project_start
86
+#### IntelliJ
87
+
88
+IntelliJ has worked best, with out of the box support for the import of gradle projets:
89
+https://www.jetbrains.com/help/idea/gradle.html#gradle_import_project_start
90
+
91
+
92
+#### Eclipse
93
+
94
+Most technical problems have been related to the use of Eclipse so we don't recommend using it unless you have a good reason to.
95
+We have however configured gradle to allow generating an eclipse configuration like so : 
96
+```
97
+./gradlew eclipseClean eclipse
98
+```

+ 1
- 0
build.gradle View File

@@ -1,6 +1,7 @@
1 1
 plugins {
2 2
     id 'java'
3 3
     id 'application'
4
+    id 'eclipse'
4 5
 }
5 6
 
6 7
 group 'jobshop'

+ 42
- 0
src/main/java/jobshop/DebuggingMain.java View File

@@ -0,0 +1,42 @@
1
+package jobshop;
2
+
3
+import jobshop.encodings.JobNumbers;
4
+
5
+import java.io.IOException;
6
+import java.nio.file.Paths;
7
+
8
+public class DebuggingMain {
9
+
10
+    public static void main(String[] args) {
11
+        try {
12
+            // load the aaa1 instance
13
+            Instance instance = Instance.fromFile(Paths.get("instances/aaa1"));
14
+
15
+            // construit une solution dans la représentation par
16
+            // numéro de jobs : [0 1 1 0 0 1]
17
+            // Note : cette solution a aussi été vue dans les exercices (section 3.3)
18
+            //        mais on commençait à compter à 1 ce qui donnait [1 2 2 1 1 2]
19
+            JobNumbers enc = new JobNumbers(instance);
20
+            enc.jobs[enc.nextToSet++] = 0;
21
+            enc.jobs[enc.nextToSet++] = 1;
22
+            enc.jobs[enc.nextToSet++] = 1;
23
+            enc.jobs[enc.nextToSet++] = 0;
24
+            enc.jobs[enc.nextToSet++] = 0;
25
+            enc.jobs[enc.nextToSet++] = 1;
26
+
27
+            System.out.println("\nENCODING: " + enc);
28
+
29
+            Schedule sched = enc.toSchedule();
30
+            // TODO: make it print something meaningful
31
+            // by implementing the toString() method
32
+            System.out.println("SCHEDULE: " + sched);
33
+            System.out.println("VALID: " + sched.isValid());
34
+            System.out.println("MAKESPAN: " + sched.makespan());
35
+
36
+        } catch (IOException e) {
37
+            e.printStackTrace();
38
+            System.exit(1);
39
+        }
40
+
41
+    }
42
+}

+ 1
- 0
src/main/java/jobshop/Instance.java View File

@@ -28,6 +28,7 @@ public class Instance {
28 28
         return machines[job][task];
29 29
     }
30 30
 
31
+    /** among the tasks of the given job, returns the task index that uses the given machine. */
31 32
     public int task_with_machine(int job, int wanted_machine) {
32 33
         for(int task = 0 ; task < numTasks ; task++) {
33 34
             if(machine(job, task) == wanted_machine)

+ 5
- 0
src/main/java/jobshop/encodings/JobNumbers.java View File

@@ -49,4 +49,9 @@ public class JobNumbers extends Encoding {
49 49
 
50 50
         return new Schedule(instance, startTimes);
51 51
     }
52
+
53
+    @Override
54
+    public String toString() {
55
+        return Arrays.toString(Arrays.copyOfRange(jobs,0, nextToSet));
56
+    }
52 57
 }

+ 41
- 0
src/main/java/jobshop/encodings/Task.java View File

@@ -0,0 +1,41 @@
1
+package jobshop.encodings;
2
+
3
+import java.util.Objects;
4
+
5
+/** Represents a task (job,task) of an jobshop problem.
6
+ *
7
+ * Example : (2, 3) repesents the fourth task of the third job. (remeber that we tart counting at 0)
8
+ * */
9
+public final class Task {
10
+
11
+    /** Identifier of the job */
12
+    public final int job;
13
+
14
+    /** Index of the task inside the job. */
15
+    public final int task;
16
+
17
+
18
+    public Task(int job, int task) {
19
+        this.job = job;
20
+        this.task = task;
21
+    }
22
+
23
+    @Override
24
+    public boolean equals(Object o) {
25
+        if (this == o) return true;
26
+        if (o == null || getClass() != o.getClass()) return false;
27
+        Task task1 = (Task) o;
28
+        return job == task1.job &&
29
+                task == task1.task;
30
+    }
31
+
32
+    @Override
33
+    public int hashCode() {
34
+        return Objects.hash(job, task);
35
+    }
36
+
37
+    @Override
38
+    public String toString() {
39
+        return "(" + job +", " + task + '}';
40
+    }
41
+}

+ 17
- 8
sujet/sujet.md View File

@@ -89,23 +89,32 @@ Deux solveurs très simples basés sur une représentation par numéro de job. L
89 89
 
90 90
 ## À faire : manipulation de représentations
91 91
 
92
-Ouvrez la méthode `EncodingTests.testJobNumbers()`. 
92
+Ouvrez la méthode `DebuggingMain.main()`. 
93 93
 
94
- - Pour les deux solutions en représentation par numéro de job, calculez (à la main) les dates de début de chaque tâche
95
- - implémentez la méthode `toString()` de la classe `Schedule` pour afficher les dates dé début de chaque tâche dans un schedule.
94
+ - Pour la solutions en représentation par numéro de job donnée, calculez (à la main) les dates de début de chaque tâche
95
+ - implémentez la méthode `toString()` de la classe `Schedule` pour afficher les dates de début de chaque tâche dans un schedule.
96 96
  - Vérifiez que ceci correspond bien aux calculs que vous aviez fait à la main.
97 97
  
98 98
 Création d'une nouvelle representation par ordre de passage sur les ressources : 
99 99
 
100
-- Créer une classe `jobshop.encodings.ResourceOrder` qui contient la représentation par ordre de passage sur ressources vue dans les exercices.
101
-- Pour cette classe, implémentez la méthode `toSchedule()` qui permet d'extraire une représentation directe.  
102
-- Ajouter des tests dans `src/test/java/jobshop` permettant de vérifier que vos méthodes fonctionnent bien pour les exemples traités en cours (instance `aaa1`).
103
-Vous pouvez pour cela vous inspirer et ajouter des cas de test à `EncodingTests`. 
100
+- Créer une classe `jobshop.encodings.ResourceOrder` qui contient la représentation par ordre de passage sur ressources vue dans les exercices (section 3.2). Il s'agit ici d'une reprsentation sous forme de matrice où chaque ligne correspond à une machine, et sur cette ligne se trouvent les tâches qui s'exécutent dessus dans leur ordre de passage. Pour la representation d'une tâche dans la matrice, vous pouvez utiliser la classe `jobshop.encodings.Task` qui vous est fournie.
101
+
102
+- Pour cette classe, implémentez la méthode `toSchedule()` qui permet d'extraire une représentation directe. 
103
+Pour l'implémentation de cette méthode `toSchedule()`, il vous faut construire un schedule qui associe à chaque tâche une date de début (vous pouvez regardez l'implémentation pour `JobNums` pour en comprendre le principe).
104
+Pour construire ce schedule il faudra que vous mainteniez une liste des tâches qui ont été schédulé. Cette liste est initialement vide.
105
+À chaque itération de l'algorithme, on identifie les tâches executables. Une tâche est executable si 
106
+
107
+     - son prédecesseur sur le job a été schedulé (si c'est la tache (1, 3), il faut que les tâches (1,1) et (1,2) aient été schédulée)
108
+     - son prédecesseur sur la ressource a été schedulé (l'ordre sur passage sur les ressources est précisement ce qui vous est donné par cette représentation).
109
+ 
110
+- Ajouter des tests dans `src/test/java/jobshop` permettant de vérifier que vos méthodes fonctionnent bien pour les exemples traités en cours (instance `aaa1`). Vous pouvez pour cela vous inspirer et ajouter des cas de test à `EncodingTests`. 
111
+
112
+
104 113
 
105 114
 Changement de représentation : 
106 115
 
107 116
 - pour les deux représentations `ResourceOrder` et `JobNums`, créez des méthodes permettant de créer cette représentation depuis un `Schedule`.
108
-- utilisez là pour tester la conversion de `ResourceOrder` vers `JobNums` et vice-versa.
117
+- utilisez la pour tester la conversion de `ResourceOrder` vers `JobNums` et vice-versa.
109 118
 
110 119
 
111 120
 # Heuristiques gloutonne

BIN
sujet/sujet.pdf View File


Loading…
Cancel
Save