Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы оптимизации в радиотехнических системах. Практикум

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]