KursblockungAlgorithmusKFachwahlmatrix.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { JavaObject, cast_java_lang_Object } from '../../java/lang/JavaObject';
  2. import { KursblockungDynDaten, cast_de_nrw_schule_svws_core_kursblockung_KursblockungDynDaten } from '../../core/kursblockung/KursblockungDynDaten';
  3. import { KursblockungAlgorithmusK, cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusK } from '../../core/kursblockung/KursblockungAlgorithmusK';
  4. import { Logger, cast_de_nrw_schule_svws_logger_Logger } from '../../logger/Logger';
  5. import { System, cast_java_lang_System } from '../../java/lang/System';
  6. export class KursblockungAlgorithmusKFachwahlmatrix extends KursblockungAlgorithmusK {
  7. /**
  8. * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
  9. * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
  10. *
  11. * @param logger Logger für Benutzerhinweise, Warnungen und Fehler.
  12. * @param dynDat Die dynamischen Blockungsdaten.
  13. */
  14. public constructor(logger : Logger, dynDat : KursblockungDynDaten) {
  15. super(logger, dynDat);
  16. }
  17. /**
  18. * Der Algorithmus entfernt zunächst alle SuS aus ihren Kursen. Anschließend
  19. * werden die Kurse zufällig verteilt.
  20. */
  21. public berechne(pMaxTimeMillis : number) : void {
  22. if (this.dynDaten.gibKurseDieFreiSindAnzahl() === 0) {
  23. return;
  24. }
  25. let timeStart : number = System.currentTimeMillis();
  26. this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
  27. this.dynDaten.aktionKurseFreieZufaelligVerteilen();
  28. this.dynDaten.aktionZustandSpeichernK();
  29. let countKeineVerbesserung : number = 0;
  30. while (System.currentTimeMillis() - timeStart < pMaxTimeMillis) {
  31. if (this.berechneSchritt()) {
  32. countKeineVerbesserung = 0;
  33. } else {
  34. countKeineVerbesserung++;
  35. if (countKeineVerbesserung === 10000) {
  36. break;
  37. }
  38. }
  39. }
  40. }
  41. /**
  42. * Die Lage einiger Kurse wird verändert. Falls sich die Bewertung
  43. * verschlechter, wird die Veränderung rückgängig gemacht.
  44. *
  45. * @return TRUE, falls sich die Bewertung verbessert hat.
  46. */
  47. private berechneSchritt() : boolean {
  48. let maxChanges : number = 1;
  49. while (Math.random() < 0.5) {
  50. maxChanges++;
  51. }
  52. for (let changes : number = 0; changes < maxChanges; changes++){
  53. this.dynDaten.aktionKursFreienEinenZufaelligVerteilen();
  54. if (this.dynDaten.gibBewertungJetztBesserAlsK() > 0) {
  55. this.dynDaten.aktionZustandSpeichernK();
  56. return true;
  57. }
  58. }
  59. this.dynDaten.aktionZustandLadenK();
  60. return false;
  61. }
  62. isTranspiledInstanceOf(name : string): boolean {
  63. return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusKFachwahlmatrix', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusK'].includes(name);
  64. }
  65. }
  66. export function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusKFachwahlmatrix(obj : unknown) : KursblockungAlgorithmusKFachwahlmatrix {
  67. return obj as KursblockungAlgorithmusKFachwahlmatrix;
  68. }