В этом примере показано, как настроить систему нечеткого вывода (FIS) с помощью пользовательской функции затрат. Для примера требуется программное обеспечение Global Optimization Toolbox™.
В этом примере для изучения навигации роботов в среде моделирования используется пользовательская функция затрат. Целью задачи навигации является достижение заданной цели, избегая при этом препятствий. Направление к цели представлено в виде единичного вектора силы (), направленного от робота к местоположению цели. Направление устранения препятствия представлено единичным вектором силы (), направленным к роботу из ближайшего места препятствия.

Робот, цель и препятствие показаны в виде кругов с радиусом 0,5 м в среде моделирования 25 м x 25 м. Навигационная задача состоит в том, чтобы объединить векторы силы таким образом, чтобы направление результирующего вектора силы обеспечивало для робота направление без столкновения.
Ft→, 0≤w≤1
В этом примере предполагается, что для моделирования используется робот с дифференциальной кинематикой. Другими словами, робот может вращаться по центру без каких-либо ограничений. Однако, чтобы избежать резких поворотов, изменение за шаг времени в направлении робота ограничено ]. Таким образом, если текущее направление курса робота равно (то следующее направление курса вычисляется следующим образом:
k), § 4), -security4).
Вес вектора силы вычисляется с использованием функции :
startt, o)
где
dodt - отношение расстояния между роботом и препятствием do) и расстояния между роботом и целью dt);
o - абсолютная разница между направлениями цели и препятствия относительно робота
Для выполнения задачи навигации функция должна генерировать высокие значения w, т.е. сосредоточиться на устранении препятствия, когда:
И направление цели, и направление препятствия от робота одинаковы o низко )
Препятствие ближе к роботу, чем цель ( низко).
В противном случае должен генерировать низкие значения w, то есть сосредоточиться на достижении цели.
Целью этого примера является разработка FIS, который изучает нечеткие правила и оптимизирует параметры FIS для моделирования функции для навигации роботов без столкновений в среде моделирования.
Предположения
Для моделирования робота применяются следующие допущения:
Робот может идеально локализоваться в среде моделирования; то есть робот знает свое текущее положение в среде моделирования.
Робот оснащен идеальными датчиками для идентификации препятствия и определения его местоположения.
У робота нет динамических ограничений; то есть робот может вращаться и двигаться, как предписано, без каких-либо механических ограничений. Во избежание резких поворотов на вращение накладывается мягкое ограничение, которое ограничивает изменение за шаг времени в курсе робота ].
Робот бежит с фиксированной скоростью. Можно включить дополнительные нечеткие системы для управления скоростью робота. Для простоты в этом примере используется фиксированная скорость для робота.
Для моделирования функции создайте FIS, как показано на следующем рисунке. Для этого примера используйте FIS Mamdani.

fisin = mamfis;
Добавьте следующие два входа, как показано на предыдущем рисунке.
- Отношение расстояний, робот к препятствию/робот к цели
o - Разница между целевыми направлениями и направлениями препятствий
Установите диапазон первого входа в [0,2], что указывает на то, что способствует предотвращению препятствий, когда расстояние препятствия меньше или равно удвоенному целевому расстоянию.
Установите диапазон второго входа в [0,pi/2], что указывает на то, что o способствует устранению препятствий, когда разница между целевыми направлениями и направлениями препятствий меньше или равна pi/2.
fisin = addInput(fisin,[0 2],'Name','alpha'); fisin = addInput(fisin,[0 pi/2],'Name','theta_t_o');
Чтобы минимизировать количество правил, которое соответствует количеству комбинаций входных функций членства, добавьте две функции членства (MF) к каждому входу. Чтобы создать аналогичные значения членства за пределами входных диапазонов, используйте zmf (Z-образная функция членства в кривой) и smf (S-образная функция членства в кривой) MF. Процесс настройки оптимизирует входные значения параметров MF.
Добавление функций членства к первому входу.
fisin = addMF(fisin,'alpha','zmf',[0 2],'Name','low'); fisin = addMF(fisin,'alpha','smf',[0 2],'Name','high');
Добавьте функции членства ко второму входу.
fisin = addMF(fisin,'theta_t_o','zmf',[0 pi/2],'Name','low'); fisin = addMF(fisin,'theta_t_o','smf',[0 pi/2],'Name','high');
Добавление выходных данных к FIS или весу вектора силы препятствия с ограничением значений веса диапазоном [0,1].
fisin = addOutput(fisin,[0 1],'Name','w');
Добавьте к выходу два MF. В выходные данные можно добавить дополнительные MF для более точной детализации выходных значений. Однако это увеличивает количество параметров настройки. Выходные MF также используют zmf и smf для создания аналогичных значений членства за пределами входных диапазонов. Процесс настройки оптимизирует выходные значения параметров MF.
fisin = addMF(fisin,'w','zmf',[0 1],'Name','low'); fisin = addMF(fisin,'w','smf',[0 1],'Name','high');
Просмотрите структуру FIS. Изначально FIS имеет нулевые правила. Процесс настройки находит правила для нечеткой системы.
figure plotfis(fisin)

Поскольку данные обучения для этого примера отсутствуют, можно смоделировать навигацию робота с помощью пользовательской функции затрат. Процесс настройки использует эту пользовательскую функцию затрат при оптимизации параметров FIS.
Для оптимизации параметров получите настройки параметров из FIS.
[in,out] = getTunableSettings(fisin);
Далее создайте параметры настройки с помощью OptimizationType установить в значение learning. В этом примере используется генетический алгоритм (ga) метод оптимизации для процесса настройки. Чтобы повысить скорость процесса настройки, установите UseParallel опция для true, для чего требуется программное обеспечение Parallel Computing Toolbox™. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите UseParallel кому false.
options = tunefisOptions('Method','ga','OptimizationType','learning');
Установите размер популяции генетического алгоритма равным 200. Больший размер населения увеличивает вероятность получения лучшего решения в меньшем количестве поколений.
options.MethodOptions.PopulationSize = 200;
Установите максимальное количество поколений равным 25. Для дальнейшей настройки параметров можно задать большее количество поколений. Однако это увеличивает продолжительность процесса настройки и может перестраивать значения параметров.
options.MethodOptions.MaxGenerations = 25;
Задайте местоположение препятствия, цели и робота для учебных сред. Установить начальный курс робота на pi/2 для среды обучения. Чтобы научиться навигации как с предотвращением препятствий, так и без него на пути к целевому местоположению, используйте два учебных задания с различными расположениями препятствий.
trnObstacle = [3 12;13 18]; trnTarget = [13 22;13 22]; trnRobot = [13 2 pi/2;13 2 pi/2;]; showSimulationEnvironmentsForTraining(trnObstacle,trnTarget,trnRobot)

Укажите пользовательскую функцию затрат с помощью дескриптора функции.
costFunction = @(fis)navigationCostFcn(fis,trnObstacle,trnTarget,trnRobot);
В функции затрат навигация робота моделируется в учебных средах с использованием каждого FIS от населения. Каждая задача навигации выполняется для 100 итераций, где каждая итерация эквивалентна циклу принятия решения длиной 1. Робот использует фиксированную скорость 0,5 м/с на протяжении всего задания навигации. Дополнительные сведения о моделировании см. в разделе getNavigationResults функция.
function cost = navigationCostFcn(fis,obstacle,target,robot)
cost = 0;
for i = 1:size(obstacle,1)
results = getNavigationResults(fis,obstacle(i,:),target(i,:),robot(i,:));
cost = cost + getNavigationCost(results);
end
end
Стоимость каждой задачи навигации - это общее расстояние, пройденное роботом. Если робот не достигает цели или сталкивается с препятствием, для моделирования назначается высокая стоимость (200).
function cost = getNavigationCost(results)
if results.notSafe || ~results.reachedTarget
cost = 200;
else
cost = results.travelledDistance;
end
end
Поскольку оптимизация генетического алгоритма использует случайный поиск, для получения воспроизводимых результатов инициализируйте генератор случайных чисел в его конфигурацию по умолчанию.
rng('default')Правила обучения с использованием tunefis функция занимает приблизительно 10 минут. В этом примере включите настройку с помощью параметра runtunefis кому true. Загрузка предварительно подготовленных результатов без выполнения tunefis, можно установить runtunefis кому false.
runtunefis = false;
Настройка FIS с использованием указанных учебных сред и параметров настройки.
if runtunefis fisout = tunefis(fisin,[in;out],costFunction,options); %#ok<UNRCH> else tunedfis = load('tunedfisnavigation.mat'); fisout = tunedfis.fisout; end
Настроенная FIS производит следующие траектории роботов в средах моделирования.
showNavigationTrajectories(fisout,trnObstacle,trnTarget,trnRobot)

В первом случае робот достигает цели с минимальным расстоянием, поскольку препятствие не находится на пути к цели. Во втором случае робот успешно избегает препятствия и достигает цели.
Просмотр структуры настроенной FIS, fisout.
figure plotfis(fisout)

Процесс настройки создает набор новых правил для FIS.
fisout.Rules
ans =
1x5 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
____________________________________________
1 "alpha==low & theta_t_o==high => w=low (1)"
2 "alpha==low & theta_t_o==low => w=high (1)"
3 "theta_t_o==high => w=low (1)"
4 "alpha==high & theta_t_o==high => w=low (1)"
5 "alpha==low => w=low (1)"
Правила описаны следующим образом в отношении ожидаемого поведения :
Правило 1 соответствует ожидаемому поведению . Когда препятствие не расположено перед роботом на пути к цели (o высоко) и препятствие близко α низко), это правило выдает низкие значения веса.
Правило 4 также согласуется с ожидаемым поведением . Когда препятствие не расположено перед роботом на пути к цели (o является высоким) и препятствие находится дальше α является высоким), это правило производит низкие значения веса.
Правило 3 генерирует значения низкого веса, когда препятствие не расположено перед роботом (, o является высоким), независимо от расстояния препятствия. Это правило охватывает как правило 1, так и правило 4. Поэтому правила 1 и 4 являются избыточными и могут быть удалены.
Правило 2 также согласуется с ожидаемым поведением . Когда препятствие близко к роботу ( находится на низком уровне) и расположено перед роботом на пути к цели (
Правило 5 генерирует значения низкого веса, когда расстояние препятствия является низким. Это правило противоречит правилу 2 в случае, когда (o) является низким. В этом случае выход правила 5 не способствует окончательному выходу из-за высоких выходных значений правила 2. Поэтому правило 5 также может быть удалено.
Удалите избыточные правила.
fisoutpruned = fisout; fisoutpruned.Rules([1 4 5]) = []; fisoutpruned.Rules
ans =
1x2 fisrule array with properties:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
___________________________________________
1 "alpha==low & theta_t_o==low => w=high (1)"
2 "theta_t_o==high => w=low (1)"
fisout и fisoutpruned создание аналогичных управляющих поверхностей. Поэтому для предотвращения препятствий в среде моделирования необходимы только два правила.
figure subplot(1,2,1) gensurf(fisout) title('Output surface of fisout') subplot(1,2,2) gensurf(fisoutpruned) title('Output surface of fisoutpruned')

Проверка производительности настроенной FIS с различными позициями препятствия, робота и цели. В следующих случаях проверки робот успешно устраняет препятствие для достижения целевого положения с помощью настроенной FIS.
vldObstacle = [13 5;10 10;8 8]; vldRobot = [5 12 0;5 20 -pi/2;19 19 -pi]; vldTarget = [23 12;15 4;5 5]; showNavigationTrajectories(fisoutpruned,vldObstacle,vldTarget,vldRobot)

В этом примере используется пользовательская функция затрат, которая моделирует навигацию роботов в различных учебных средах для изучения нечетких правил и оптимизации значений параметров FIS для навигации без столкновений. Можно включить дополнительные учебные среды, чтобы научиться избегать препятствий в других сценариях, например узкий коридор и U-образные препятствия. В этих сценариях роботу могут потребоваться дополнительные подзадачи навигации, такие как следование за стеной и достижение подзадачи (промежуточного ориентира), для успешной навигации к цели без столкновений. Сложные среды также требуют дополнительных условий в расчете затрат на безопасную навигацию. Например, в узком коридоре робот должен оставаться посередине; то есть расстояния до препятствий слева и справа должны быть одинаковыми.
Использование пользовательской функции затрат с tunefis обеспечивает гибкость моделирования пользовательской системы с пользовательским расчетом затрат. Однако компромисс является длительным процессом настройки из-за количества необходимых симуляций (для каждого набора оптимизированных значений параметров). Поэтому, по возможности, для ускорения процесса настройки используйте данные обучения. Например, процесс настройки в этом примере выполнялся бы быстрее, если бы для настройки FIS были доступны данные входного/выходного решения оператора человека.
function showSimulationEnvironment(obstacle,target,robot,navigationResults) % Show the robot trajectory in the simulation environment. % Radius of the robot, target, and obstacle. radius = 1; % 1m % Use 25mx25m simulation environment. axis([0 25 0 25]); % Set equal aspect ratio. pbaspect([1 1 1]) % Temporary plots to enable legends. hold on plot(robot(1),robot(2)+radius,'ob','LineWidth',radius*1,'MarkerFaceColor','b') plot(robot(1),robot(2)+radius,'or','LineWidth',radius*1,'MarkerFaceColor','r') plot(robot(1),robot(2)+radius,'og','LineWidth',radius*1,'MarkerFaceColor','g') hold off % Draw obstacle. rectangle('Position',[obstacle(1)-0.5*radius obstacle(2)+0.5*radius radius radius], ... 'Curvature',[1 1],'FaceColor','b','EdgeColor','b') % Draw target. rectangle('Position',[target(1)-0.5*radius target(2)+0.5*radius radius radius], ... 'Curvature',[1 1],'FaceColor','r','EdgeColor','r') % Draw robot. rectangle('Position',[robot(1)-0.5*radius robot(2)+0.5*radius radius radius], ... 'Curvature',[1 1],'FaceColor','g','EdgeColor','g') % Add labels, title, and legends. xlabel('x (m)'),ylabel('y (m)') title('Simulation Environment for Robot Navigation') legend(["Obstacle" "Target" "Robot"]) % Plot the robot trajectory if specified. if nargin == 4 x = navigationResults.x; y = navigationResults.y; for i = 1:numel(x) rectangle('Position',[x(i)-0.5*radius y(i)+0.5*radius radius radius], ... 'Curvature',[1 1],'FaceColor','g','EdgeColor','g') end end end function showSimulationEnvironmentsForTraining(obstacle,target,robot) % Show simulation environments for training. drawEnvironmentAndShowTrajectory(obstacle,target,robot,'Training Task') end function showNavigationTrajectories(fis,obstacle,target,robot) % Show robot trajectories in the simulation environments. drawEnvironmentAndShowTrajectory(obstacle,target,robot,'Navigation Task',fis) end function drawEnvironmentAndShowTrajectory(obstacle,target,robot,plotTitle,varargin) % Expand figure horizontally to tile the simulation environments. h = figure; h.Position = [h.Position(1:2) 3*h.Position(3) h.Position(4)]; numTasks = size(target,1); % Draw each simulation environment. for i = 1:numTasks o = obstacle(i,:); t = target(i,:); r = robot(i,:); subplot(1,numTasks,i) if ~isempty(varargin) results = getNavigationResults(varargin{1},o,t,r); showSimulationEnvironment(o,t,r,results) else showSimulationEnvironment(o,t,r) end title([plotTitle ': ' num2str(i)]) end end
getTunableSettings | mamfis | tunefis