Нечеткий по сравнению с ненечеткой логикой

Основная проблема добавления подсказки

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

Что правильная сумма должна снабдить подсказкой ваш waitperson?

Во-первых, работайте через эту проблему обычный (ненечеткий) путь, пишущий команды 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])

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

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

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

Расширенная проблема Добавления подсказки. Учитывая два набора чисел от 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')

В этом случае результаты выглядят удовлетворительными, но когда вы смотрите на них тесно, они не кажутся правильным. Предположим, что вы хотите сервис быть более важным фактором, чем качество продуктов. Укажите, что сервисные учетные записи для 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')

Ответ - все еще некоторые как слишком однородно линейный. Предположим, что вы хотите больше плоского ответа в середине, то есть, вы хотите дать 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])

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

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')

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

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

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

Добавление подсказки проблемных правил - сервисный фактор

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

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

  • Если сервис превосходен, то снабдите подсказкой, щедро

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

Добавление подсказки проблемных правил - продовольственный фактор

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

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

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

Добавление подсказки проблемных правил - и сервисные и продовольственные факторы

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

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

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

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

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

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

Проблемное решение

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

gensurf(readfis('tipper'))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Похожие темы