KursblockungAlgorithmusSZufaellig.js 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig = exports.KursblockungAlgorithmusSZufaellig = void 0;
  4. const KursblockungAlgorithmusS_1 = require("../../core/kursblockung/KursblockungAlgorithmusS");
  5. const KursblockungStatic_1 = require("../../core/kursblockung/KursblockungStatic");
  6. const System_1 = require("../../java/lang/System");
  7. class KursblockungAlgorithmusSZufaellig extends KursblockungAlgorithmusS_1.KursblockungAlgorithmusS {
  8. static MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG = 50;
  9. schuelerArr;
  10. perm;
  11. nurMultikurse;
  12. /**
  13. * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
  14. * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
  15. *
  16. * @param pLogger Logger zum Protokollieren von Warnungen und Fehlern.
  17. * @param pDynDat Die dynamischen Blockungsdaten.
  18. * @param pNurMultikurse Falls TRUE, dann werden nur die Multikurse der SuS
  19. * verteilt.
  20. */
  21. constructor(pLogger, pDynDat, pNurMultikurse) {
  22. super(pLogger, pDynDat);
  23. this.nurMultikurse = pNurMultikurse;
  24. this.schuelerArr = pDynDat.gibSchuelerArray(this.nurMultikurse);
  25. this.perm = KursblockungStatic_1.KursblockungStatic.gibPermutation(this.schuelerArr.length);
  26. }
  27. /**
  28. * Der Algorithmus verteilt die SuS auf ihre Kurse zufällig. Kommt es während
  29. * des Verteilens zur Kollision, so wird der Kurs nicht gewählt.
  30. */
  31. berechne(pMaxTimeMillis) {
  32. let timeStart = System_1.System.currentTimeMillis();
  33. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  34. this.dynDaten.gibStatistik().aktionBewertungSpeichernS();
  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 === KursblockungAlgorithmusSZufaellig.MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG) {
  43. break;
  44. }
  45. }
  46. }
  47. }
  48. /**
  49. * Der Algorithmus verteilt die SuS ein weiteres Mal zufällig. Falls die
  50. * Verteilung schlechter ist, wird der vorherige Zustand wiederhergestellt.
  51. *
  52. * @return TRUE, falls der Zustand sich verbessert hat.
  53. */
  54. berechneSchritt() {
  55. let verbesserung = false;
  56. KursblockungStatic_1.KursblockungStatic.aktionPermutiere(this.perm);
  57. for (let p = 0; p < this.schuelerArr.length; p++) {
  58. let i = this.perm[p];
  59. let schueler = this.schuelerArr[i];
  60. this.dynDaten.gibStatistik().aktionBewertungSpeichernS();
  61. schueler.aktionZustandSpeichernS();
  62. schueler.aktionKurseAlleEntfernen();
  63. schueler.aktionKurseZufaelligVerteilen(this.nurMultikurse);
  64. let cmp = this.dynDaten.gibStatistik().gibBewertung_NW_KD_JetztS();
  65. if (cmp < 0) {
  66. schueler.aktionZustandLadenS();
  67. }
  68. if (cmp > 0) {
  69. verbesserung = true;
  70. }
  71. }
  72. return verbesserung;
  73. }
  74. isTranspiledInstanceOf(name) {
  75. return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusS', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusSZufaellig'].includes(name);
  76. }
  77. }
  78. exports.KursblockungAlgorithmusSZufaellig = KursblockungAlgorithmusSZufaellig;
  79. function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig(obj) {
  80. return obj;
  81. }
  82. exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig = cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig;
  83. //# sourceMappingURL=KursblockungAlgorithmusSZufaellig.js.map