KursblockungAlgorithmusKSatSolver.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKSatSolver = exports.KursblockungAlgorithmusKSatSolver = void 0;
  4. const SatSolver3_1 = require("../../core/kursblockung/satsolver/SatSolver3");
  5. const HashMap_1 = require("../../java/util/HashMap");
  6. const SatSolverWrapper_1 = require("../../core/kursblockung/satsolver/SatSolverWrapper");
  7. const LinkedCollection_1 = require("../../core/adt/collection/LinkedCollection");
  8. const System_1 = require("../../java/lang/System");
  9. const SatSolverA_1 = require("../../core/kursblockung/satsolver/SatSolverA");
  10. const NullPointerException_1 = require("../../java/lang/NullPointerException");
  11. const KursblockungAlgorithmusK_1 = require("../../core/kursblockung/KursblockungAlgorithmusK");
  12. class KursblockungAlgorithmusKSatSolver extends KursblockungAlgorithmusK_1.KursblockungAlgorithmusK {
  13. kurseAlle;
  14. schuelerAlle;
  15. maxNichtWaehler = 0;
  16. /**
  17. * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
  18. * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
  19. *
  20. * @param logger Logger für Benutzerhinweise, Warnungen und Fehler.
  21. * @param dynDat Die dynamischen Blockungsdaten.
  22. */
  23. constructor(logger, dynDat) {
  24. super(logger, dynDat);
  25. this.kurseAlle = dynDat.gibKurseAlle();
  26. this.schuelerAlle = this.dynDaten.gibSchuelerArray(false);
  27. this.maxNichtWaehler = 10;
  28. }
  29. berechne(pMaxTimeMillis) {
  30. if (this.dynDaten.gibKurseDieFreiSindAnzahl() === 0) {
  31. return;
  32. }
  33. let timeStart = System_1.System.currentTimeMillis();
  34. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  35. this.dynDaten.aktionKurseFreieZufaelligVerteilen();
  36. this.dynDaten.aktionZustandSpeichernK();
  37. let difNichtWaehler = 1;
  38. while (System_1.System.currentTimeMillis() - timeStart < pMaxTimeMillis) {
  39. let result = this.berechneSchritt(pMaxTimeMillis);
  40. if (result === SatSolverA_1.SatSolverA.RESULT_UNKNOWN) {
  41. return;
  42. }
  43. if (result === SatSolverA_1.SatSolverA.RESULT_SATISFIABLE) {
  44. this.maxNichtWaehler = Math.max(this.maxNichtWaehler - difNichtWaehler, 0);
  45. continue;
  46. }
  47. this.maxNichtWaehler++;
  48. difNichtWaehler = 0;
  49. }
  50. }
  51. /**
  52. * Erzeugt eine Formel in konjuntiver Normalform (CNF) und übergibt sie dem
  53. * SAT-Solver. Der Solver versucht die Formel innerhalb des Zeitlimits zu lösen.
  54. * Falls er es nicht schafft, dann wurde zuvor eine zufällige Kursverteilung
  55. * definiert. #
  56. *
  57. * @param pMaxTimeMillis Die maximale Blockungszeit in Millisekunde.
  58. *
  59. * @return Liefert eines der drei möglichen Ergebnisse
  60. * {@link SatSolverA#RESULT_SATISFIABLE oder SatSolverI#RESULT_UNKNOWN
  61. * oder SatSolverI#RESULT_UNSATISFIABLE. }
  62. */
  63. berechneSchritt(pMaxTimeMillis) {
  64. let ssw = new SatSolverWrapper_1.SatSolverWrapper(new SatSolver3_1.SatSolver3());
  65. let nSchienen = this.dynDaten.gibSchienenAnzahl();
  66. let mapKursSchiene = new HashMap_1.HashMap();
  67. for (let kurs of this.kurseAlle) {
  68. let schienen = Array(nSchienen).fill(0);
  69. for (let s = 0; s < nSchienen; s++) {
  70. schienen[s] = kurs.gibIstSchieneFixiert(s) ? ssw.getVarTRUE() : kurs.gibIstSchieneGesperrt(s) ? ssw.getVarFALSE() : ssw.createNewVar();
  71. }
  72. mapKursSchiene.put(kurs, schienen);
  73. }
  74. let mapSchuelerFachartNichtwahl = new HashMap_1.HashMap();
  75. let mapSchuelerIstInKurs = new HashMap_1.HashMap();
  76. let listNichtwahlen = new LinkedCollection_1.LinkedCollection();
  77. for (let schueler of this.schuelerAlle) {
  78. mapSchuelerFachartNichtwahl.put(schueler, new HashMap_1.HashMap());
  79. mapSchuelerIstInKurs.put(schueler, new HashMap_1.HashMap());
  80. for (let fachart of schueler.gibFacharten()) {
  81. let varNichtwahlen = ssw.createNewVar();
  82. let mapFachartNichtwahl = mapSchuelerFachartNichtwahl.get(schueler);
  83. if (mapFachartNichtwahl === null)
  84. throw new NullPointerException_1.NullPointerException();
  85. mapFachartNichtwahl.put(fachart, varNichtwahlen);
  86. listNichtwahlen.add(varNichtwahlen);
  87. for (let kurs of fachart.gibKurse()) {
  88. let varKurs = ssw.createNewVar();
  89. let mapIstInKurs = mapSchuelerIstInKurs.get(schueler);
  90. if (mapIstInKurs === null)
  91. throw new NullPointerException_1.NullPointerException();
  92. mapIstInKurs.put(kurs, varKurs);
  93. }
  94. }
  95. }
  96. for (let kurs of this.kurseAlle) {
  97. let list = new LinkedCollection_1.LinkedCollection();
  98. let schienen = mapKursSchiene.get(kurs);
  99. if (schienen === null)
  100. throw new NullPointerException_1.NullPointerException();
  101. for (let s = 0; s < nSchienen; s++) {
  102. list.add(schienen[s]);
  103. }
  104. let amount = kurs.gibSchienenAnzahl();
  105. ssw.c_exactly_GENERIC(list, amount);
  106. }
  107. for (let schueler of this.schuelerAlle) {
  108. for (let fachart of schueler.gibFacharten()) {
  109. let list = new LinkedCollection_1.LinkedCollection();
  110. for (let kurs of fachart.gibKurse()) {
  111. let mapIstInKurs = mapSchuelerIstInKurs.get(schueler);
  112. if (mapIstInKurs === null)
  113. throw new NullPointerException_1.NullPointerException();
  114. let varKurs = mapIstInKurs.get(kurs);
  115. if (varKurs === null)
  116. throw new NullPointerException_1.NullPointerException();
  117. list.add(varKurs);
  118. }
  119. ssw.c_exactly_GENERIC(list, 1);
  120. }
  121. }
  122. for (let schueler of this.schuelerAlle) {
  123. let mapIstInKurs = mapSchuelerIstInKurs.get(schueler);
  124. if (mapIstInKurs === null)
  125. throw new NullPointerException_1.NullPointerException();
  126. for (let fachart1 of schueler.gibFacharten()) {
  127. for (let fachart2 of schueler.gibFacharten()) {
  128. if (fachart1.gibNr() < fachart2.gibNr()) {
  129. for (let kurs1 of fachart1.gibKurse()) {
  130. for (let kurs2 of fachart2.gibKurse()) {
  131. let var1 = mapIstInKurs.get(kurs1);
  132. let var2 = mapIstInKurs.get(kurs2);
  133. if ((var1 === null) || (var2 === null))
  134. throw new NullPointerException_1.NullPointerException();
  135. let x = ssw.c_new_var_AND(var1.valueOf(), var2.valueOf());
  136. for (let s = 0; s < nSchienen; s++) {
  137. let schienenKurs1 = mapKursSchiene.get(kurs1);
  138. let schienenKurs2 = mapKursSchiene.get(kurs2);
  139. if ((schienenKurs1 === null) || (schienenKurs2 === null))
  140. throw new NullPointerException_1.NullPointerException();
  141. let var3 = schienenKurs1[s];
  142. let var4 = schienenKurs2[s];
  143. ssw.c_3(-x, -var3, -var4);
  144. }
  145. }
  146. }
  147. }
  148. }
  149. }
  150. }
  151. console.log(JSON.stringify("V=" + ssw.getVarCount() + ", C=" + ssw.getClauseCount()));
  152. let satresult = ssw.solve(pMaxTimeMillis);
  153. if (satresult !== SatSolverA_1.SatSolverA.RESULT_SATISFIABLE) {
  154. return satresult;
  155. }
  156. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  157. for (let kurs of this.kurseAlle) {
  158. let schienen = new LinkedCollection_1.LinkedCollection();
  159. for (let s = 0; s < nSchienen; s++) {
  160. let schienenKurs = mapKursSchiene.get(kurs);
  161. if (schienenKurs === null)
  162. throw new NullPointerException_1.NullPointerException();
  163. if (ssw.isVarTrue(schienenKurs[s])) {
  164. schienen.add(s);
  165. }
  166. }
  167. kurs.aktionVerteileAufSchienen(schienen);
  168. }
  169. return satresult;
  170. }
  171. isTranspiledInstanceOf(name) {
  172. return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusKSatSolver', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusK'].includes(name);
  173. }
  174. }
  175. exports.KursblockungAlgorithmusKSatSolver = KursblockungAlgorithmusKSatSolver;
  176. function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKSatSolver(obj) {
  177. return obj;
  178. }
  179. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKSatSolver = cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKSatSolver;
  180. //# sourceMappingURL=KursblockungAlgorithmusKSatSolver.js.map