Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 442; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.10 (0.007 с.) |