function y = helloga(str) % HELLOGA(STR) % % STR-ben megadott sztring kitenyésztése genetikus algoritmussal. % Paraméter nélkül hívva a 'Hello World!' üzenetet próbálja elérni. % % 'Hello World!' - Genetikus Algoritmus demo függvény Matlabhoz (version 6.5) % % Készítette: Raffai Tamás % Szeged, 2005-11-10 %Stratégiai paraméterek beállítása GA_TARGET = 'Hello World!'; % default célstring GA_POPSIZE = 1000; % populáció egyedszáma GA_MAXITER = 150; % maximális iterációszám GA_ELITRATE = 0.1; % elitráta GA_MUTATION = 0.25; % mutációs ráta PRINTOUT = 10; % eredmény kiíratás periódusa if nargin>0 GA_TARGET = str; end % t := 0, populációk számának inicializálása t = 0; % P kezdeti populáció létrehozása P = floor (rand(GA_POPSIZE, length(GA_TARGET)) * 96 + 32); F = sum(abs(P-ones(GA_POPSIZE,1)*GA_TARGET), 2); % WHILE NOT Kilépési_feltétel(P) while t < GA_MAXITER & F(1) ~= 0 % kilépési feltétel: iterációk száma v. megoldás % Aktuális populáció sorbarendezése [F, I] = sort(F); for i = 1 : length(I) TMP(i, :) = P(I(i), :); end P = TMP; y = char( P(1, :)); % legjobb egyed % Algoritmus futásáról tájékoztatni illik a felhasználót if rem (t, PRINTOUT) == 0 str = sprintf('%d. generacija ima najbolju jedinku: %s fitness: %d', t, y, F(1)); disp (str); end % Elitek beválogatása elitek = floor (GA_ELITRATE * GA_POPSIZE); Puj(1:elitek,:) = P(1:elitek,:); % Szelekció (a fennmaradó helyekre) for i = elitek+1 : GA_POPSIZE e1 = floor( rand * GA_POPSIZE + 1); % anyuci e2 = floor( rand * GA_POPSIZE + 1); % apuci crp = floor( rand * length(GA_TARGET) + 1); % keresztezési pont % Rekombináció Puj(i, :) = [P(e1, 1:crp), P(e2, (crp+1):length(GA_TARGET))]; end % Mutáció (várható érték alapján) for i = 1 : GA_POPSIZE*GA_MUTATION Puj (floor(rand*GA_POPSIZE)+1, floor(rand*length(GA_TARGET))+1) = floor(rand * 96 + 32); end % Visszahelyezés P = Puj; % P egyedeinek kiértékelése az F fitnessz függvény alapján F = sum(abs(P-ones(GA_POPSIZE,1)*GA_TARGET), 2); % Populációszám (iterációszám) növelése t = t + 1; end % WHILE ciklus vége % Legjobb fitnessz értékkel rendelkező egyed kiválasztása [F, I] = sort(F); y = char(P(I(1), :)); if F(1) == 0 disp('Dostignuta je optimalna vrednost.'); else disp('Program je dostigao maksimalan broj generacija bez optimuma.'); end % end of helloga