Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Приклади нечіткого управлінняСодержание книги
Поиск на нашем сайте
С. 217 2.7.1. Керування зарядкою акумуляторної батареї за допомогою нечіткої логіки [Джонс М.Т. Программирование искусственного интеллекта в приложениях. – М.: ДМК Пресс, 2004. – 312 с. (с.216-224)]
Управління зарядом батареї. Акумуляторна батарея використовує джерело заряду від сонячних батарей і розряджається на навантаження. Напруга джерела заряду дозволяє заряджати батарею, у той час як навантаження розряджає її. Батарея має два режими заряда: 1. У режимі підзарядки струм батареї невеликий, і це приводить до ії неповної зарядки. 2. У режимі швидкої зарядки струм батареї найбільший. Стан батареї відслідковують два датчики: датчик напруги і датчик температури. При зарядці температура батареї підвищується. Якщо батарея нагрівається, то можна вважати, що вона цілком заряджена і треба перейти на менший струм – з режиму швидкої зарядки в режим підзарядки. Крім того, можна вимірювати напругу батареї, щоб визначити, чи досягло воно межі, і потім переключитися в режим підзарядки. Якщо батарея не нагрілася і не досягла межі по напрузі, то варто перейти в режим швидкої зарядки. Для керування зарядкою можна використовувати такі правила нечіткої логіки: if m_voltage_high (voltage) then mode = trickle_charge if m_temperature_hot (temperature) then mode = trickle_charge if ((not (m_voltage_high (voltage))) AND (not (m_temperature_hot (temperature)))) then mode = fast_charge Завдання полягає в тім, щоб створити функції належності і використати правила нечіткої логіки.
С. 217 Функції належності при зарядці батареї за допомогою нечіткої логіки. У даному випадку задані два змінні: напруга і температура. Графік функції належності для напруга і температури описують по три терми: для напруги - низьке, середнє і високе (рис. 9.5); для температури – холодно, тепло і гаряче (рис. 9.6). Функції належності для напруги Розроблювачі програмного забезпечення звичайно використовують два елементи нечіткої логіки: оператори нечіткої логіки і функції належності. Оператори нечіткої логіки являють собою функції AND, OR і NOT, модифіковані для нечіткої логіки (листинг 9.1). Листинг 9.1. Оператори нечіткої логіки #define MAX(a,b) ((а>b)? а: b) #define MIN(a,b) ((a<b)? a: b) fuzzyType fuzzyAnd(fuzzyType a, fuzzyType b) { return MAX(a.b); } fuzzyType fuzzyOr(fuzzyType a, fuzzyType b) { return MIN(a.b); } fuzzyType fuzzyNot(fuzzyType a) { return(1.0 - a); } Листинг 9.2. Функції, що використовуються для створення функцій належності fuzzyType spikeProfile(float value, float lo, float high) { float peak; value += (-1о); if ((lo < 0) && (high < 0)) { high = -(high - lo); } else if (lo < 0) && (high > 0)) { high += -lo; } else if (lo > 0) && (high > 0)) { high -= lo; } peak = (high / 2.0); lo = 0.0; if (value < peak) { return (value / peak); } else if (value > peak) { return ((high-value) / peak); } return 1.0; } fuzzyType plateauProf ile (float value, float lo, float lo_plat, float hi_plat, float hi) { float upslope; float downslope; value += (-lo);
if (lo < 0.0) { lo_plat += -lo; hi_plat += -lo; hi += -lo; lo = 0; lo_plat -= lo; hi_plat -= lo; hi -= lo; lo = 0; } upslope = (1.0 / (lo_plat - lo)); downslope = (1.0 / (hi - hi_plat));
if (value < lo) return 0.0; else if (value > hi) return 0.0; else if ((value >= lo_plat) && (value <= hi_plat)) return 1.0; else if (value < lo_plat) return ((value-lo) * upslope); else if (value > hi_plat) return ((hi-value) * downslope); return 0.0; } Перша функція, spikeProfile, задає функцію належності у вигляді трикутника. Розроблювач указує значення lo і hi, що визначають базові вершини трикутника. Вища точка задається як hi/2. Друга функція, plateauProfile, задає функцію належності у формі трапеції. За допомогою функції plateauProfile додатково створюються ті функції належності, що поширюються до границь (наприклад, функції холодно і жарко на рис. 9.6).
Функції належності для моделі зарядного пристрою. Листинг 9.3. Функції належності для напруги fuzzyType m_voltage_low(float voltage) { const float lo = 5.0; const float lo_plat = 5.0; const float hi_plat = 5.0; const float hi = 10.0; if (voltage < lo) return 1.0; if (voltage > hi) return 0.0; return plateauProfile(voltage, lo, lo_plat, hi_plat, hi); } fuzzyType m_voltage_medium(float voltage) { const float lo = 5.0; const float lo_plat = 10.0; const float hi_plat = 20.0,- const float hi = 25.0; if (voltage < lo) return 0.0; if (voltage > hi) return 0.0; return plateauProfile(voltage, lo, lo_plat, hi_plat, hi); Ї fuzzyType m_voltage_high (float voltage) { const float lo = 25.0; const float lo_plat = 30.0; const float hi_plat = 30.0; const float hi = 30.0; if (voltage < lo) return 0.0; if (voltage > hi) return 1.0; return plateauProf ile (voltage, lo, lo_plat, hi_plat, hi); } Усі функції належності в листингу 9.3 використовують функцію plateau-Profile, щоб побудувати графік. Кожна з них приймає значення напруги і потім повертає значення, що відповідає її ступені належності. Кожна функція спочатку перевіряє передане значення на відповідність діапазонові функції належності. Якщо значення не виходить за межі діапазону, воно передається у функцію plateauProf ile. При цьому її сигнатура задається як вектор [lo, lo_plat, hi_plat, hi], а потім користувачеві повертається результат. Функції належності, описані в листингу 9.3, зображені на рис. 9.5. У листингу 9.4 представлені функції належності для температури батареї. С. 222 Листинг 9.4. Функції належності для температури батареї. fuzzyType m_temp_cold(float temp) { const float lo = 15.0; const float lo_plat = 15.0; const float hi_plat = 15.0; const float hi = 25.0,' if (temp < lo) return 1.0; if (temp > hi) return 0.0; return plateauProf ile (temp, lo, lo_plat, hi_plat, hi); } fuzzyType m_voltage_low(float voltage) { const float lo = 5.0; const float lo_plat = 5.0; const float hi_plat = 5.0; const float hi = 10.0; if (voltage < lo) return 1.0; if (voltage > hi) return 0.0; return plateauProfile(voltage, lo, lo_plat, hi_plat, hi); } fuzzyType m_voltage_medium(float voltage) { const float lo = 5.0; const float lo_plat = 10.0; const float hi_plat = 20.0; const float hi = 25.0; if (voltage < lo) return 0.0; if (voltage > hi) return 0.0; return plateauProfile (voltage, lo, lo_plat, hi_plat, hi); }
c. 223 Функція chargeControl, що керує процесом зарядки батареї Листинг 9.5. Функція, що керує зарядкою батареї void chargeControl () { static unsigned int і = 0; extern float voltage, temperature; if ((i++ % 10) = = 0) { if (normalize (m_voltage_high(voltage))) { chargeMode = TRICKLE_CHARGE; * timer = 0.0; } else if (normalize(m_temp_hot (temperature))) { chargeMode = TRICKLE_CHARGE; *timer = 0.0; } else if (normalize ( fuzzyAnd( fuzzyNot (m_voltage_high (voltage)), fuzzyNot (m_temp_hot (temperature))))){ chargeMode = FAST_CHARGE; *timer =0.0; } } } Використовуючі правила нечіткої логіки і функції належності, функція chargeControl () в залежності від значень напруги і температури змінює режим зарядки батареї.
Головний цикл моделі. Головний цикл керує процесом зарядки батареї, викоритстовуючі на заданих параметрах напруги і температури (листинг 9.6). Листинг 9.6. Головний цикл int main() int i; extern float timer; extern int simulate(void); extern void chargeControl(float *); extern float voltage; extern float temperature; extern int chargeMode; for (і = 0; і < 3000; і++) { simulate (); chargeControl(&timer); timer += 1.0; printf("%d, %f, %f, %d\n", i, voltage, temperature, chargeMode ) return 0; } Програма викликає процес зарядки/розрядки батареї, а потім дозволяє функції керування зарядкою установити потрібний режим для зарядного пристрою. Приклад виконання коду представлений на рис. 9.7. Цей графік показує напругу, температуру і режим зарядки. Наявність вхідної напруги зарядного пристрою визначається при влученні 50% сонячного світла на сонячні батареї. Рис. 9.7. Зміна кривих при моделюванні керування зарядкою батареї
2.7.2. Приклад керування виходом даних по каналу зв´язку
Базова (універсальна) безперервна множина U=60 … 140 (швидкість передачі пакетів даних по каналу зв´язку по відношенню до проектного номінального значення 100) замінюється вектором U={u1, u2} з нечіткими базовими елементами uі та відповідною лінгвістичною змінною L={L1, L2}, де (u1 = 60…100) à(L1 = “Низька“); (u2 = 100…140) à(L2 = “Висока“). Функції належності µі(u) базових елементів-субмножин uі до термів Lі наведені на рис.2.8.
Дві отримані логічні функції належності µ1(u) та µ2(u) використовуються для визначення закону керування каналом UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆, де uСТАРЕ – поточна кількість пакетів передачі даних; UНОВЕ – нове поточне значення кількості пакетів передачі даних, яке дозволяється пропустити через канал; ∆ - постійний коефіцієнт, який визначає максимальну кількість пакетів, яка може бути доданою або вилученою з передачі даних. Припустимо, що автоматизується канал, який повинен в одиницю часу передавати 100 пакетів сигналів при ∆ = 10. Якщо отримана знижена поточна швидкість передачі пакетів даних uСТАРЕ = 90, то при µ1(u)=0,5, µ2(u)=0 програма дасть дозвіл на підвищення швидкості передачі пакетів даних до UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆ = 90 + (0,5-0) ∙10= 95. Якщо при наступній ітерації програма буде продовжувати працювати зі швидкістю передачі даних uСТАРЕ=95, то при µ1(u)=0,25, µ2(u)=0 програма дасть дозвіл на підвищення швидкості передачі пакетів даних до буде отриманий наступний результат UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆ = 95 + (0,25-0) ∙10= 97,5. Якщо отримана підвищена поточна швидкість передачі пакетів даних uСТАРЕ = 110, то при даних ∆ = 10, µ1(u)=0, µ2(u)=0,5 програма дасть дозвіл на зниження швидкості передачі пакетів даних до UНОВЕ = uСТАРЕ+ (µ1(u)- µ2(u))∙∆ = 110 + (0-0,5) ∙10= 105. Процес буде продовжуватись, доки не буде отримане значення UНОВЕ = 100. Таким чином, за рахунок використання функції належності, отримано простий алгоритм керування.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-06-24; просмотров: 347; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.12.236 (0.009 с.) |