Advertisement
desdemona

mrówy

Mar 11th, 2013
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 5.50 KB | None | 0 0
  1. % Algorytm mrowkowy poszukiwania minimalnej sciezki
  2. %
  3.  
  4. clear
  5. par = 0.01; %wsplczynnik parowania
  6. fp = 5;        % stala ilosc feromonu w kazdym polu;
  7. nazwa_pliku = 'labirynt4.bmp'
  8. liczba_przejsc = 1000;
  9. liczba_krokow_max = 100;
  10. % liczba_mowek = ...     % liczba mrowek idacych rownolegle
  11. % fp = ...        % stala ilosc feromonu w kazdym polu;
  12. % n = ...         % wspolczynnik nacisku selekcyjnego (im wiekszy, tym wieksze prawd. wyboru kierunku z wieksza iloscia feromonu)
  13. % par = ...   % wspolczynik parowania feromonu (zmniejszenie feromonu na kazde przejscie)
  14.  
  15. sledzenie = 1;    % tryb sledzenia ilosci feromonu i dlugosci sciezki
  16. obieg=1;
  17. t = imread(nazwa_pliku);
  18.  
  19. imagesc(t);
  20. mapa_kol = [[1:256];[1:256];[1:256]]'/256;
  21. colormap(mapa_kol);
  22. title(sprintf('labirynt %s nacisnij klawisz ...',nazwa_pliku));
  23.  
  24. pause
  25.  
  26. [lwierszy lkolumn] = size(t);
  27.  
  28. % zakladamy, ze start odbywa sie ze srodka pierwszej kolumny, meta jest na srodku ostatniej kolumny
  29. start = [ceil(lwierszy/2),1]
  30. meta = [ceil(lwierszy/2),lkolumn]
  31.  
  32. f = zeros(lwierszy,lkolumn);         % tablica feromonu
  33.  
  34. for i=1:liczba_przejsc
  35.     krok = 1;
  36.     pole = start;
  37.     pole_pop = start;
  38.     sciezka = [];
  39.     while (krok < liczba_krokow_max)&&((pole(1) ~= meta(1))||(pole(2) ~= meta(2)))
  40.         % wyznaczenie dostepnych pol, w ktore mozna wejsc:
  41.         % zakladamy, ze mrowka nie moze wyjsc poza plansze, nie moze
  42.         % wejsc na sciane oraz nie cofa sie na pole z ktorego przyszla
  43.         % (chyba ze nie ma innej mozliwosci)
  44.         pola_dost = [];
  45.         ilosci_fer = [];
  46.         if (pole(2) > 1) && (t(pole(1),pole(2)-1)==1) && (pole(2)-1 ~= pole_pop(2))
  47.             pola_dost = [pola_dost ; pole-[0 1]];
  48.             ilosci_fer = [ilosci_fer f(pole(1),pole(2)-1)];
  49.         end
  50.         if (pole(2) < lkolumn) && (t(pole(1),pole(2)+1)==1) && (pole(2)+1 ~= pole_pop(2))
  51.             pola_dost = [pola_dost ; pole+[0 1]];
  52.             ilosci_fer = [ilosci_fer f(pole(1),pole(2)+1)];
  53.         end
  54.         if (pole(1) > 1) && (t(pole(1)-1,pole(2))==1) && (pole(1)-1 ~= pole_pop(1))
  55.             pola_dost = [pola_dost ; pole-[1 0]];
  56.             ilosci_fer = [ilosci_fer f(pole(1)-1,pole(2))];
  57.         end
  58.         if (pole(1) < lwierszy) && (t(pole(1)+1,pole(2))==1) && (pole(1)+1 ~= pole_pop(1))
  59.             pola_dost = [pola_dost ; pole+[1 0]];
  60.             ilosci_fer = [ilosci_fer f(pole(1)+1,pole(2))];
  61.         end
  62.         liczba_dost = length(ilosci_fer);
  63. pola_dost
  64.        
  65.         if liczba_dost == 0
  66.             p = pole;
  67.             pole = pole_pop;                          % cofniecie sie do pola poprzedniego, jesli brak innych dostepnych pol
  68.             pole_pop = p;
  69.         else
  70.             pole_pop = pole;    
  71.             % pole poprzednie (by do niego ponownie nie wejsc)
  72.             % ..............  TUTAJ NALEZY WYBRAC NOWE POLE ...........
  73.             % pole =
  74.            
  75.             % zeby nie bylo bledu - wybor pole pierwszego z brzegu
  76.             % pole = pola_dost(1,:);
  77.            
  78.  
  79.                
  80.                  randomowa_liczba=rand()*100;
  81.                 feromon_calk=0;
  82.                 feromon_calk=sum(ilosci_fer);
  83.                
  84.                 if feromon_calk == 0
  85.  liczba=round(length(ilosci_fer)*rand());
  86.  if liczba == 0
  87.      liczba=1;
  88.  end
  89.                 pole= pola_dost(liczba,:);
  90.                 else
  91.  
  92.                     p1(1) = 1;
  93.                     p2(1) = ((ilosci_fer(1)+1) * 100)/(feromon_calk+length(ilosci_fer))
  94.                     for a=1:length(ilosci_fer)
  95.                         if a == 1
  96.                          p1(1) = 1;
  97.                          p2(1) = ((ilosci_fer(1)+1) * 100)/(feromon_calk+length(ilosci_fer))
  98.                         else
  99.                            
  100.                         p1(a)=p2(a-1)
  101.                         p2(a)=p1(a)+((ilosci_fer(a)+1)*100)/(feromon_calk+length(ilosci_fer))
  102.                         end
  103.                     end
  104.  
  105.                     for a=1:length(ilosci_fer)
  106.                        if randomowa_liczba >= p1(a) && randomowa_liczba <= p2(a)
  107.                            pole = pola_dost(a,:);
  108.                        end
  109.                     end
  110.                 end
  111.            
  112.         end
  113.            
  114.         sciezka(krok,:) = pole;                     % wpisanie pola do sciezki      
  115.         krok = krok + 1;
  116.     end  % while po krokach mrowki
  117.    
  118.     if (pole(1) == meta(1))&&(pole(2) == meta(2))  % jesli koncowym polem jest meta
  119.         % usuwanie petli (moze byc lub nie):
  120.         while i <= length(sciezka(:,1))
  121.             pole = sciezka(i,:);
  122.             for j=length(sciezka(:,1)):-1:i+1
  123.                 if (sciezka(j,1)==pole(1))&&(sciezka(j,2)==pole(2))
  124.                     sciezka(i+1:j,:) = [];
  125.                     break;
  126.                 end
  127.             end
  128.             i = i+1;
  129.         end
  130.  
  131.         % ............... TUTAJ NALEZY ZMODYFIKOWAC TABLICE FEROMONU
  132.         % f =
  133.         for a = 1:length(sciezka)  
  134.             f(sciezka(a, 1), sciezka(a,2)) = f(sciezka(a, 1), sciezka(a,2)) +  10/length(sciezka);
  135.         end
  136.         f = f*(1-0.05);
  137.     end
  138.    
  139.        
  140.     if sledzenie
  141.         imagesc(1-f/max(max(f))*0.9);
  142.         mapa_kol = [[1:256];[1:256];[1:256]]'/256;
  143.         sciezka_max;
  144.         title(sprintf('pozostaly feromon, dlugosc sciezki = %d',dlugosc_sciezki))
  145.         pause(0.1);
  146.     end
  147.    
  148. end
  149.  
  150. %fig = figure;
  151. imagesc(1-f/max(max(f))*0.9);
  152. mapa_kol = [[1:256];[1:256];[1:256]]'/256;
  153. sciezka_max;
  154. title(sprintf('pozostaly feromon, dlugosc sciezki = %d',dlugosc_sciezki))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement