KursblockungAlgorithmusKMatching.js 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKMatching = exports.KursblockungAlgorithmusKMatching = void 0;
  4. const KursblockungStatic_1 = require("../../core/kursblockung/KursblockungStatic");
  5. const KursblockungAlgorithmusK_1 = require("../../core/kursblockung/KursblockungAlgorithmusK");
  6. const System_1 = require("../../java/lang/System");
  7. class KursblockungAlgorithmusKMatching extends KursblockungAlgorithmusK_1.KursblockungAlgorithmusK {
  8. static MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG = 2000;
  9. schuelerAlle;
  10. /**
  11. * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
  12. * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
  13. *
  14. * @param pLogger Logger für Benutzerhinweise, Warnungen und Fehler.
  15. * @param pDynDat Die dynamischen Blockungsdaten.
  16. */
  17. constructor(pLogger, pDynDat) {
  18. super(pLogger, pDynDat);
  19. this.schuelerAlle = this.dynDaten.gibSchuelerArray(false);
  20. }
  21. /**
  22. * Der Algorithmus entfernt zunächst alle SuS aus ihren Kursen. Anschließend
  23. * werden die Kurse zufällig verteilt. Anschließend verändert der Algorithmus
  24. * die Lage eines zufälligen Kurses. Falls sich die Bewertung verschlechter,
  25. * wird die Veränderung rückgängig gemacht.
  26. */
  27. berechne(pMaxTimeMillis) {
  28. if (this.dynDaten.gibKurseDieFreiSindAnzahl() === 0) {
  29. return;
  30. }
  31. let timeStart = System_1.System.currentTimeMillis();
  32. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  33. this.dynDaten.aktionKurseFreieZufaelligVerteilen();
  34. this.dynDaten.aktionZustandSpeichernK();
  35. let countKeineVerbesserung = 0;
  36. while (System_1.System.currentTimeMillis() - timeStart < pMaxTimeMillis) {
  37. if (this.berechneSchritt()) {
  38. countKeineVerbesserung = 0;
  39. }
  40. else {
  41. countKeineVerbesserung++;
  42. if (countKeineVerbesserung === KursblockungAlgorithmusKMatching.MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG) {
  43. break;
  44. }
  45. }
  46. }
  47. }
  48. /**
  49. * Die Lage einiger Kurse wird verändert. Falls sich die Bewertung
  50. * verschlechter, wird die Veränderung rückgängig gemacht.
  51. */
  52. berechneSchritt() {
  53. let maxChanges = 1;
  54. while (Math.random() < 0.5) {
  55. maxChanges++;
  56. }
  57. for (let changes = 0; changes < maxChanges; changes++) {
  58. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  59. this.dynDaten.aktionKursFreienEinenZufaelligVerteilen();
  60. this.verteileSuS();
  61. if (this.dynDaten.gibBewertungJetztBesserAlsK() > 0) {
  62. this.dynDaten.aktionZustandSpeichernK();
  63. return true;
  64. }
  65. }
  66. this.dynDaten.aktionZustandLadenK();
  67. return false;
  68. }
  69. /**
  70. * Verteilt die SuS. Multikurse werden zufällig verteilt. Alle anderen Kurse mit
  71. * Hilfe eines Matching-Algorithmus.
  72. */
  73. verteileSuS() {
  74. let perm = KursblockungStatic_1.KursblockungStatic.gibPermutation(this.schuelerAlle.length);
  75. for (let p = 0; p < perm.length; p++) {
  76. let i = perm[p];
  77. let schueler = this.schuelerAlle[i];
  78. schueler.aktionKurseZufaelligVerteilen(true);
  79. schueler.aktionKurseMitBipartiteMatchingVerteilen();
  80. }
  81. }
  82. isTranspiledInstanceOf(name) {
  83. return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusK', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusKMatching'].includes(name);
  84. }
  85. }
  86. exports.KursblockungAlgorithmusKMatching = KursblockungAlgorithmusKMatching;
  87. function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKMatching(obj) {
  88. return obj;
  89. }
  90. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKMatching = cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKMatching;
  91. //# sourceMappingURL=KursblockungAlgorithmusKMatching.js.map