KursblockungAlgorithmusSZufaellig.ts 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { JavaObject, cast_java_lang_Object } from '../../java/lang/JavaObject';
  2. import { KursblockungAlgorithmusS, cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusS } from '../../core/kursblockung/KursblockungAlgorithmusS';
  3. import { KursblockungStatic, cast_de_nrw_schule_svws_core_kursblockung_KursblockungStatic } from '../../core/kursblockung/KursblockungStatic';
  4. import { KursblockungDynDaten, cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynDaten } from '../../core/kursblockung/KursblockungDynDaten';
  5. import { KursblockungDynSchueler, cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynSchueler } from '../../core/kursblockung/KursblockungDynSchueler';
  6. import { Logger, cast_de_nrw_schule_svws_logger_Logger } from '../../logger/Logger';
  7. import { System, cast_java_lang_System } from '../../java/lang/System';
  8. export class KursblockungAlgorithmusSZufaellig extends KursblockungAlgorithmusS {
  9. private static readonly MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG : number = 50;
  10. private readonly schuelerArr : Array<KursblockungDynSchueler>;
  11. private readonly perm : Array<number>;
  12. private readonly nurMultikurse : boolean;
  13. /**
  14. * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
  15. * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
  16. *
  17. * @param pLogger Logger zum Protokollieren von Warnungen und Fehlern.
  18. * @param pDynDat Die dynamischen Blockungsdaten.
  19. * @param pNurMultikurse Falls TRUE, dann werden nur die Multikurse der SuS
  20. * verteilt.
  21. */
  22. public constructor(pLogger : Logger, pDynDat : KursblockungDynDaten, pNurMultikurse : boolean) {
  23. super(pLogger, pDynDat);
  24. this.nurMultikurse = pNurMultikurse;
  25. this.schuelerArr = pDynDat.gibSchuelerArray(this.nurMultikurse);
  26. this.perm = KursblockungStatic.gibPermutation(this.schuelerArr.length);
  27. }
  28. /**
  29. * Der Algorithmus verteilt die SuS auf ihre Kurse zufällig. Kommt es während
  30. * des Verteilens zur Kollision, so wird der Kurs nicht gewählt.
  31. */
  32. public berechne(pMaxTimeMillis : number) : void {
  33. let timeStart : number = System.currentTimeMillis();
  34. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  35. this.dynDaten.gibStatistik().aktionBewertungSpeichernS();
  36. let countKeineVerbesserung : number = 0;
  37. while (System.currentTimeMillis() - timeStart < pMaxTimeMillis) {
  38. if (this.berechneSchritt()) {
  39. countKeineVerbesserung = 0;
  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. private berechneSchritt() : boolean {
  55. let verbesserung : boolean = false;
  56. KursblockungStatic.aktionPermutiere(this.perm);
  57. for (let p : number = 0; p < this.schuelerArr.length; p++){
  58. let i : number = this.perm[p];
  59. let schueler : KursblockungDynSchueler = this.schuelerArr[i];
  60. this.dynDaten.gibStatistik().aktionBewertungSpeichernS();
  61. schueler.aktionZustandSpeichernS();
  62. schueler.aktionKurseAlleEntfernen();
  63. schueler.aktionKurseZufaelligVerteilen(this.nurMultikurse);
  64. let cmp : number = 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 : string): boolean {
  75. return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusS', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusSZufaellig'].includes(name);
  76. }
  77. }
  78. export function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig(obj : unknown) : KursblockungAlgorithmusSZufaellig {
  79. return obj as KursblockungAlgorithmusSZufaellig;
  80. }