function y = mondat(str) % MONDAT(STR) % % STR-ben megadott sztring kitenyésztése genetikus algoritmussal. % Paraméter nélkül hívva a 'Agent technology is a new field in software % development.' mondatot próbálja meg elérni. % %Stratégiai paraméterek beállítása %default célstring GA_TARGET = 'Agent technology is a new field in software development.'; GA_POPSIZE = 1000; %populáció egyedszáma GA_MAXITER = 1000; %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 vagy 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 % Az algoritmus futásáról tájékoztatjuk a felhasználót if rem (t, PRINTOUT) == 0 str = sprintf('%d. generáció legjobb egyede: %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); % anya e2 = floor( rand * GA_POPSIZE + 1); % apa 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('Optimális érték elérve.'); else disp('A program elérte a maximális generációszámot optimum nélkül.'); end % end of mondat