Advertisement
Tobiasz931

matlab1

Mar 11th, 2013
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 5.01 KB | None | 0 0
  1. % Algorytm mrowkowy poszukiwania minimalnej sciezki
  2. %
  3.  
  4. clear
  5. nazwa_pliku = 'labirynt3.bmp'
  6. liczba_przejsc = 1000;
  7. liczba_krokow_max = 100;
  8. %fer_max = 15;
  9. %indx = 1;
  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 = 0;    % tryb sledzenia ilosci feromonu i dlugosci sciezki
  16.  
  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.         X=[];
  41.         % wyznaczenie dostepnych pol, w ktore mozna wejsc:
  42.         % zakladamy, ze mrowka nie moze wyjsc poza plansze, nie moze
  43.         % wejsc na sciane oraz nie cofa sie na pole z ktorego przyszla
  44.         % (chyba ze nie ma innej mozliwosci)
  45.         pola_dost = [];
  46.         ilosci_fer = [];
  47.         if (pole(2) > 1) && (t(pole(1),pole(2)-1)==1) && (pole(2)-1 ~= pole_pop(2))
  48.             pola_dost = [pola_dost ; pole-[0 1]];
  49.             ilosci_fer = [ilosci_fer f(pole(1),pole(2)-1)];
  50.         end
  51.         if (pole(2) < lkolumn) && (t(pole(1),pole(2)+1)==1) && (pole(2)+1 ~= pole_pop(2))
  52.             pola_dost = [pola_dost ; pole+[0 1]];
  53.             ilosci_fer = [ilosci_fer f(pole(1),pole(2)+1)];
  54.         end
  55.         if (pole(1) > 1) && (t(pole(1)-1,pole(2))==1) && (pole(1)-1 ~= pole_pop(1))
  56.             pola_dost = [pola_dost ; pole-[1 0]];
  57.             ilosci_fer = [ilosci_fer f(pole(1)-1,pole(2))];
  58.         end
  59.         if (pole(1) < lwierszy) && (t(pole(1)+1,pole(2))==1) && (pole(1)+1 ~= pole_pop(1))
  60.             pola_dost = [pola_dost ; pole+[1 0]];
  61.             ilosci_fer = [ilosci_fer f(pole(1)+1,pole(2))];
  62.         end
  63.         liczba_dost = length(ilosci_fer);
  64.  
  65.        
  66.         if liczba_dost == 0
  67.             p = pole;
  68.             pole = pole_pop;                          % cofniecie sie do pola poprzedniego, jesli brak innych dostepnych pol
  69.             pole_pop = p;
  70.         else
  71.             pole_pop = pole;                            % pole poprzednie (by do niego ponownie nie wejsc)
  72.             % ..............  TUTAJ NALEZY WYBRAC NOWE POLE ...........
  73.             % pole =
  74.             random = randi(1000);
  75.             fer_max=-10;
  76.             znalazl=true;
  77.             while(znalazl)
  78.                 znalazl=true;
  79.                 if random<i
  80.                     for j=1:liczba_dost
  81.                         if((ilosci_fer(j) > fer_max))
  82.                             fer_max = ilosci_fer(j);
  83.                             indx = j;
  84.                         end
  85.                     end
  86.                 else
  87.                    indx = randi(liczba_dost);  
  88.                 end
  89.                 pole = pola_dost(indx,:);
  90.                 for ite=1:length(X)
  91.                     if X[ite]==pole
  92.                         znalazl=false;
  93.                     end
  94.                 end
  95.                 X = [ X pole ];
  96.             end
  97.             % zeby nie bylo bledu - wybor pole pierwszego z brzegu
  98.            
  99.         end
  100.        
  101.         sciezka(krok,:) = pole;                     % wpisanie pola do sciezki      
  102.         krok = krok + 1;
  103.     end  % while po krokach mrowki
  104.    
  105.     if (pole(1) == meta(1))&&(pole(2) == meta(2))  % jesli koncowym polem jest meta
  106.         % usuwanie petli (moze byc lub nie):
  107.         while i <= length(sciezka(:,1))
  108.             pole = sciezka(i,:);
  109.             for j=length(sciezka(:,1)):-1:i+1
  110.                 if (sciezka(j,1)==pole(1))&&(sciezka(j,2)==pole(2))
  111.                     sciezka(i+1:j,:) = [];
  112.                     break;
  113.                 end
  114.             end
  115.             i = i+1;
  116.         end
  117.  
  118.         % ............... TUTAJ NALEZY ZMODYFIKOWAC TABLICE FEROMONU
  119.         % f =
  120.        
  121.         for a = 1:length(sciezka)
  122.             f(sciezka(a, 1), sciezka(a,2)) =  f(sciezka(a, 1), sciezka(a,2)) + 1 / length(sciezka); %/ <tutaj jakas liczba, ja mam 6> * length(ścieżka);
  123.         end
  124.     end
  125.    
  126.        
  127.     if sledzenie
  128.         imagesc(1-f/max(max(f))*0.9);
  129.         mapa_kol = [[1:256];[1:256];[1:256]]'/256;
  130.         sciezka_max;
  131.         title(sprintf('pozostaly feromon, dlugosc sciezki = %d',dlugosc_sciezki))
  132.         pause(0.1);
  133.     end
  134.     f=f*0.9;
  135. end
  136.  
  137. %fig = figure;
  138. imagesc(1-f/max(max(f))*0.9);
  139. mapa_kol = [[1:256];[1:256];[1:256]]'/256;
  140. sciezka_max;
  141. title(sprintf('pozostaly feromon, dlugosc sciezki = %d',dlugosc_sciezki))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement