KursblockungAlgorithmusKMatching.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { JavaObject, cast_java_lang_Object } from '../../java/lang/JavaObject';
  2. import { KursblockungStatic, cast_de_nrw_schule_svws_core_kursblockung_KursblockungStatic } from '../../core/kursblockung/KursblockungStatic';
  3. import { KursblockungDynDaten, cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynDaten } from '../../core/kursblockung/KursblockungDynDaten';
  4. import { KursblockungAlgorithmusK, cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusK } from '../../core/kursblockung/KursblockungAlgorithmusK';
  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 KursblockungAlgorithmusKMatching extends KursblockungAlgorithmusK {
  9. private static readonly MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG : number = 2000;
  10. private readonly schuelerAlle : Array<KursblockungDynSchueler>;
  11. /**
  12. * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
  13. * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
  14. *
  15. * @param pLogger Logger für Benutzerhinweise, Warnungen und Fehler.
  16. * @param pDynDat Die dynamischen Blockungsdaten.
  17. */
  18. public constructor(pLogger : Logger, pDynDat : KursblockungDynDaten) {
  19. super(pLogger, pDynDat);
  20. this.schuelerAlle = this.dynDaten.gibSchuelerArray(false);
  21. }
  22. /**
  23. * Der Algorithmus entfernt zunächst alle SuS aus ihren Kursen. Anschließend
  24. * werden die Kurse zufällig verteilt. Anschließend verändert der Algorithmus
  25. * die Lage eines zufälligen Kurses. Falls sich die Bewertung verschlechter,
  26. * wird die Veränderung rückgängig gemacht.
  27. */
  28. public berechne(pMaxTimeMillis : number) : void {
  29. if (this.dynDaten.gibKurseDieFreiSindAnzahl() === 0) {
  30. return;
  31. }
  32. let timeStart : number = System.currentTimeMillis();
  33. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  34. this.dynDaten.aktionKurseFreieZufaelligVerteilen();
  35. this.dynDaten.aktionZustandSpeichernK();
  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 === 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. private berechneSchritt() : boolean {
  53. let maxChanges : number = 1;
  54. while (Math.random() < 0.5) {
  55. maxChanges++;
  56. }
  57. for (let changes : number = 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. private verteileSuS() : void {
  74. let perm : Array<number> = KursblockungStatic.gibPermutation(this.schuelerAlle.length);
  75. for (let p : number = 0; p < perm.length; p++){
  76. let i : number = perm[p];
  77. let schueler : KursblockungDynSchueler | null = this.schuelerAlle[i];
  78. schueler.aktionKurseZufaelligVerteilen(true);
  79. schueler.aktionKurseMitBipartiteMatchingVerteilen();
  80. }
  81. }
  82. isTranspiledInstanceOf(name : string): boolean {
  83. return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusK', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusKMatching'].includes(name);
  84. }
  85. }
  86. export function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKMatching(obj : unknown) : KursblockungAlgorithmusKMatching {
  87. return obj as KursblockungAlgorithmusKMatching;
  88. }