classdef classifier
    %CLASSIFIER Definiert die Struktur eines Klassifikators
    %   Klassendefinition für die Klassifikatoren
    %   die das Verhalten der Agenten steuern
    %
    %   Ein Klassifikator in LCS besteht aus einer Regel, die
    %   einen Detektor (hier als String implementiert) und
    %   einen Effektor miteinander verknüpft.
    %   Außerdem werden noch verschiedene zusätzliche Parameter
    %   wie Stärke(Fitness) und Spezifizität der Regel als
    %   Bestandteil des Klassifikators definiert.
    
    properties
        detector % enthält den String zur Definition des Detektors zur
        % Verarbeitung der Umwelt
        % B           = beliebiger Baustein an Position
        % *           = don't care
        % 0,1,2,3,... = bestimmter (bzw. kein) Baustein an Position
        
        effector % Definiert die Aktion des Agenten - in diesem Modell also
        % den Typ des zu bauenden Bausteins als Zahlenwert (1,2,3,
        % ...) bzw. auch eben KEINEN Baustein zu setzen (0)
        
        strength % skalarer Wert zur Bestimmung der Stärke oder Fitness
        % - normiert auf Wert >= 0 && <= 255
        % wichtig wegen interner Codierung in 8bit Gray code
        % für GA
        
        fitnessstring % Fitnesswert in 8bit Gray code als Textstring z.B. '00110110'
        
        specificity % Wert zur Bestimmung der Genauigkeit der Regel
        % entspricht der Zahl der Elemente des Detektor-Strings
        % die nicht "*"-don't-care entsprechen
        
        age % wird in jedem Zeitschritt erhöht, bei Benutzung des Klassifikators erniedrigt
        % nach Modell von Holland(1978)
        
        frequency % Häufigkeit der Aktivierung des Klassifikators
        % Wird bei jeder Aktivierung um 1 erhöht
        
        attenuation % Dämpfungskoeffizient
        % wird bei der Berechnung des Feedback aus der Umgebung
        % miteinbezogen
        
        detectorlength = 6; % Länge des Detektors (im zweidimensionalen Modell 6,
        % im dreidimensionalen 20
        
        bid % skalarer Wert, der aus strength und specificity in jedem Zeitschritt neu berechnet wird
        % wird nur berechnet, wenn Klassifikator im Matchset auftaucht
        % Je höher der bid-Wert des Klassifikators, desto höher seine
        % Chance auf Ausführung. Pro Zeitschritt wird nur ein
        % Klassifikator angewendet.
        
        minfit % intern benutzte Untergrenze für Roulette-Wheel-Selection
        maxfit % intern benutzte Obergrenze für Roulette-Wheel-Selection
        
        
    end
    
    methods
        function obj = classifier( rulestring, fitness ) % Konstruktor
            obj.detector = rulestring(1:obj.detectorlength);
            % kopiert die relevanten Teile des Strings in den Detektor
            
            obj.strength = bin2gray(fitness,'fsk',256); % Konvertierung in 8bit Gray code
            obj.fitnessstring = dec2bin(obj.strength,8); % Darstellung der Fitness als Bitstring für GA
            
            obj.specificity = 0;
            for pos=1:obj.detectorlength
                if (~(strcmp(obj.detector(pos), '*')))
                    obj.specificity = obj.specificity + 1;
                end
            end % Spezifizität der Regel wird berechnet
            
            obj.effector = str2double(rulestring(obj.detectorlength + 1));
            % letzte Position des RuleString ist der Effektor
            
            obj.age = 0;
            obj.frequency = 0;
            obj.attenuation = 0; % Initialisierung von age, frequency und attenuation
            % Anfangswerte bei allen gleich Null
        end
    end
    
end

