% Hopfield modell léptetése, mindennel együtt
% T a külcsönhatási mátrix. vektor: x, ami N hosszú
% Megjegyzendő vektorok: X(M,N)-ben, ahol M a vektorok száma, N a hosszuk,
% vagyis X(i,:) az i-edik vektor.

X = zeros(N);
from = floor(0.042*N);
to = ceil(0.1*N);
futasok = 1;
vektor = zeros(to-from,2);
for M = from:to
    % Megjegyzendő vektorok legenerálása random módon (M db)
    for i=1:N
        for j=1:M
            if (rand(1)<0.5)
                X(j,i) = 1;
            else
                X(j,i) = -1;
            end
        end
    end
    
    % T mátrix legenerálása X-ek alapján
    T = zeros(N);
    for i = 1:M
        T = T + kron(X(i,:),X(i,:)');
    end
    for i = 1:N
        T(i,i) = 0;
    end
    
    % Több random kezdőértékkel indítva sikeres konvergencia arányának
    % vizsgálata
    success = 0;
    tries = 0;
    for i = 1:100;
        % Random kezdővektor legenerálása
        x = 2*rand(1,N)-1;

        % Léptetés inicializálással
        feltetel = 1;
        k = 1;
        new = 1;
        old = 0;
        while (new - old)
            % Véletlen aszinkron léptetés
            prev = x;
            i = fix(rand()*N+1);
            temp = x*T;
            x(i) = sign(temp(i));

            % Konvergencia vizsgálat
            if (~(mod(k,5*N)))
                old = new;
                new = x*T*x';
            end
            k = k + 1;
        end

        % Siekres konvergálások számolása
        for i=1:M
            if (x-X(i,:) == zeros(1,N))
                success = success + 1;
            end
            if (x+X(i,:) == zeros(1,N))
                success = success + 1;
            end
        end
        tries = tries + 1
    end

    vektor(futasok,1) = M/N;
    vektor(futasok,2) = success / tries;
    futasok = futasok + 1;
    
    szazalek_kesz = 100*(M-from)/(to-from)
    from
    to
    M
    vektor
end
vektor