"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig = exports.KursblockungAlgorithmusSZufaellig = void 0;
const KursblockungAlgorithmusS_1 = require("../../core/kursblockung/KursblockungAlgorithmusS");
const KursblockungStatic_1 = require("../../core/kursblockung/KursblockungStatic");
const System_1 = require("../../java/lang/System");
class KursblockungAlgorithmusSZufaellig extends KursblockungAlgorithmusS_1.KursblockungAlgorithmusS {
    static MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG = 50;
    schuelerArr;
    perm;
    nurMultikurse;
    /**
     * Im Konstruktor kann die Klasse die jeweiligen Datenstrukturen aufbauen. Kurse
     * dürfen in diese Methode noch nicht auf Schienen verteilt werden.
     *
     * @param pLogger        Logger zum Protokollieren von Warnungen und Fehlern.
     * @param pDynDat        Die dynamischen Blockungsdaten.
     * @param pNurMultikurse Falls TRUE, dann werden nur die Multikurse der SuS
     *                       verteilt.
     */
    constructor(pLogger, pDynDat, pNurMultikurse) {
        super(pLogger, pDynDat);
        this.nurMultikurse = pNurMultikurse;
        this.schuelerArr = pDynDat.gibSchuelerArray(this.nurMultikurse);
        this.perm = KursblockungStatic_1.KursblockungStatic.gibPermutation(this.schuelerArr.length);
    }
    /**
     * Der Algorithmus verteilt die SuS auf ihre Kurse zufällig. Kommt es während
     * des Verteilens zur Kollision, so wird der Kurs nicht gewählt.
     */
    berechne(pMaxTimeMillis) {
        let timeStart = System_1.System.currentTimeMillis();
        this.dynDaten.aktionSchuelerAusAllenKursenEntfernen();
        this.dynDaten.gibStatistik().aktionBewertungSpeichernS();
        let countKeineVerbesserung = 0;
        while (System_1.System.currentTimeMillis() - timeStart < pMaxTimeMillis) {
            if (this.berechneSchritt()) {
                countKeineVerbesserung = 0;
            }
            else {
                countKeineVerbesserung++;
                if (countKeineVerbesserung === KursblockungAlgorithmusSZufaellig.MAX_RUNDEN_IN_FOLGE_OHNE_VERBESSERUNG) {
                    break;
                }
            }
        }
    }
    /**
     * Der Algorithmus verteilt die SuS ein weiteres Mal zufällig. Falls die
     * Verteilung schlechter ist, wird der vorherige Zustand wiederhergestellt.
     *
     * @return TRUE, falls der Zustand sich verbessert hat.
     */
    berechneSchritt() {
        let verbesserung = false;
        KursblockungStatic_1.KursblockungStatic.aktionPermutiere(this.perm);
        for (let p = 0; p < this.schuelerArr.length; p++) {
            let i = this.perm[p];
            let schueler = this.schuelerArr[i];
            this.dynDaten.gibStatistik().aktionBewertungSpeichernS();
            schueler.aktionZustandSpeichernS();
            schueler.aktionKurseAlleEntfernen();
            schueler.aktionKurseZufaelligVerteilen(this.nurMultikurse);
            let cmp = this.dynDaten.gibStatistik().gibBewertung_NW_KD_JetztS();
            if (cmp < 0) {
                schueler.aktionZustandLadenS();
            }
            if (cmp > 0) {
                verbesserung = true;
            }
        }
        return verbesserung;
    }
    isTranspiledInstanceOf(name) {
        return ['de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusS', 'de.nrw.schule.svws.core.kursblockung.KursblockungAlgorithmusSZufaellig'].includes(name);
    }
}
exports.KursblockungAlgorithmusSZufaellig = KursblockungAlgorithmusSZufaellig;
function cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig(obj) {
    return obj;
}
exports.cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig = cast_de_nrw_schule_svws_core_kursblockung_KursblockungAlgorithmusSZufaellig;
//# sourceMappingURL=KursblockungAlgorithmusSZufaellig.js.map