SPT and LRPT finished and tested
This commit is contained in:
parent
26a5ad00fe
commit
ef450f2b98
2 changed files with 67 additions and 11 deletions
|
@ -34,7 +34,12 @@ public class GreedySolver implements Solver {
|
||||||
return instance.duration(t);
|
return instance.duration(t);
|
||||||
}
|
}
|
||||||
private Integer heuristiqueLRPT(Task t, Instance instance){
|
private Integer heuristiqueLRPT(Task t, Instance instance){
|
||||||
return instance.duration(t);
|
int sum = 0;
|
||||||
|
// we sum all durations starting at the current tasks' in the job
|
||||||
|
for (int i = t.task; i < instance.numTasks; i++){
|
||||||
|
sum += instance.duration(t.job, i);
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
}
|
}
|
||||||
private Integer heuristiqueEST_SPT(Task t, Instance instance){
|
private Integer heuristiqueEST_SPT(Task t, Instance instance){
|
||||||
return instance.duration(t);
|
return instance.duration(t);
|
||||||
|
@ -58,29 +63,71 @@ public class GreedySolver implements Solver {
|
||||||
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
||||||
.toArray(Task[]::new)[0]
|
.toArray(Task[]::new)[0]
|
||||||
);
|
);
|
||||||
break;
|
|
||||||
case LPT:
|
case LPT:
|
||||||
break;
|
// TODO
|
||||||
|
return(
|
||||||
|
lTask.stream()
|
||||||
|
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
||||||
|
.toArray(Task[]::new)[0]
|
||||||
|
);
|
||||||
case SRPT:
|
case SRPT:
|
||||||
break;
|
// TODO
|
||||||
|
return(
|
||||||
|
lTask.stream()
|
||||||
|
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
||||||
|
.toArray(Task[]::new)[0]
|
||||||
|
);
|
||||||
case LRPT:
|
case LRPT:
|
||||||
break;
|
return(
|
||||||
|
lTask.stream()
|
||||||
|
.max(Comparator.comparing(e -> heuristiqueLRPT(e, instance)))
|
||||||
|
.get() // it returns an optional
|
||||||
|
);
|
||||||
case EST_SPT:
|
case EST_SPT:
|
||||||
break;
|
// TODO
|
||||||
|
return(
|
||||||
|
lTask.stream()
|
||||||
|
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
||||||
|
.toArray(Task[]::new)[0]
|
||||||
|
);
|
||||||
case EST_LPT:
|
case EST_LPT:
|
||||||
break;
|
// TODO
|
||||||
|
return(
|
||||||
|
lTask.stream()
|
||||||
|
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
||||||
|
.toArray(Task[]::new)[0]
|
||||||
|
);
|
||||||
case EST_SRPT:
|
case EST_SRPT:
|
||||||
break;
|
// TODO
|
||||||
|
return(
|
||||||
|
lTask.stream()
|
||||||
|
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
||||||
|
.toArray(Task[]::new)[0]
|
||||||
|
);
|
||||||
case EST_LRPT:
|
case EST_LRPT:
|
||||||
break;
|
// TODO
|
||||||
|
return(
|
||||||
|
lTask.stream()
|
||||||
|
.sorted(Comparator.comparing(e -> heuristiqueSPT(e, instance)))
|
||||||
|
.toArray(Task[]::new)[0]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<Schedule> solve(Instance instance, long deadline) {
|
public Optional<Schedule> solve(Instance instance, long deadline) {
|
||||||
|
// keeps track of the next time the machine is free
|
||||||
|
int[] statusMachines = new int[instance.numMachines];
|
||||||
|
// keeps track of the next time the job is free
|
||||||
|
int[] statusJobs = new int[instance.numJobs];
|
||||||
|
Arrays.fill(statusMachines,0);
|
||||||
|
Arrays.fill(statusJobs,0);
|
||||||
|
|
||||||
|
int time ;
|
||||||
|
Schedule schedule = new Schedule(instance);
|
||||||
ArrayList<Task> possibleTasks = new ArrayList<>();
|
ArrayList<Task> possibleTasks = new ArrayList<>();
|
||||||
/* Initialization */
|
/* Initialization */
|
||||||
for (int i = 0; i < instance.numJobs; i++){
|
for (int i = 0; i < instance.numJobs; i++){
|
||||||
|
@ -91,12 +138,20 @@ public class GreedySolver implements Solver {
|
||||||
while(possibleTasks.size() > 0){
|
while(possibleTasks.size() > 0){
|
||||||
Task task = min(possibleTasks,instance);
|
Task task = min(possibleTasks,instance);
|
||||||
possibleTasks.remove(task);
|
possibleTasks.remove(task);
|
||||||
// TODO : Add task to the solution
|
|
||||||
|
// Update schedule
|
||||||
|
time = Integer.max(statusMachines[instance.machine(task)], statusJobs[task.job]);
|
||||||
|
schedule.setStartTime(task.job, task.task, time);
|
||||||
|
|
||||||
|
// recalculate next free time for job/machine
|
||||||
|
statusMachines[instance.machine(task)] = time + instance.duration(task);
|
||||||
|
statusJobs[task.job] = time + instance.duration(task);
|
||||||
if ((task.task + 1) < instance.numTasks){
|
if ((task.task + 1) < instance.numTasks){
|
||||||
possibleTasks.add(new Task(task.job, task.task+1));
|
possibleTasks.add(new Task(task.job, task.task+1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return Optional.of(schedule);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ public interface Solver {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case "basic": return new BasicSolver();
|
case "basic": return new BasicSolver();
|
||||||
case "spt": return new GreedySolver(GreedySolver.Priority.SPT);
|
case "spt": return new GreedySolver(GreedySolver.Priority.SPT);
|
||||||
|
case "lrpt": return new GreedySolver(GreedySolver.Priority.LRPT);
|
||||||
// TODO: add new solvers
|
// TODO: add new solvers
|
||||||
default: throw new RuntimeException("Unknown solver: "+ name);
|
default: throw new RuntimeException("Unknown solver: "+ name);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue