Skip to content

Package: SortAnzahlGeringsterUmruestungenFuerBeilagen

SortAnzahlGeringsterUmruestungenFuerBeilagen

nameinstructionbranchcomplexitylinemethod
SortAnzahlGeringsterUmruestungenFuerBeilagen(List)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
create(List)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$specialSort$0(ProduktionsAuftrag)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$specialSort$1(Wrapper, ProduktionsAuftrag)
M: 0 C: 40
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
lambda$specialSort$2(Pair)
M: 0 C: 9
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$specialSort$3(ProduktionsAuftrag)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$specialSort$4(ArrayList, List, ProduktionsAuftrag)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
lambda$specialSort$5(ArrayList, List, Wrapper, Pair)
M: 0 C: 15
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
specialSort(List)
M: 1 C: 79
99%
M: 1 C: 3
75%
M: 1 C: 2
67%
M: 1 C: 15
94%
M: 0 C: 1
100%

Coverage

1: package rollenbelegung.SortierParameter.ProduktionsAuftragsSortierParameter;
2:
3: import auftraege.ProduktionsAuftrag;
4: import maschine.Maschine;
5: import maschine.faehigkeit.Kuvertieren;
6: import rollenbelegung.SortierParameter.SortierReihenfolge;
7: import util.Pair;
8: import util.Wrapper;
9:
10: import java.util.ArrayList;
11: import java.util.Comparator;
12: import java.util.List;
13: import java.util.Map;
14: import java.util.Optional;
15: import java.util.stream.Collectors;
16:
17: /**
18: * Schafft die optimale Reihenfolge für die Produktionsaufträge, sodass diese sich in der Reihenfolge mit der minimal benötigten Anzahl an Umrüstungen befinden.
19: * Dafür ist es nötig die Kuvertierer zu kennen, um Rückschlüsse auf die Anzahl der Beilagenfächer zu bekommen.
20: */
21: public final class SortAnzahlGeringsterUmruestungenFuerBeilagen extends ProduktionsAuftragSortierParameter {
22:
23:         private final List<Maschine> zuBeruecksichtigendeMaschinen;
24:
25:         private SortAnzahlGeringsterUmruestungenFuerBeilagen(final List<Maschine> zuBeruecksichtigendeMaschinen) {
26:                 super(SortierReihenfolge.AUFSTEIGEND);
27:                 this.zuBeruecksichtigendeMaschinen = zuBeruecksichtigendeMaschinen;
28:         }
29:
30:         /**
31:          * Erstellt einen neuen Sortierparameter mit Informationen über die verfügbaren Maschinen, da die Anzahl der Beilagenfächer auf den Maschinen für das
32:          * Sortierergebnis relevant ist.
33:          *
34:          * @param zuBeruecksichtigendeMaschinen
35:          *                 Alle Maschinen, welche bei der Sortierung der Produktionsaufträge Berücksichtigt werden sollen. Hier fallen lediglich Kuvertierer ins Gewicht.
36:          *
37:          * @return {@link SortAnzahlGeringsterUmruestungenFuerBeilagen}
38:          */
39:         public static SortAnzahlGeringsterUmruestungenFuerBeilagen create(final List<Maschine> zuBeruecksichtigendeMaschinen) {
40:                 return new SortAnzahlGeringsterUmruestungenFuerBeilagen(zuBeruecksichtigendeMaschinen);
41:         }
42:
43:         @Override
44:         public void specialSort(final List<ProduktionsAuftrag> produktionsAuftraege) {
45:
46:                 final ArrayList<ProduktionsAuftrag> ret = new ArrayList<>();
47:                 // Produktionsauftrag mit den init meisten verschiedenen BeilagenArten herausfinden
48:                 final Optional<ProduktionsAuftrag> initOpt =
49:                                 produktionsAuftraege.stream().max(Comparator.comparing(e -> e.getBeilagenArten().getBeilagenarten().size()));
50:                 final Wrapper<ProduktionsAuftrag> referenceObject;
51:•                if (initOpt.isPresent()) {
52:                         referenceObject = new Wrapper<>(initOpt.get());
53:                         ret.add(referenceObject.get());
54:                         produktionsAuftraege.remove(referenceObject.get());
55:                 } else {
56:                         return;
57:                 }
58:
59:                 do {
60:                         // Herausfinden der Anzahl an Umrüstungen, die getan werden müssen, um die BeilagenArten des ReferenzObjektes auf einen neuen
61:                         // Produktionsauftrag umzubauen. wird Partitioniert, ob generell umrüstarbeiten getan werden müssenn oder nicht.
62:                         final Map<Boolean, List<Pair<ProduktionsAuftrag, Integer>>> collect = produktionsAuftraege.stream().map(e -> {
63:                                 //hier werden die Produktionsaufträge anhand des Kuvertierers mit den meisten BeilagenFächern sortiert.
64:                                 final int anzahlUmruestungen =
65:                                                 referenceObject.get().getBeilagenArten().calculateUmruestvorgaengeZuNeuerBeilagenArt(e.getBeilagenArten(), this
66:                                                                 .zuBeruecksichtigendeMaschinen.stream().map(Maschine::getFaehigkeit).filter(Kuvertieren.class::isInstance).map(Kuvertieren.class::cast)
67:                                                                 .max(Comparator.comparing(Kuvertieren::getAnzahlMoeglicherBeilagen)).map(Kuvertieren::getAnzahlMoeglicherBeilagen).orElse(0));
68:                                 // gibt es keinen Kuvertierer in der Liste, so wird jeder Produktionsauftrag schlichweg mit 0 Umrüstungen markiert und am Ende wieder ohne Ängerung
69:                                 // der Sortierung der Rückgabeliste hinzugefügt.
70:                                 return Pair.create(e, anzahlUmruestungen);
71:•                        }).collect(Collectors.partitioningBy(o -> o.getSecond() == 0));
72:
73:                         // verwaltung alter und neuer listen
74:                         collect.get(true).stream().map(Pair::getFirst)
75:                                         .sorted(Comparator.comparing((final ProduktionsAuftrag e) -> e.getBeilagenArten().getAnzahl()).reversed()).forEach(e -> {
76:                                 ret.add(e);
77:                                 produktionsAuftraege.remove(e);
78:                         });
79:
80:                         // Objekt mit den nächstbesten minimalen Umrüstungen herausfinden, Listen diesbezüglich verwalten und als neues Referenzobjekt setzen.
81:                         collect.get(false).stream().min(Comparator.comparing(Pair::getSecond)).ifPresent(e -> {
82:                                 ret.add(e.getFirst());
83:                                 produktionsAuftraege.remove(e.getFirst());
84:                                 referenceObject.set(e.getFirst());
85:                         });
86:•                } while (!produktionsAuftraege.isEmpty());
87:
88:                 // neue ordnung hinzufügen der alten liste.
89:                 produktionsAuftraege.addAll(ret);
90:         }
91:
92: }