БИБЛИОТЕКА PYTHON ДЛЯ СИНТЕЗА ИНТЕЛЛЕКТУАЛЬНЫХ СИСТЕМ УПРАВЛЕНИЯ
- Выпуск: Том 19, № 2 (2018)
- Страницы: 177-189
- Раздел: Информатика, вычислительная техника и управление
- URL: https://journals.rudn.ru/engineering-researches/article/view/18914
- DOI: https://doi.org/10.22363/2312-8143-2018-19-2-177-189
Цитировать
Полный текст
Аннотация
Статья посвящена описанию библиотеки программ на языке Python для решения задач синтеза систем управления методами символьной регрессии. Задача синтеза становится все более актуальной, приобретая особое значение ввиду стремительного развития робототехники. Как правило, инженеры и просто практики используют регуляторы шаблонного типа при моделировании, а затем подбирают под них параметры. В условиях, когда вычислительная мощность персональных компьютеров достигла своего апогея, а языки программирования стали чрезвычайно выразительны за счет высокого уровня абстрактности и обширности библиотек, целесообразнее реализовать синтез в виде пакета. В качестве языка для реализации синтеза был выбран Python. По мнению авторов статьи, Python является удобным языком для программирования матричных и векторных вычислений благодаря пакету numpy. Более того, доля проектов, написанных на Python, в веб-сервисе для хостинга Github за последнее время неизменно растет, что говорит о поддержке языка со стороны сообщества разработчиков. В данной статье представлено описание применения библиотеки для решения задачи синтеза управления. Приведено описание метода символьной регрессии, метода сетевого оператора и алгоритмов поиска оптимального решения с использованием принципа малых вариаций базисного решения. Рассмотрен пример использования библиотеки для решения задачи синтеза управления мобильным роботом, движущимся на плоскости, в условиях препятствий.
Полный текст
ВВЕДЕНИЕ Применение методов символьной регрессии для решения задачи синтеза управления в последнее время становится наиболее популярным из-за быстрого развития вычислительной техники. Для применения методов символьной регрессии необходимо создание специального программного обеспечения, которое должно включать функции кодирования и декодирования математических выражений тем или иным методом символьной регрессии, эволюционные алгоритмы поиска оптимального решения, функции для моделирования объекта управления и др. Несмотря на то, что разработанные программные продукты для решения задачи синтеза системы управления методом символьной регрессии создаются уже в течение последних десяти лет, универсальная библиотека, которая могла бы быть использована широким кругом пользователей, до сих пор отсутствует. Язык программирования Python в настоящий момент имеет исключительную популярность и причисляется к языкам искусственного интеллекта или приравнивается к математическим пакетам. Скорее всего, это вызвано не особой лексикой языка или дополнительными операторами, или типам данных, а наличием большого количества библиотек, практически по всем актуальным вычислительным направлениям. Особую популярность приобрел Python у специалистов в области искусственных нейронных сетей. Процесс обучения искусственной нейронной сети методом обратного распространения ошибки доведен в библиотеках Python до утилитарного состояния, когда пользователь уже может использовать искусственную нейронную сеть для решения своих задач, особо не вникая в технологию обучения и теорию искусственных нейронных сетей. Приблизительно так же мы используем функции математических пакетов типа MatLab, например, при вычислении корней полиномов или решения систем дифференциальных уравнений. Одной из целей создания библиотеки Python является расширение круга пользователей, особенно прикладников, занимающихся разработкой систем автоматического управления сложными объектами или, в частности, робототехническими устройствами. ЗАДАЧА СИНТЕЗА УПРАВЛЕНИЯ Задача синтеза представляет собой задачу, решение которой в общем случае должно привести к нахождению математического выражения, описывающего функционирование системы управления. Заметим, что системы искусственного интеллекта - это системы управления некоторыми объектами. В этом случае задача синтеза управления является общей задачей, при решении которой иногда требуется создание систем искусственного интеллекта. В задаче синтеза управления [1] предполагается, что известна математическая модель объекта управления. В общем случае модель объекта управления описывается системой обыкновенных дифференциальных уравнений ẋ = f(x, u), (1) где x - вектор состояния объекта управления; u - вектор управления; x = [x1…xn]T, u = [u1…um]T; m £ n. Компоненты вектора управления ограничены u i i - £ ui £ u +, i = 1, m, (2) - + где ui , ui · заданные величины; i = 1, m. Для системы (1) задана область начальных значений x(0) = x0 Î X0. (3) Заданы терминальные условия как цель управления φi(x(tf)) = 0, i = 1, r, r £ n, (4) где tf - время окончания процесса управления, может быть строго заданным или в общем случае ограниченным и определяемым в процессе решения задачи, например, по достижении терминального многообразия (4) = ⎨ ⎧⎪t, если || j(x(t)) || £ e и t < t + t , f ⎪⎩t + - иначе (5) где t+ - предельное время процесса управления; ε - малая положительная величина; φ(x(t)) = [φ1(x(t))…φr(x(t))]T, r || j(x(t)) || = j2 (x(t)). å i i =1 Задан критерий качества управления t f J = F (x(t f )) + ò f0 (x(t), u(t))dt ® min. 0 (6) Необходимо найти управление в виде функции от координат пространства состояний u = h(x). (7) Функция (7) удовлетворяет ограничениям (2) и обеспечивает нахождение такого управления, при котором любое частное решение системы (1) с функцией (7) в правой части вместо вектора управления с начальными условиями из области (3) достигает терминального многообразия за допустимое время (5) с оптимальным значением критерия качества (6). МЕТОД СЕТЕВОГО ОПЕРАТОРА Метод сетевого оператора разработан в 2006 г. профессором А.И. Дивеевым специально для решения задачи синтеза управления [2; 3]. Метод использует кодирование математического выражения в виде ориентированного графа, который представляется в компьютере целочисленной матрицей сетевого оператора. Например, математическое выражение 2 2 y = ln(q1)x1 + q2x2 с набором элементарных функций ρ1(z) = z, ρ2(z) = z2, ρ3(z) = ln(z), χ1(z1, z2) = = z1 + z2, χ2(z1, z2) = z1z2 кодируется целочисленной матрицей следующего вида: 0 0 0 2 0 0 0 0 3 0 0 0 0 0 2 0 0 0 0 1 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 ⎡0 0⎤ ⎢0 0⎥ ⎢ ⎥ ⎢0 0⎥ Y= ⎢0 0⎥ (8) ⎢ ⎥ ⎢0 1⎥ ⎢ ⎥ ⎢0 1⎥ ⎢0 1⎥ ⎣ ⎦ и графом, представленным на рис. 1. 1 x1 2 5 2 1 2 q1 3 7 1 3 x2 2 6 1 2 4 q2 1 Рис. 1. Граф сетевого оператора [Fig. 1. Network operator graph] На рисунке 1 рядом с узлами размещены их номера, которые соответствуют номерам строк матрицы сетевого оператора. Недостатком матрицы сетевого оператора является большое количество не используемых при вычислении ее элементов. В любой матрице сетевого оператора всегда рассматриваются только наддиагональные элементы, а из них в вычислении участвуют только не нулевые элементы. Для более экономного представления графа сетевого оператора в памяти компьютера используем упорядоченные множества, которые на языке Python описываются встроенным типом list [4]. Сетевой оператор на основе списков представляется в следующем виде: R = (G1, …, GM), (9) где Gi - список операндов бинарной операции в узле i + N0; N0 - количество узлов источников в графе сетевого оператора. Список операндов представляет собой множество упорядоченных пар чисел i i i i Gi = ((α1, β1), …, (αK , βK ), (i + N0, ψi + N , i + N )), (10) i i 0 0 i i i где αj - номер узла, из которого выходит дуга, входящая в узел i + N0; βj - номер унарной операции, связанной с дугой, соединяющей узел αj и i + N0; ψi + N0, i + N0 - номер бинарной операции, связанной с узлом i + N0, или диагональный элемент матрицы сетевого оператора, находящийся в строке i + N0. Заметим, что по правилам построения сетевого оператора все бинарные операции являются коммутативными и ассоциативными, поэтому они могут иметь более двух операндов и выполнять операции над ними в любой последовательности. Определение 1. Представление сетевого оператора в виде вложенных списков называем реестром (register) сетевого оператора. Рассмотрим граф математического выражения, приведенный на рис. 1. На графе имеем четыре узла источника, N0 = 4. Рассмотрим узел 5 = N0 + 1. В узел 1 1 входят две дуги из узлов источников 1 и 2, поэтому α1 = 1, α2 = 2. Дуга, выходящая из узла 1, связана с унарной операцией 2, а дуга, выходящая из узла 2, связана с 1 1 унарной операцией 3, поэтому β1 = 2, β2 = 3. Сам узел 5 связан с бинарной операцией 2, ψ5,5 = 2. Первый список операндов имеет вид G1 = ((1,2), (2,3), (5,2)). Определяем список операндов для узлов 6 и 7. В результате получаем следующий реестр сетевого оператора: R = (((1,2), (2,3), (5,2)), ((3,2), (4,1), (6,2)), ((5,1), (6,1), (7,1))). Для вычисления математического выражения по реестру сетевого оператора необходимо располагать упорядоченным множеством аргументов математического выражения 0 A = (a1, …, aN ), (11) где aj - аргумент математического выражения, который в сетевом операторе является либо параметром, либо переменной, aN Î {q1, …, qp, x1, …, xn}, j = 1, N0. Для множества аргументов математического выражения необходимо также знать номера узлов источников, с которыми связаны аргументы математического выражения 0 I0 = (l1, …, lN ). (12) Задаем вектор для хранения промежуточных вычислений. Размерность вектора равна количеству списков реестра сетевого оператора z = [z1…zM]T. (13) Для каждого списка вычисляем значение вектора (12) ⎧r i (s1 ), если ki = 1 i b ⎪ 1 zi = ⎨ i i (14) yi + N0 ,i + N0 ( b1 ( 1 ) bk ( ki )) ⎪c r i s ⎩ , ¼, r i s i - иначе, где l ⎧a i ⎪ a j j i , если ai £ N0 s j = ⎨ , j = 1, ki. (15) ⎪zai -N · иначе ⎩ j 0 Для рассматриваемого примера получаем: N0 = 4, A = (q1, q2, x1, x2), I0 = (2,4,1,3), z = [z1 z2 z3]T, 1 1 z1 = ρ2(x1)ρ3(q1) = x2ln(q ), 2 2 z2 = ρ2(x2)ρ1(q2) = x2q , 2 2 z3 = ρ1(z1) + ρ1(z2) = x1 ln(q1) + x2 q2. Для поиска оптимального сетевого оператора используем принцип малых вариаций базисного решения [5]. В качестве малых вариаций используем те же вариации, что и для матрицы сетевого оператора [2]: замену унарной операции, замену бинарной операции, вставку унарной операции в список, удаление унарной операции из списка, если при этом в списке остается еще не менее двух элементов. Дополнительно используем вариацию замены компоненты вектора параметров. Все генетические операции скрещивания и мутации выполняем на множествах векторов, описывающих малые вариации сетевого оператора. БИБЛИОТЕКА PYTHON ДЛЯ СИНТЕЗА СИСТЕМ УПРАВЛЕНИЯ МЕТОДОМ СЕТЕВОГО ОПЕРАТОРА Библиотека состоит из трех классов, содержащих методы и поля для решения задачи синтеза управления методом символьной регрессии: 1. Base Genetics 2. Network Operator 3. Structure Genetics Класс Base Genetics предназначен для проведения параметрической оптимизации. При инициализации объекта класса Base Genetics имеется возможность передать объекту вектор, наличие которого означает, что компоненты передаваемого вектора будут являться математическими ожиданиями для нормального распределения, из которого будут генерироваться значения компоненты индивидов популяции. В случае отсутствия данного вектора популяция генерируется согласно равномерному распределению. Класс Network Operator предназначен для хранения базисной структуры и базисного вектора параметров, а также для отображения структуры в выходной вещественный вектор. При инициализации объекта класса Network Operator на вход объекту необходимо передать: 1. список унарных функций; 2. список бинарных функций; 3. список номеров входных узлов; 4. список номеров выходных узлов. Класс Structure Genetics предназначен для проведения структурно-параметрической оптимизации. При инициализации объекта класса Structure Genetics на вход объекту необходимо подать объект типа Network Operator и объект-модель. Объект-модель не входит в библиотеку и должна быть реализована отдельно в виде класса, который имел бы интерфейс, согласно которому объект-модель реализовывал численное интегрирование дифференциальных уравнений, жестко запрограммированных в классе. Чтобы объект-модель могла быть интегрирована с объектом класса Network Operator, необходимо, чтобы в ней была реализована функция set_control_function, принимающая на вход объект функции и присваивающая данную функцию внутренней переменной. Семантика кодируемой структуры Для кодирования математического выражения использовались стандартные типы языка Python - список (list) и кортеж (tuple) [4]. Одно математическое выражение представляется в виде списка, состоящего из других списков, количество которых фиксировано базисным решением. Каждый из подсписков состоит минимум из трех кортежей, длина которых равна двум. Первая позиция кортежа - это номер узла, вторая позиция - это номер операции. Если кортеж является последним в подсписке (далее диагональный), то операция является бинарной, иначе - унарной. Таким образом, чтобы структура графа математического выражения была неразрывной и ациклической (ссылка на методичку по сетевому оператору), необходимо, чтобы одновременно выполнялись два условия: 1. кортежи подсписка должны содержать только входные узлы либо узлы диагональных кортежей предыдущих подсписков; 2. каждый элемент из множества входных и диагональных узлов должен быть использован в качестве узла, над которым проводится унарная операция, минимум один раз. Структура вариаций базисного решения В классе Structure Genetics предусмотрено пять типов вариаций: 0: Замена бинарной операции 1: Замена унарной операции 2: Добавление унарной операции 3: Удаление унарной операции 4: Изменение параметра Каждый индивид популяции объекта типа Structure Genetics представляет собой матрицу n × 4, где n - число вариаций. При скрещивании двух родителей образуется пул из всех вариаций обоих родителей. К этому пулу добавляются новые вариации четвертого типа. Далее для каждого ребенка из общего пула вариаций случайно выбирается n вариаций, причем одна вариация не может быть выбрана более одного раза. Начальная популяция генерируется при помощи стандартного типа dict. Таким образом, достигается большая разнообразность, так как каждый индивид имеет уникальное значение функционала, не превышающее некоторой заданной границы. ПРИМЕР ИСПОЛЬЗОВАНИЯ БИБЛИОТЕКИ ДЛЯ СИНТЕЗА УПРАВЛЕНИЯ Библиотека была протестирована на гусеничном мобильном роботе, модель которого имеет следующий вид: ẋ = 0,5(u1 + u2)cos(θ), ẏ = 0,5(u1 + u2)sin(θ), · θ = 0,5(u1 - u2). (16) На рисунке 2 представлен примерный вид мобильного робота. Рис. 2. Мобильный робот [Fig. 2. Mobile robot] Для системы (16) заданы начальные условия: x(0) = 10, y(0) = 10, θ(0) = 0. Управление объектом ограничено -10 £ ui £ 10, i = 1,2. (17) Заданы терминальные условия xf = 10, yf = 10, θf = 0. (18) Заданы фазовые ограничения r * - (x* - x)2 + ( y* - y)2 £ 0, (19) где r* = 2,5, x* = 5, y* = 5. Задан критерий качества J = t f + t f (x f - x(t f ))2 +( y f - y(t f ))2 + ò J(r * - 0 (x * - x)2 +( y* - y)2 )dt ® min, (20) где tf - время окончания процесса управления; ⎧⎪t, если t < t + и ( x · x(t )) 2 +( y · y(t )) 2 < e t f = ⎨ ⎪⎩t + - иначе f f f f , (21) где t+ = 2,5 с, ε = 0,01, J(a) - функция Хевисайда, ⎧1, если a > 0 J(a) = ⎨ . ⎩0 - иначе Необходимо найти функцию управления в виде (7), чтобы она удовлетворяла ограничениям (17) и обеспечивала достижение объектом терминального состояния (18) с оптимальным значением критерия качества (20). Для решения задачи используем метод сетевого оператора и реализацию метода с помощью классов Python библиотеки. Определим множество аргументов (10) искомой функции управления A = (q1, q2, q3, x, y, θ), I0 = (2, 4, 6, 1, 3, 5). Определим базисное решение в форме линейной обратной связи по координатам вектора пространства состояний где qi = 1, i = 1, 2, 3. ui = q1x + q2y + q3θ, i = 1, 2, Закодированное в форме реестра сетевого оператора базисное решение имеет вид R = (((1,1), (2,1), (6,2)), ((3,1), (4,1), (7,2)), ((5,1), (6,1), (8,2)), ((6,1), (7,1), (8,1), (9,1)), ((6,1), (7,1), (8,1), (10,1))). Было проведено несколько десятков экспериментов. Три наилучших найденных решения имели следующий вид. Решение 1 u1 = q1 + sin(q2y arctg (q2)) + q2θx + ln(x), (22) u2 = min{max(q2, x), -q2y arctg (q2), cos(x)}, (23) где q1 = -3,15283, q2 = 9,942394, q3 = -7,374617. Для решения (22), (23) функционал имел значение: J = 2,381070. Результаты моделирования с решением (22), (23) приведены на рис. 3. Решение 2 ⎧⎪ln(q1 ), arctg(q2 ), 1 + q3q(- x) +⎫⎪ u1 = min ⎨ ⎬, (24) ⎪⎩+ sgn(q2 y ln(q3 )) q2 y ln(q3 ) ⎪⎭ Рис. 3. Траектория движения робота на плоскости для решения (22), (23) [Fig. 3. The robot’s trajectory on the plane for the solution (22), (23)] u2 = min{ln(q1), arctg (q2), 1 + q2y ln(q3)}, (25) где q1 = 1,340758, q2 = 8,966063, q3 = 9,291124. Для решения (24), (25) функционал имел значение: J = 2,354040. Результаты моделирования с решением (24), (25) приведены на рис. 4. Решение 3 ⎧exp(max {ln(q1 ), x, cos(q1 )}), ⎫ ⎪⎪ 3 u = min ⎨q y, cos(q )q (-q ), ⎪⎪ ⎬, (26) 1 2 3 3 3 ⎪ ⎪ ⎪⎩sgn(q3 ) q3 ,sin(q1 ) ⎪⎭ Рис. 4. Траектория движения робота на плоскости для решения (24), (25) [Fig. 4. The robot’s trajectory on the plane for the solution (24), (25)] Рис. 5. Траектория движения робота на плоскости для решения (26), (27) [Fig. 5. The robot’s trajectory on the plane for the solution (26), (27)] u2 = q2 + y, (27) где q1 = -13,161914, q2 = 4,006537, q3 = 8,425214. Для решения (26), (27) функционал имел значение: J = 2,400259. Результаты моделирования с решением (26), (27) приведены на рис. 5. ВЫВОДЫ Описанная в статье Python библиотека классов позволяет решать задачи структурного синтеза, применяя при этом новую, экономную структуру кодирования формулы. Новая структура, названная реестром сетевого оператора, в отличие от матрицы сетевого оператора не включает нулевых элементов, не участвующих в вычислении математического выражения. Проведен вычислительный эксперимент по решению задачи синтеза управления мобильным роботом, движущимся по плоскости при наличии фазовых ограничений. Результаты моделирования полученных при синтезе различных систем управления показали, что найденная функция управления обеспечивает достижение объектом терминального состояния с близким к оптимальному значению функционала без нарушения фазовых ограничений.
Список литературы
- Дивеев А.И. Приближенные методы решения задачи синтеза оптимального управления. М.: ВЦ РАН, 2015. 184 с.
- Дивеев А.И. Метод сетевого оператора. М.: ВЦ РАН, 2010. 178 с.
- Дивеев А.И. Численный метод сетевого оператора для синтеза системы управления с неопределенными начальными значениями // Известия РАН Теория и системы управления. 2012. № 2. С. 63-78.
- Python 3.5.5 documentation // www.python.org URL: https://docs.python.org/3.5/tutorial/ introduction.html#lists (дата обращения: февраль 2018).
- Diveev A.I. Small Variations of Basic Solution Method for Non-numerical Optimization // Proceedings of 16th IFAC Workshop on Control Applications of Optimization, CAO’ 2015. October 6th-9th 2015 Garmisch-Partenkirchen. P. 28-33.