Сравнение четкой и нечеткой логики

Базовая задача расчета чаевых

Чтобы проиллюстрировать возможности нечеткой логики, рассмотрим как линейный, так и нечеткий подходы к следующей задаче:

Какова справедливая сумма чаевых для вашего официанта?

Во-первых, решим эту задачу обычным способом, записывая команды MATLAB®, которые описывают линейные и кусочно-линейные зависимости. Затем рассмотрим ту же систему, использующую нечеткую логику.

Базовая задача расчета чаевых. Учитывая значение от 0 до 10, которое представляет качество сервиса в ресторане (где 10 превосходно), каковы должны быть чаевые?

Эта задача основана на чаевых, которые обычно практикуются в Соединенных Штатах. В среднем чаевые за еду в США составляют 15%, хотя фактическая сумма может варьироваться в зависимости от качества предоставленной услуги.

Ненечеткий подход

Начнем с самой простой зависимости. Предположим, что чаевые всегда равняются 15% общего счета.

service = 0:.5:10;
tip = 0.15*ones(size(service));
plot(service,tip)
xlabel('Service')
ylabel('Tip')
ylim([0.05 0.25])

Figure contains an axes object. The axes object contains an object of type line.

Это отношение не включает качество сервиса, так что, необходимо добавить термин в уравнение. Поскольку сервис оценивается по шкале от 0 до 10, вы увеличение совета линейно с 5%, если сервис плох к 25%, если сервис превосходен. Теперь отношение похоже на следующий график:

tip = (.20/10)*service+0.05;
plot(service,tip)
xlabel('Service')
ylabel('Tip')
ylim([0.05 0.25])

Figure contains an axes object. The axes object contains an object of type line.

Формула делает то, что вы хотите, чтобы она сделала, напрямую. Тем не менее, вы можете захотеть, чтобы чаевые также отражали качество пищи. Это расширение задачи определяется следующим образом.

Расширенная задача расчета чаевых. Учитывая два значения чисел от 0 до 10 (где 10 превосходно), которые соответственно представляют качество сервиса и качество еды в ресторане, каковы должны быть ваши чаевые?

Смотрите, как формула затронута теперь, когда вы добавили другую переменную.

food = 0:.5:10;
[F,S] = meshgrid(food,service);
tip = (0.20/20).*(S+F)+0.05;
surf(S,F,tip)
xlabel('Service')
ylabel('Food')
zlabel('Tip')

Figure contains an axes object. The axes object contains an object of type surface.

В этом случае результаты выглядят удовлетворительно, но при внимательном рассмотрении, они не кажутся верными. Предположим, что вы хотите, чтобы обслуживание было более важным фактором, чем качество еды. Пусть обслуживание составляет 80% от общего количества чаевых, а еда составляет остальные 20%.

servRatio = 0.8;
tip = servRatio*(0.20/10*S+0.05) + ...
	(1-servRatio)*(0.20/10*F+0.05);
surf(S,F,tip)
xlabel('Service')
ylabel('Food')
zlabel('Tip')

Figure contains an axes object. The axes object contains an object of type surface.

Реакция все еще слишком равномерно линейна. Предположим, что вы хотите получить более плавный ответ в середине, то есть вы хотите дать 15% чаевых в общем случае, но хотите также увеличить вариацию, если услуга исключительно хороша или плоха. Этот фактор, в свою очередь, означает, что предыдущие линейные отображения больше не применяются. Вы все еще можете использовать линейный расчет с кусочно-линейной конструкцией. Теперь вернемся к одномерной проблеме, рассматривая только сервис. Вы можете создать простое условное назначение чаевых с помощью логического индексирования.

tip = zeros(size(service));
tip(service<3) = (0.10/3)*service(service<3)+0.05;
tip(service>=3 & service<7) = 0.15;
tip(service>=7 & service<=10) = ...
	(0.10/3)*(service(service>=7 & service<=10)-7)+0.15;
plot(service,tip)
xlabel('Service')
ylabel('Tip')
ylim([0.05 0.25])

Figure contains an axes object. The axes object contains an object of type line.

Предположим, что вы расширяете этот подход к двум размерностям, где вы вводите качество продуктов снова.

servRatio = 0.8;
tip = zeros(size(S));
tip(S<3) = ((0.10/3)*S(S<3)+0.05)*servRatio + ...
	(1-servRatio)*(0.20/10*F(S<3)+0.05);
tip(S>=3 & S<7) = (0.15)*servRatio + ...
	(1-servRatio)*(0.20/10*F(S>=3 & S<7)+0.05);
tip(S>=7 & S<=10) = ((0.10/3)*(S(S>=7 & S<=10)-7)+0.15)*servRatio + ...
    (1-servRatio)*(0.20/10*F(S>=7 & S<=10)+0.05);
surf(S,F,tip)
xlabel('Service')
ylabel('Food')
zlabel('Tip')

Figure contains an axes object. The axes object contains an object of type surface.

График выглядит хорошим, но функция является достаточно сложной. Некоторым, кто не видел процесс первоначального проекта, даже непонятно как это работает.

Подход нечеткой логики

В общем случае вы хотите получить основы этой проблемы, не принимая во внимание все факторы, которые могли быть произвольными. Если вы составляете список того, что действительно имеет значение в этой проблеме, вы могли закончить со следующими описаниями правила.

Правила задачи о чаевых - фактор обслуживания

  • Если сервис плох, то чаевые малы

  • Если сервис хорош, то чаевые средние

  • Если сервис превосходен, то чаевые щедрые

Порядок, в котором правила представлены здесь, произволен. Это не имеет значения, какие правила на первом месте. Чтобы включать эффект качества продуктов на чаевые, добавьте следующие два правила.

Правила задачи о чаевых - фактор еды

  • Если еда является плохой, то чаевые малы

  • Если еда восхитительна, то чаевые щедрые

Можно объединить два различных списка правил в один список трех правил как так.

Задача о чаевых - совместные факторы обслуживания и еды

  • Если сервис плох, или еда является прогорклой, то чаевые малы

  • Если сервис хорош, то чаевые средние

  • Если сервис превосходен, или еда восхитительна, то чаевые щедрые

Эти три правила являются ядром вашего решения, и они соответствуют правилам для системы нечеткой логики. Когда вы даете математическое значение лингвистическим переменным (что такое средние чаевые, например), у вас есть полная нечеткая система вывода. Методология нечеткой логики должна также рассмотреть:

  • Как все правила объединяются?

  • Как я задаю математически, каковы средние чаевые?

Решение задачи

Следующий график представляет систему нечеткой логики, которая решает задачу расчета чаевых.

gensurf(readfis('tipper'))

Figure contains an axes object. The axes object contains an object of type surface.

Этот график был сгенерирован тремя правилами, которые составляли и сервис и продовольственные факторы.

Наблюдения Рассматривают некоторые наблюдения о примере до сих пор. Вы нашли кусочное линейное отношение, которое решило задачу. Это работало, но это было проблематично, чтобы вывести, и когда вы записали его как код, не было легко интерпретировать. С другой стороны система нечеткой логики основана на некоторых разумных операторах. Кроме того, вы смогли добавить еще два правила в список, который влиял на форму полного выхода, не будучи должен отменить то, что было уже сделано.

Кроме того, при помощи правил нечеткой логики, обслуживание структуры алгоритма разъединяется вдоль довольно чистых линий. Понятие средних чаевых может измениться со дня на день, город в город, страна в страну. Однако базовая логика является тем же самым: если сервис хорош, совет должен быть средним.

Перекалибрование Метода, можно перекалибровать метод быстро путем простого сдвига нечеткого множества, которое задает среднее значение, не переписывая правила нечеткой логики.

Можно переключить списки кусочных линейных функций, но существует большая вероятность для трудной перекалибровки.

В следующем примере кусочная линейная задача расчета чаевых переписана, чтобы сделать его более типовым. Это выполняет ту же функцию как прежде, только теперь константы могут быть легко изменены.

lowTip = 0.05;
averTip = 0.15;
highTip = 0.25;
tipRange = highTip-lowTip;
badService = 0;
okayService = 3; 
goodService = 7;
greatService = 10;
serviceRange = greatService-badService;
badFood = 0;
greatFood = 10;
foodRange = greatFood-badFood;

% If service is poor or food is rancid, tip is cheap
if service<okayService
    tip = (((averTip-lowTip)/(okayService-badService)) ...
        *service+lowTip)*servRatio + ...
        (1-servRatio)*(tipRange/foodRange*food+lowTip);

% If service is good, tip is average
elseif service<goodService
    tip = averTip*servRatio + (1-servRatio)* ...
        (tipRange/foodRange*food+lowTip);

% If service is excellent or food is delicious, tip is generous
else
    tip = (((highTip-averTip)/ ...
        (greatService-goodService))* ...
        (service-goodService)+averTip)*servRatio + ...
        (1-servRatio)*(tipRange/foodRange*food+lowTip);
end

Как со всем кодом, чем больше общности, которая введена, тем менее точным алгоритм становится. Можно улучшить ясность путем добавления большего количества комментариев, или возможно перезаписи алгоритма немного большим количеством самоочевидных способов. Но, кусочная линейная методология не является оптимальным способом решить этот вопрос.

Если вы удаляете все из алгоритма за исключением трех комментариев, что остается, точно правила нечеткой логики, которые что вы ранее записали.

  • Если сервис плох, или еда является прогорклой, совет является дешевым

  • Если сервис хорош, совет является средним

  • Если сервис превосходен, или еда восхитительна, совет щедр

Нечеткая логика использует язык, который ясен вам, и это также имеет значение к компьютеру, который является, почему это - успешный метод для того, чтобы устранить разрыв между людьми и машинами.

Путем создания уравнений максимально простыми (линейный) вы делаете вещи более простыми для машины, но более сложными для вас. Однако ограничение больше не является компьютером - это - ваша умственная модель того, что делает компьютер. Нечеткая логика позволяет машине работать с вашими настройками, а не наоборот.

Похожие темы