Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы оптимизации в радиотехнических системах. Практикум
.pdf
if(ant.tabu(j) == 0)
% Числитель формулы вероятности.
nominator=pheromone(i,j)^a *...
(1/distance(i,j))^b;
denominator=denominator+nominator;
probabilities =...
[probabilities nominator];
cityVariants = [cityVariants j];
end;
end;
if denominator == 0
error('Деление на нуль');
end;
for j=1:length(probabilities)
probabilities(j)=probabilities(j)/...
denominator;
end
9. Cохранить изменения файла cityProbability.m;
10. В текстовом редакторе среды Matlab создать новый файл и сохранить его под именем cycle.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
11. В файле cycle.m поместить заголовок файла-функции:
function [ants, pheromone] = ...
cycle(ants,pheromone,distance,p,a,b)
%-------------------------------------------% Основной рабочий цикл приложения.
% ants - массив муравьев.
% pheromone - массив феромонов.
% distance - матрица расстояний.
% p - интенсивность испарения феромона.
% a - Вес фермента.
% b - Вес расстояния.
12. В файле cycle.m поместить следующий программный код (после
имеющегося кода):
n=length(ants);
%-------------------------------------------% Движение муравьев
101

for ant=1:n
for city=2:(n)
nextCityIndex=...
selectCity(ants(ant),pheromone,...
distance,a,b,n);
ants(ant).way(city) = nextCityIndex;
ants(ant).length = ants(ant).length +...
distance(ants(ant).cityIndex,...
nextCityIndex);
ants(ant).cityIndex = nextCityIndex;
ants(ant).tabu(nextCityIndex) = 1;
if(city == n)
ants(ant).length = ants(ant).length +...
distance(nextCityIndex,...
ants(ant).way(1));
end;
end;
end;
%-------------------------------------------% Испарение феромона
for i=1:n
for j=1:n
if(i ~= j)
pheromone(i, j) = ...
pheromone(i, j)*...
(1-p);
end;
end;
end;
%--------------------------------------------
% Нанесение феромона
% Масштабирующий коэффициент, позволяющий
% избежать очень низких порядков в значениях
% числителя и знаменателя вероятностей.
Q = 100;
for ant=1:n
for wayStep=1:(n - 1)
i = ants(ant).way(wayStep);
j = ants(ant).way(wayStep + 1);
pheromone(i, j) = ...
pheromone(i, j)+...
Q/ants(ant).length;
pheromone(j,i) = ...
pheromone(i, j);
end;
102

end;
end
13. Cохранить изменения файла cycle.m;
14. В текстовом редакторе среды Matlab создать новый файл и сохранить его под именем generator.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
15. В файле generator.m поместить заголовок файла-функции:
function yy=generator(u, x, P)
% generator(u, NN) – функция, обеспечивающая
% появление чисел из матрицы x с соответствующей
% вероятностью. x - матрица-строка чисел,
% P - матрица-строка соответствующих значений
% вероятности,u - значение случайной величины,
% имеющей равномерный закон распределения.
% Сумма чисел матрицы P должна быть
% приблизительно равна 1. Например, если
% x = [1 2 3 4], P = [0.5 0.2 0.2 0.1],
% то функция будет выдавать
% число 1 с вероятностью 0,5; число 2
% с вероятностью 0,2; число 3 с вероятностью
% 0,2 и число 4 с вероятностью 0,1.
% При обработке 100 значений случайной
% величины, с равномерным законом распределения
% число 1 выпадет примерно 50 раз,
% число 2 - 20 раз, число 3 - 20 раз,
% число 4 - 10 раз.
% Если матрица-строка представлена одним числом,
% например x = [3] и P = [1.0], при обработке
% 100 значений случайной величины с равномерным
% законом распределения число 3 выпадет 100 раз.
16. В файле generator.m поместить следующий программный код (после имеющегося кода):
%-------------------------------------------% Вывод сообщения об ошибке
ss_x=size(x);
ss_P=size(P);
if ss_x(1,1)~=1
error('Матрица чисел должна содерж. одну строку');
elseif ss_P(1,1)~=1
error('Матрица вероятн. должна содерж. одну строку');
103

elseif ss_x(1,1)~=ss_P(1,1) || ss_x(1,2)~=ss_P(1,2)
error('Размерности матриц должны быть одинаковы');
elseif u<0 || u>1
error('Случ. число должно быть в интерв. [0, 1]');
elseif sum(P)>1.01 || sum(P)<0.99
error('Сумма чисел матрицы P должна быть равна 1');
end;
%--------------------------------------------
ff=0;
NN=ss_x(1,2);
bounds=zeros(NN,1);
for j=1:NN
ff=ff+P(j);
bounds(j)=ff;
end
for j=1:NN
if j==1 && u>=0 && u<=bounds(1)
yy= x(1);
break;
elseif j~=1 && u>bounds(j-1) && u<=bounds(j)
yy= x(j);
break;
end
end
17. Сохранить изменения файла generator.m;
18. В текстовом редакторе среды Matlab создать новый файл и сохранить его под именем init.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
19. В файле init.m поместить заголовок файла-функции:
function [ants cities pheromone distance]=...
init(n, a, b, p )
%--------------------------------------------
% Функция возвращает инициализированные
% массивы городов и муравьев.
% Аргументы:
% n - Количество городов и муравьев.
% a - Вес фермента.
% b - Вес расстояния.
% p - Коэффициент испарения.
104

% Возвращаемые значения:
% ants - Муравьи.
% cities - Города.
% pheromone - Феромон, отложенный муравьями.
% distance - Расстояния между городами.
20. В файле init.m поместить следующий программный код (после
имеющегося кода):
initialPheromone=1/n;
ants = [];
cities = [];
pheromone = [];
distance = [];
% Координаты городов.
cityXY=[ 21 98;
3 5;
46 55;
36 8;
16 45;
8 25;
6 77;
33 23;
87 64;
42 34;
34 4;
5 67;
93 4;
23 5;
6 43;
47 5;
38 6;
7 55;
14 4;
6 22;
40 14;
35 12;
25 23;
15 15;
23 35];
for i=1:n
% Создание городов.
city.x = cityXY(i, 1);
105

city.y = cityXY(i, 2);
cities = [cities; city];
% Инициализация феромона.
for j=1:n
pheromone(i,j) = initialPheromone;
end;
end;
for i=1:n
% Создание муравьев.
ant = newAnt(i, n);
ants=[ants;ant];
for j=1:n
% Вычисление дистанций между городами.
distance(i,j)=...
hypot(cities(i).x- cities(j).x,...
cities(i).y- cities(j).y);
end;
end;
end
21. Сохранить изменения файла init.m ;
22. В текстовом редакторе среды Matlab создать новый файл и сохранить его под именем newAnt.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
23. В файле newAnt.m поместить заголовок файла-функции:
function ant = newAnt( i, n )
%-------------------------------------------% Функция создает нового муравья.
% i - номер муравья.
% n - количество городов.
% Создание муравья
24. В файле newAnt.m поместить следующий программный код (после
имеющегося кода):
ant.cityIndex = i;
% Список флагов 1-город посещен, 0-не посещен.
ant.tabu = zeros(n, 1);
% Исходная точка в списке табу.
106

ant.tabu(i) = 1;
% Порядок посещения городов.
ant.way = zeros(n, 1);
ant.way(1) = ant.cityIndex;
ant.length = 0;
end
25. Cохранить изменения файла newAnt.m
26. В текстовом редакторе среды Matlab создать новый файл и сохранить его под именем plotCities.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
27. В файле plotCities.m поместить заголовок файла-функции:
function plotCities( cities )
%--------------------------------------------
% Функция выводит на график маркеры,
% обозначающие положение городов,
% подписывает их номера.
28. В файле plotCities.m поместить следующий программный код (после имеющегося кода):
n=length(cities);
hold on;
xlabel('x'); ylabel('y');
for i=1:n
plot(cities(i).x, cities(i).y, 'm O');
text(cities(i).x + 1,...
cities(i).y + 1,...
int2str(i));
end;
end
29. Сохранить изменения файла plotCities.m
30. В текстовом редакторе среды Matlab создать новый файл и сохранить его под именем plotWay.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
31. В файле plotWay.m поместить заголовок файла-функции:
function plotWay(way,cities,colorString,len)
%--------------------------------------------
107

% Функция выводит на график маршрут муравья
% в указанном формате линии.
% way - Порядок прохода городов (маршрут).
% cities - Карта городов.
% colorString - Стиль линии.
% len - Общая длина с маршрутом.
32. В файле plotWay.m поместить следующий программный код (по-
сле имеющегося кода):
n=length(way);
for i=1:n-1
index1 = way(i);
index2 = way(i+1);
x=[cities(index1).x cities(index2).x];
y=[cities(index1).y cities(index2).y];
plot(x, y, colorString);
title(int2str(len));
end;
end
33. Cохранить изменения файла plotWay.m
34. В текстовом редакторе среды Matlab создать новый файл и сохранить его под именем resetAnts.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
35. В файле resetAnts.m поместить заголовок файла-функции:
function [ ants ] = resetAnts( ants )
%--------------------------------------------
% Функция выполняет сброс состояния муравьев
% перед новой итерацией
36. В файле resetAnts.m поместить следующий программный код (после имеющегося кода):
n = length(ants);
for i=1:n
ants(i) = newAnt(i, n);
end;
end
108

37. Cохранить изменения файла resetAnts.m.
38. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем selectCity.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
39. В файле selectCity.m поместить заголовок файла-функции:
function [ newCity ] =...
selectCity( ant,pheromone,distance,a,b,n )
%--------------------------------------------
% Функция осуществляет выбор
% следующего города
40. В файле selectCity.m поместить следующий программный код (по-
сле имеющегося кода):
% Получение вероятностей перехода в каждый
% из городов.
[probabilities cityVariants] = ...
cityProbability(ant,pheromone,distance,a,b,n);
% Выбор города случайным образом согласно
% назначенным вероятностям.
newCity=...
generator(rand(1,1),...
cityVariants,probabilities);
end
41. Cохранить изменения файла selectCity.m.
42. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем shortestWay.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab6;
43. В файле shortestWay.m поместить заголовок файла-функции:
function [way l] = shortestWay(ants)
%--------------------------------------------
% Функция находит кратчайший маршрут
% из пройденных муравьями за итерацию.
109

44. В файле shortestWay.m поместить следующий программный код
(после имеющегося кода):
n = length(ants);
way = ants(1).way;
l = ants(1).length;
for i=2:n
ant = ants(i);
if(l > ant.length)
way = ant.way;
l = ant.length;
end;
end
45. Cохранить изменения файла shortestWay.m.
46. Вычислить значение оптимального маршрута на основе обучаю-
щего графа путем запуска файла-сценария ant_main.m. Для этого в главном окне среды Matlab следует выполнить следующую команду:
>> ant_main
Контрольные вопросы
1. Приведите последовательность команд, необходимую для реализации алгоритма муравья в программной среде Matlab. Поясните назначение каждой приведенной команды.
2. Какие оптимизационные задачи могут быть решены с использова-
нием «роевых» алгоритмов?
3. Приведите последовательность действий при поиске кратчайшего
расстояния при прохождении объектом точек в двумерном пространстве
на основе алгоритма муравья.
4. Что означает понятие «управление подвижным объектом»? Что
такое децентрализованное управление?
5. Назовите основные достоинства и недостатки «роевых» алгорит-
мов оптимизации.
6. Какие критерии оптимальности используются при решении задачи
оптимального управления подвижным объектом?
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
