38439

Синтез системы управления спуском космического аппарата на поверхность Марса методом интеллектуальной эволюции

Дипломная

Производство и промышленные технологии

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

Русский

2013-09-28

1.52 MB

10 чел.

РОССИЙСКИЙ УНИВЕРСИТЕТ ДРУЖБЫ НАРОДОВ

Инженерный факультет

Кафедра Кибернетики и мехатроники

УТВЕРЖДАЮ

Зав. кафедрой

Кибернетики и мехатроники

_____________ К.А. Пупков

«___»_____________2013 г.

Дипломная работа

на тему

«Синтез системы управления спуском космического аппарата на поверхность Марса методом интеллектуальной эволюции»

550200 «Автоматизация и управление»

Бакалавр

Разработчик:

Студент группы   ИУБ- 401 (4 курс)

Студенческий билет № 1032080921

_________________  К.В. Стрельцова

«______» ____________ 2013г.

     Руководитель:

д.т.н., проф.

кафедры Кибернетики и мехатроники

      _____________ А.И. Дивеев

Москва  2013г.


КАФЕДРА КИБЕРНЕТИКИ И МЕХАТРОНИКИ

                                                                                                          УТВЕРЖДАЮ:

                                                                                                          Зав. кафедрой

                                                                                                          _____________ К.А Пупков.

                                                                                                        «_____»____________2012г.

ЗАДАНИЕ НА ВЫПОЛНЕНИЕ ДИПЛОМНОЙ РАБОТЫ

студента  Стрельцовой Калерии Владимировны, учебной группы ИУБ-401

Тема дипломной работы: «Синтез системы управления спуском космического аппарата на поверхность Марса методом интеллектуальной эволюции».

График выполнения дипломной работы:

п/п

Выполнение работы и мероприятий

Сроки выполнения

  1.  

Обзор научной литературы по теме выпускной работы.

до 10.10.2012

  1.  

Изучение методов выполнения темы работы.

до 20.11.2012

  1.  

Разработка алгоритмов для решения задач по теме работы.

до 20.12.2012

  1.  

Разработка комплекса программ для решения задач по теме.

до 20.03.2013

  1.  

Выполнение вычислительных экспериментов.

до 10.04.2013

  1.  

Анализ полученных результатов.

до 15.04.2013

  1.  

Оформление текста.

до 30.04.2013

  1.  

Подготовка доклада.

до 06.05.2013

  1.  

Получение отзыва руководителя и рецензии.

до 08.05.2013

  1.  

Сдача на кафедру комплекта программ.

до 10.05.2013

  1.  

Сдача  работы на кафедру

до 20.05.2013

Руководитель дипломной работы:

Профессор кафедры кибернетики и мехатроники:

Дивеев А.И.                                                                                                                                                            _______________                                    

                                                                                                                                                                                     (подпись)

Студент:

Стрельцова К.В.                                                                                                                                                       ______________                           

                                                                                                                                                                                         (подпись)

Оглавление

[1] Оглавление

[2]
Введение.

[3]
1.Постановка задачи.

[4]
2.Генетическое программирование.

[4.1] Метод сетевого оператора.

[5] 3.Пчелиный алгоритм.

[6]
4.Метод интеллектуальной эволюции.

[7] 5.Синтез системы управления.

[8]
Список литературы.

[8.0.1] 4. Электронный журнал «Молодёжный научно-технический вестник». Издатель ФГБОУ ВПО "МГТУ им. Н.Э. Баумана". Эл No. ФС77-51038. ISSN 2307-0609.


Введение.

Синтез системы управления на сегодняшний день является приоритетной задачей современной теории управления, поскольку максимально учитывает работу объекта в реальности, обеспечивая сохранение системных свойств модели и ее целостности.

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

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

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

Запланированный на конец текущего года запуск американского аппарата The Mars Science Laboratory (MSL) обещает стать первым шагом на пути реализации управляемого спуска в атмосфере Марса, что позволит обеспечить точное приземление в запланированное место посадки. Однако, метод управления, применяемый для MSL имеет существенные ограничения. Он основан на линеаризации уравнений движения космического аппарата относительно заранее рассчитанной номинальной траектории, таким образом, не существует возможности правильно реагировать на изменение параметров входа в атмосферу, а также места посадки. Параметры системы управления так же рассчитаны для номинальной траектории и не могут изменяться в процессе спуска.

Одна из основных трудностей в реализации оптимального управления заключается в отсутствии точных знаний о начальном состоянии спускаемого космического аппарата. Траектория спуска и его основные параметры, точность посадки и максимальная перегрузка, существенно зависят от начального угла входа в атмосферу и начальной высоты. Значительная удаленность Марса в свою очередь затрудняет управление с Земли процессом спуска космического аппарата.

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

Объектом исследования в работе является система управления КА спускающегося в атмосферу Марса.

Цель работы состоит в разработке алгоритмов методом интеллектуальной эволюции для синтеза системы управления КА.

 


Для достижения цели в работе  решаются следующие задачи:

  •   разработка вычислительного метода синтеза системы управления

с использованием метода сетевого оператора и алгоритмов интеллектуальной эволюции;

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

Работа состоит из введения, 5 разделов, заключения, списка цитируемой литературы, приложения.

Работа содержит 17 рисунков.

Список литературы состоит из 50  наименований.


1.Постановка задачи.

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

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

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

Кьюриосити выполнил спуск на поверхность Марса используя систему высокоточного входа в атмосферу, снижения и посадки (EDL), которая обеспечила мягкую посадку в пределах заданного эллипса посадки размером 20 км × 7 км, в отличие от эллипса 150 км × 20 км систем посадки марсоходов Mars Exploration Rovers (Спирит и Оппортьюнити). Схема спуска изображена на рис.1.

При посадке использовались 6 различных конфигураций спускаемого аппарата, сработало 76 пиротехнических устройств. На одном из этапов использовался крупнейший созданный человечеством сверхзвуковой парашют. Посадочная последовательность, состоящая из входа в атмосферу, снижения и посадки, была разделена на 4 части.

Рис.1.Схема входа "Кьюриосити" в атмосферу Марса.


Теперь сформируем формальную постановку задачи.

Математическая модель спускаемого космического аппарата представляет собой систему дифференциальных уравнений четвертого порядка.

,   (1)

,  (2)

 ,  (3)

 ,  (4)

где ,  – координаты центра масс космического аппарата в ортогональной системе координат, ,  – компоненты скорости космического аппарата,  – управление, , – экваториальный радиус Марса,  – ускорение свободного падения на поверхности Марса,

,, ,

– масса космического аппарата,  – площадь поверхности сопротивления комического аппарата,, – аэродинамические коэффициенты,

,

– плотность атмосферы на поверхности Марса,  – коэффициент разреженности атмосферы,

.

Заданы начальные условия:

,

,

,

,

где  – угол наклона траектории при входе в атмосферу,

, , ,(5)

– расстояние до поверхности планеты, с которого начинается вход в атмосферу,

 , ,      (6)

Цель управления описывается следующим функционалом:

,  (7)

где  - весовой коэффициент,  - перегрузка

,

,

,

,

- терминальная ошибка

,

,

.

Управление ищем в виде:

(8)

где  – искомое математическое выражение,  – вектор параметров,  не меняющихся в процессе управления.

Особенностью рассматриваемой задачи является наличие множества начальных значений (5), (6). При различных начальных значениях (5), (6) значения функционала (7), различны.

Главная задача управления - это поиск математического выражения (8), благодаря которому будет обеспечен плавный вход спутника в разряженную атмосферу Марса. Рассмотрим подробнее способы нахождения математического выражения.


Способы нахождения математического выражения:

* АКОРаналитическое конструирование оптимальных регуляторов.

** АКАР - аналитическое конструирование агрегированных регуляторов.


2.Генетическое программирование.

Для решения многих практических задач наиболее естественным представлением решений являются компьютерные программы. Одна из центральных задач теории вычислительных систем (computer science) - научить компьютер решать поставленную задачу, не объясняя ему как это делать. Генетическое программирование позволяет сделать это путем создания работающих компьютерных программ исходя из высокоуровневой постановки задачи. Генетическое программирование достигает поставленной цели автоматического программирования или программного синтеза (automatic programming, program synthesis) путем выращивания популяций компьютерных программ, используя принцип естественного отбора Дарвина, и основанные на генетических принципах операторы, которые могут включать репродукцию, скрещивание и мутацию.

Джон Коза (John R. Koza) в 1987 продемонстрировал эволюцию выражений языка программирования LISP. Он впервые использовал термин «генетическое программирование». В 1989 году Коза показал применение генетического программирования для решения различных задач.

Настоящее развитие генетическое программирование получило после выхода в 1992 году книги Джона Козы «Genetic Programming: On the Programming of Computers by Means of Natural Selection & Genetics», в которой он продемонстрировал области применения метода, а также численные результаты экспериментов и некоторые практические рекомендации. По сути, генетическое программирование является некой модификацией генетического алгоритма, основное различие - в представлении решений. Решения в генетическом программировании могут иметь различную форму и размер, в генетическом алгоритме - это строки фиксированной длины. Наиболее распространенным является представление в виде деревьев.

Символьная запись:

  1.  инфиксная (используется для бинарных операций, когда операция ставится между аргументами);
  2.  префиксная (используется сначала символ операции, затем символьный аргумент);
  3.  постфиксная (используется сначала аргумент, затем операция);

Рассмотрим это на примере.

,           (1)

где ,, -параметры,, - переменные.

В математическом выражении выделим унарные (u)  и бинарные (b)  операции. В результате принятых обозначений префиксная символьная запись рассматриваемого математического выражения имеет вид:

y1=b1u1u2b1q1x1u3b2b1q2x2q3, где

- операция умножения, - операция сложения, - унарная операция вычисления экспоненты, - унарная операция обращения знака или унарный минус, - операция вычисления синуса.

Символическая запись математического выражения имеет древовидную структуру, которая представлена на рис.2.


Рис.2. Дерево вычислений выражения (1)

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

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

Пусть есть мат. выражение:y2= b2b1b2b1q1x1x2b2b1q1x1u3b2x1q2 (2).

Дерево решений  представлено на рис.3


Рис.3. Дерево вычислений выражения (2).

На рис. 1 и 2 выбранные вершины заштрихованы. После обмена поддеревьев, исходящих от выбранных вершин, получаем деревья вычислений, представленные на рис.4 и 5. В результате выполнения операции скрещивания получаем следующие мат. выражения:

y3=b1u1u2b1q1x1u3b2b1q1x1x2       (3)

y4=b2b1b2b1q2x2q3b2b1q1x1x2u3b2x1q2     (4)

Рис.4.Дерево вычислений выражения (3).Скрещивание.

Рис.5. Дерево вычислений выражения (4).

Выделим основные недостатки ГП:

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

Метод сетевого оператора.

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

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

Метод сетевого оператора позволяет представить математическое выражение в виде ориентированного графа (рис.8).Ориентированный граф  (сокращённо орграф)  G — это упорядоченная пара , для которой выполнены следующие условия:

  •  — это непустое множество вершин или узлов,
  •  — это множество (упорядоченных) пар различных вершин, называемых дугами или ориентированными рёбрами.


Рис.8 Графическое изображение ориентированного графа.

В вычислительной машине ориентированный граф сетевого оператора представляют в виде целочисленной матрицы.

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

Какие же операции называются унарными, а какие бинарными? Остановимся на этих определениях поподробнее.

Унарные - тип операции, при которой имеется один принимаемый аргумент (отрицание, унарный минус).

Бинарные - тип операции, при которой имеется два принимаемых аргумента (сложение, вычитание, умножение и т.д.).

В качестве примера рассмотрим многослойный сетевой оператор.


Пример:

 

а) Исходный сетевой оператор

 

 

б) Слой 1

 

в) Слой 2

Слой 1 сетевого оператора описывает два математических выражения  и . Слой 2 соответствует математическому выражению .    

Матрицы слоев сетевого оператора имеют следующий вид:

,        


В результате вместо одного операторного уравнения:

   

имеем два операторных уравнения с матрицами сетевых операторов меньшего размера:

,     .

При разбиении матрицы сетевого оператора необходимо учитывать рабочее пространство матрицы для описания математических выражений [8]. Чем меньше величина рабочего пространства, тем эффективнее используется каждый элемент матрицы сетевого оператора для описания математического выражения. Величину рабочего пространства вычисляем по формуле

+ L-m+,где L- размерность матрицы сетевого оператора, m - количество узлов-источников.

Вывод:

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

3.Пчелиный алгоритм.

Алгоритм пчел является довольно молодым алгоритмом для нахождения глобальных экстремумов (максимумов или минимумов) сложных многомерных функций (будем называть эту функцию целевой функцией).

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

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

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

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



Первым шагом в реализации метода пчелиного роя (МПР) является выбор параметров, которые необходимо оптимизировать, и определение допустимого интервала для поиска оптимальных значений. Затем в допустимой области случайным образом располагаются пчёлы, а также задаются векторы и скорости их движения. Затем каждая частица должна перемещаться через пространство решений, как если бы она была пчелой в рое. Алгоритм действует на каждую частицу отдельно, перемещая ее на небольшую величину, циклично двигая ее через весь рой.

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


где:

— это скорость частицы в n-том измерении на предыдущем шаге,

— это координата частицы в n-том измерении,

— ПНП,

—ГНП.
Расчет производится для каждого из N. Из этого уравнения видно, что новая скорость получается из старой скорости путем простого масштабирования на, и прибавления направления ГНП и ПНП для этого конкретного направления.  и — это масштабные коэффициенты, которые определяют относительное взаимное «притяжение» к ПНП и ГНП. Они иногда рассматриваются как познавательный и социальный факторы.  —  это коэффициент, определяющий какое влияние на частицу оказывает ее память о ПНП, и— коэффициент, определяющий какое влияние на частицу оказывают остальные члены роя. Увеличение   предполагает исследование пространства решений путем движения каждой частицы в направлении своего ПНП; увеличение   предполагает исследование предполагаемого глобального максимума. Функция случайных чисел rand() возвращает число в интервале между -1 и 1. В общем случае два появления функции rand() представляет собой два различных вызова функции. Большинство реализаций используют две независимые случайные величины для стохастического изменения относительного притяжения ГНП и ПНП. Это введение случайного элемента в оптимизацию предназначено для моделирования незначительного непредсказуемого компонента реального поведения роя. называют «инерционным весом» и это число (выбранное в интервале между 0 и 1) отражает в какой мере частица остается верной своему первоначальному курсу, не подвергшемуся влиянию ГНП и ПНП.

В итоге можно заметить, что метод роя пчёл можно эффективно распределить на несколько параллельных процессов, за счёт чего значительно увеличится его скорость.
По сравнению с генетическим алгоритмом, операторы которого могут быть реализованы различным образом, имеет лишь один оператор — вычисление скорости, что делает его более простым в использовании.
В методе роя пчёл можно легко определить достижение точки глобального минимума, в то время как в генетических алгоритмах это значительно осложнено.
Концепция этих методов основывается на двух совершенно разных природных процессах: МРП основывается на социальном поведении роя, а генетический алгоритм имитирует процесс эволюции и естественного отбора. За счёт этого есть возможность объединить два этих метода.

Теперь рассмотрим генетический алгоритм. Хотя, название алгоритма созвучно с генетическим программированием – эти понятия не дополняют друг друга.

Согласно правилам работы генетического алгоритма (ГА) первоначально генерируют множество возможных решений или хромосом и виде строк символов, каждая их которых представляет собой математическое выражение. Затем оценивают каждое возможное решение с помощью функции приспособленности, которую для оптимизационных задач строят на основе целевой функции с учётом ограничений. На основе отобранных решений воспроизводят новые решения с помощью специальных операций генетического алгоритма скрещивания и мутации. Блок-схема таких операций приведена на рис. 6 и 7.

                                          

Рис.6. Блок-схема генетического алгоритма.                          Рис.7. Схема эволюции решений в генетическом алгоритме.

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

  •  Первоначально задаём базисное решение задачи. Это решение может представлять собой любое математическое выражение, которое, по мнению исследователя, наиболее близко к искомому оптимальному выражению.

Базисное решение описываем матрицей сетевого оператора  

= , i, j = .

  •    Генерируем упорядоченные множества векторов вариаций.
  •  Генерируем битовые строки, определяющие параметрическую часть хромосомы.
  •  Для каждой хромосомы определяем значения функционалов.
  •  Определяем количество возможных решений. И отбираем лучшие.
  •  Для построения новых возможных решений выполняем операции

скрещивания и мутации.

  •  Осуществляем построение новых хромосом.
  •  Вычисляем значение функционалов.


4.Метод интеллектуальной эволюции.

Современные вычислительные алгоритмы (дифференциальной эволюции, роя частиц, пчелиный алгоритм, генетические алгоритмы и т.д.) относятся к классу эволюционных алгоритмов. В том случае, когда эти алгоритмы содержат элементы интеллектуального анализа, подстройки алгоритма под цели решаемой проблемы и т.п., эти алгоритмы можно отнести к классу «интеллектуальной эволюции».

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

Общий алгоритм метода можно представить в виде следующего псевдокода:

1. Инициализация.

2. Оценка множества (популяции) возможных решений.

3. Формируем решения с разными базисами.

4. Создание новых хромосом (возможных решений): отбор, скрещивание и мутация на решениях с разными базисами.

5. Оценка новой популяции возможных решений и замена плохих решений на лучшие.

6. Проверка условия смены эпох.

7. Проверка условия останова алгоритма.

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

Генерируем упорядоченное множество векторов вариаций

, ,      (7)

где H – количество возможных решений или размерность картежей.

Параметрическую часть каждого возможного решения генерируем с помощью кода Грея в виде битовых строк

, ,      (8)

где p – число параметров, с – число бит под целую часть, d – число бит под дробную часть числа.

Таким образом, получаем множество родительских хромосом (возможных решений)

, .       (9)

На втором этапе производим оценку множества возможных решений. Для каждого возможного решения ,  вычисляем значения функционалов (2)

 

путем построения матрицы сетевого оператора :  и перевода параметрической части картежа из двоичного кода в вектор параметров .

Также каждую полученную матрицу сетевого оператора и вектора параметров оцениваем по расстоянию до множества Парето. Оно определяется количеством решений, которые лучше в смысле Парето, чем анализируемое

,

где

 Все возможные решения сортируем по показателю .

На третьем этапе на основе исходного (нулевого) базисного решения  и заданного числа,  лучших с точки зрения расстояния до множества Парето хромосом  формируем множество базисов , , причем каждому из этих базисов ставится в соответствие значение вероятности его использования , обратно пропорциональное его расстоянию до множества Парето.  

Распределяем вновь сформированные базисы по половине популяции с вероятностью , для оставшейся половины популяции сохраняем нулевой базис.

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

На четвертом этапе для построения новых возможных решений (хромосом) на основе множества (9) выполняем генетические операции отбора, скрещивания и мутации на популяции с исходным и новыми базисами [1, 2].

На пятом этапе для всех новых решений вычисляем значения функционалов (2).

Для каждого нового решения  выполняем следующие процедуры. Находим расстояние до множества Парето . Находим во множестве возможных решений хромосому, которая имеет наибольшее расстояние до множества Парето.

,      (10)

где  - номер возможного решения, имеющего наибольшее расстояние до множества Парето.

Сравниваем новое решение с решением, которое имеет наибольшее расстояние до множества Парето

.      (11)

Если условие (11) выполняется, то заменяем решение, которое имеет наибольшее расстояние до множества Парето, на первое новое решение

,

,      (12)

.

Пересчитываем расстояния до множества Парето для всех возможных решений в множестве и повторяем действия (10)-(12) для всех новых решений.

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

Завершаем вычисления, когда выполним заданное количество циклов. Отбираем решения, которые имеют нулевое расстояние до множества Парето, получаем новое множество Парето, которое считаем решением задачи (1)-(4)

.   (13)

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

5.Синтез системы управления.

Рассмотрим задачу синтеза системы управления с несколькими целями управления.

Задана система обыкновенных дифференциальных уравнений, описывающая модель объекта управления

,      (1)

где , ,– ограниченное замкнутое множество, .

Состояние объекта управления оцениваем по наблюдаемым координатам

,      (2)

где, .

Для системы (1) заданы начальные условия

,      (3)

Задано множество целевых состояний

,          (4)

причем .

Задан критерий качества управления

 (5)

где – время управления, которое может быть ограничено, , но

не задано.

Необходимо найти управление в форме

          (6)

которое обеспечивает достижение последовательно всех целевых точек (4) и минимизирует функционал (5).

Цель управления (4) многозначна. Для перехода к задаче синтеза интеллектуальной системы управления необходимо обеспечить в системе возможность выбора. Для этой цели ослабим требования к попаданию объекта в каждую целевую точку, заменим требованием попадания в окрестность целевой точки.

,,        (7)

где  – малая положительная величина.

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

Уточним данную постановку задачи.


Управление (6) представим в виде функции, зависящей от расстояния до цели

,             (8)

где  – номер текущей целевой точки.

В любой момент времени  номер текущей целевой точки определяем с помощью логической функции

,     ,         (9)

где, - предикатная функция,

: .        (10)

Функцию (10) также необходимо найти вместе с синтезирующей функцией (6). Функция (10) должна обеспечивать переключение целевых точек. Обе функции (6) и (10) должны обеспечивать минимум функционалу качества (5) функционалу точности

          (11)

Время управления  определяем по достижению последней целевой точки

, если ,           (12)

где  – малая положительная величина.

Частный критерий (5) заменим суммарным критерием качества

         (13)

Для построения предикатной функции используем функцию дискретизации и логическую функцию.

,           (14)

где  – логическая функция,

,            (15)

где  – функция дискретизации.

Задача заключается в том, чтобы найти управления в форме

,              (16)

где  – целочисленный вектор, определяющий управления для решения частной задачи . Управления (16) должно обеспечить достижения минимумов функционалов (11) и (13).

В общем случае, так как задача содержит два критерия (11) и (13), то ее решением будет множество Парето в пространстве функционалов . Конкретное решение на множество Парето выбирает разработчик по результатам моделирования и исследования синтезированной системы управления.

Задачу (1) – (3), (7) – (16) называем задачей синтеза интеллектуальной системы управления. Для ее решения необходимо найти две многомерные синтезирующие функции  и .

Для решения задачи синтеза интеллектуальной системы управления используем метод сетевого оператора [1–7]. Для нахождения функции  используем обычный арифметический сетевой оператор, в котором в качестве конструктивных функций используем множество арифметических функций с одним или двумя аргументами. В методе сетевого оператора эти функции называются унарными или бинарными операциями. Для нахождения логической функции используем логический сетевой оператор, соответственно с унарными и бинарными логическими операциями.

В качестве примера рассмотрим следующую математическую модель.

,

,

где,– координаты на плоскости.

На управление наложены ограничения   

Траектория движения задана набором точек  .

Необходимо найти управление, чтобы минимизировать две целевые функции объекта. Первый функционал определяет точность движения по траектории, а второй – время прохождения траектории.


,

,

где

, ,

Задача логического управления заключалась в обеспечении переключения точек траектории.

,

где, , ,

, .

Начальные значения для моделирования были .

На рис. 9 приведено полученное решение в виде множества Парето.

Рис. 9. Множество Парето

На множестве Парето было отобрано лучшее решение по критерию . Полученные матрицы арифметического и логического сетевых операторов имеют следующий вид:

, .

На рис. 10,11 показаны результаты моделирования отобранной системы управления.

Рис. 10. Траектории на плоскости

Рис. 11. Управление

Время движения по всей траектории составило 4.82 с. При оптимальном по быстродействию управлении, при точном прохождении всех точек время движения по траектории составило бы

5.1.Задача спуска космического аппарата на поверхность Марса.

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

рис.12 график перегрузки.

Рис.13 график управления
5.2. Вычислительный эксперимент.

В среде Delphi 6 разработан вычислительный комплекс, соответствующий условиям поставленной задачи.

Рис.14. Главное меню программы

  1.  Раздел Initialization:

a.  Create object- задаются параметры сетевого оператора и генетического алгоритма.

b.  Undefined parameters – задаются максимальные и минимальные значения Х и У.

c.  Parameters of Network operator – параметры сетевого оператора. Строится матрица базисного значения сетевого оператора, значения параметров q и psi (их можно загрузить новыми и сохранить).

d.  Parameters of GAGenetic algorithm with network operator – Ввод     параметров генетического алгоритма.

  1.  Раздел Optimization:
    1.  GA for NOP + Parameters
    2.  GA for Parameters 
  2.  Раздел Pareto set
    1.  Pareto set – множество Парето

  1.  Раздел Expression
    1.  Show – просмотр полученных выражений
    2.  Print to file – запись полученных выражений в файл
    3.  Clear – очистить окно

  1.  Раздел Simulation:
    1.  Initial data – отображение введённой части экспертной      системы. В этом окне можно загрузить экспертную систему из файла, сохранить её в файл, а так же изменять введённую экспертную систему.

Проводим эксперимент, используя часть составленного нами метода. Для поиска решений используем генетический алгоритм с параметрами, приведёнными в Таблице № 1 и программу из Приложения A для спуска аппарата на поверхность Марса методом интеллектуальной эволюции.


Таблица №1.

Параметры генетического алгоритма

Параметр

Значение

Размер начальной популяции хромосом или возможных решений

256

Число поколений

64

Число пар в одном поколении

128

Число изменений в одной хромосоме

8

Число функционалов

2

Число искомых параметров

4

Количество битов для дробной части

10

Число поколений в одной эпохе между сменой базисного решения

29

Число элитарных хромосом

16

Параметр для скрещивания

0.4

Вероятность мутации

0.7

Рис.15. Параметры генетического алгоритма.

Рис.16.Матрица сетевого оператора.

Для решения используем значения  и q.

Эти значения прилагаются в приложении Б.

*******************

Unary operations

1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 23 

*******************

Binary operations

0 1 

*******************

Numders of nodes for variables

0 2 4 6 

*******************

Numbers of nodes for parameters

1 3 5 7 

*******************

Numbers of nodes for outputs

23 23 

*******************

Basic network operator matrix

0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 1 0 0 0 0 0 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 23 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 6 0 

0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 9 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 1 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

*******************

Values of parameters q:

2,69336

3,82227

0,78711

2,32910

z_0=x_0

z_1=q_0

z_2=x_1

z_3=q_1

z_4=x_2

z_5=q_2

z_6=x_3

z_7=q_3

z8=Prod(z_1,z_0)

z9=Prod(z_3,z_2)

z10=Prod(z_5,z_4)

z11=Prod(z_7,z_6)

z12=Sum(z_9,z_8)

z13=Sum(z_11,z_10)

z14=Sum(z_12)

z15=Sum(z_13)

z16=Sum(z_12)

z17=Sum(z_13)

z18=Sum(Ro_18(z_13),z_12)

z19=Sum(z_17,Ro_9(z_14),Ro_23(z_6))

20=Sum(z_18)

z21=Sum(z_19)

z22=Sum(z_20,Ro_6(z_10))

z23=Sum(z_22,Ro_17(z_21))

Исследование 1:

Рис.17.Множество Парето.

Условное множество Парето

Кол-во решений

F_0

F_1

0

128

46

27

1

248

46

27

50

179

46

24

91

240

47

22


Заключение.

На сегодняшний день задача синтеза – одна из самых актуальных тем современной науки. Благодаря современной вычислительной технике появилась возможность смоделировать летательные объекты и максимально чётко просчитать математические модели этих объектов. Тем самым снизить риск неполадок при запуске спутника.

Объектом исследования в работе являлась система управления КА спускающегося в атмосферу Марса.

Цель работы заключалась в разработке алгоритмов методом интеллектуальной эволюции для синтеза системы управления КА.

Для достижения цели в работе  решились следующие задачи:

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

На базе разработанных методов в среде Delphi 6 был разработан программный вычислительный комплекс. Тестирование программы успешно завершено на эталонном объекте, описываемом системой дифференциальных уравнений четвёртого порядка. Синтезированное управление сохраняет свойства оптимальности даже при изменении начальных условий в заданном диапазоне.


Список литературы.

1. Дивеев А.И. Метод сетевого оператора. М.: Изд-во ВЦ РАН. 2010. 178 с.

 2. Pham D.T., Ghanbarzadeh A., Koc E., Otri S., Rahim S., Zaidi M. The Bees Algorithm – A Novel Tool for Complex Optimisation Problems Manufacturing Engineering Centre, Cardiff University, Cardiff CF24 3AA, UK,2010, pp. 67.

3.   Pham D.T., Ghanbarzadeh A., Koc E, Otri S, Rahim S., Zaidi M. The Bees Algorithm. Technical Note, Manufacturing Engineering Centre, Cardiff University, UK, 2009, pp. 53.

4. Электронный журнал «Молодёжный научно-технический вестник». Издатель ФГБОУ ВПО "МГТУ им. Н.Э. Баумана". Эл No. ФС77-51038. ISSN 2307-0609.

5. А.И. Дивеев, Е.Ю. Шмалько.//«Синтез системы управления для обеспечения безопасного спуска в атмосферу Марса» 2008, № 3. С. 43 - 87.

6. Braun R.D., Manning R.M. Mars Exploration Entry, Descent and Landing Challenges//IEEE Aerospace Conference, Big Sky Montana, March 2010. Pp.№0076.

7. Mendeck G.F., Carman G.L. Guidance Design for Mars Smart Landers Using the Entry Terminal Point Controller, AIAA 2002-4502, Atmospheric Flight Mechanics Conference and Exhibit, Monterey, CA, August 2009.Pp. 147.

8. Carman, G., Ives, D., and Geller, D., “Apollo-Derived Mars Precision Lander Guidance,” AIAA Pp. 98-4570, Aug. 2008.

9. Дивеев А.И., Шмалько Е.Ю. Многокритериальный структурно-параметрический синтез системы управления спуском космического аппарата на основе метода сетевого оператора// Вестник Российского университета дружбы народов. Серия инженерные исследования (информационные технологии и управление). 2008, № 4. С. 86 - 93.

10. T. Weise. Global Optimization Algorithms - Theory and Application: Ph.D Thesis. - University of Kassel, 2008,pp.245.

11. Дивеев А.И. Метод сетевого оператора. –  М.: Учреждение Российской академии наук Вычислительный центр им. А.А. Дородницына РАН, 2010.178с.

12. Дивеев А.И., Софронова Е.А. Метод генетического программирования для автоматического подбора формул в задаче структурного синтеза системы управления // Труды института системного анализа РАН. Динамика неоднородных систем. / Под ред. Ю.С. Попкова. – Вып. 10(1). – М.: ИСА РАН, КомКнига, 2010. – С.14-26.

13. Дивеев А.И., Сафронова Е.А. Метод сетевого оператора и его применение в задачах управления. - М.:РУДН,2012.-182с.

14. Карпенко А. П., Селиверстов Е. Ю.Обзор методов роя частиц для задачи глобальной оптимизации (Particle Swarm Optimization) ,2009 .-74c.

15. B. B. Воеводин, Bл. B. Воеводин. Параллельные вычисления. - БХВ-Петербург, 2012.-205c.

16. Гришин А. А., Карпенко А. П.Исследование эффективности метода пчелиного роя в задаче глобальной оптимизации, август 2010 .- 169с.

17. W. Elshamy, H. M. Emara, A. Bahgat. Clubs-based Particle Swarm Optimization. //  Swarm Intelligence Symposium. - 2008, pp. 289 – 296.

18.  A. S. Mohais, R. Mendes, Ch. Ward, Ch. Posthoff. Neighborhood Re-structuring in Particle Swarm Optimization. // Proceedings of the Australian Conference on Artificial Intelligence. - 2009, pp. 776-785.

19. M. Dorigo, V. Maniezzo. Parallel Genetic Algorithms: Introduction and Overview of Current Research. // Parallel Genetic Algorithms: Theory and Applications. / Ed. by J. Stenders. - Amsterdam, IOS Press, 2012, pp. 276-289.

20.  M. Belal, T. El-Ghazawi. Parallel Models for Particle Swarm Optimizers. // International Journal of Intelligent Computing and Information Sciences. - 2008, v. 1, pp. 100-111.

21. Shu-Chuan Chu, Jeng-Shyang Pan. Intelligent Parallel Particle Swarm Optimization Algorithms. // Parallel Evolutionary Computations. - Springer Berlin, Heidelberg, 2008, v. 22, pp. 159-175.

22. Олейник Ал.А. , Субботин С.А. Интеллектуальный метод мультиагентного поиска поиска в многомерном пространстве с использованием прямой связи между агентами // 2008, с. 102 - 108.

23.    Макарова И.М., Лохина В.М. Интеллектуальные системы автоматического управления. М.: Физматлит, 2001. 375 с.

24.     Koza J.R. Genetic Programming: On the Programming of Computers by Means of Natural Selection. Cambridge, Massachusetts, London, MA: MIT Press, 2010,pp 63-96.

25.     O'Neill M., Ryan C. Grammatical Evolution. Evolutionary Automatic Programming in an Arbitrary Language. Kluwer Academic Publishers, 2002, pp. 385-412.

26.     Zelinka I., Oplatkova Z. Analytic programming // Comparative Study. CIRAS’03, The second InternationalConference on Computational Intelligence, Robotics, and Autonomous Systems, Singapore, 2009,pp. 68-96.

27.     Дивеев А.И., Пупков К.А., Софронова Е.А. Повышение качества систем управления на основе многокритериального синтеза методом сетевого оператора // Вестник РУДН, 2009, № 4, С. 5-12.

28.     Дивеев А.И., Софронова Е.А. Синтез системы управления при неопределенных фазовых ограничениях на основе метода сетевого оператора// Труды ИСА РАН. Динамика неоднородных систем/ Под ред. чл.-корр. РАН Ю.С. Попкова. М.: ИСА РАН, ЛКИ. 2008, Т. 32(3). С. 32 – 40.

29.     Дивеев А.И., Северцев Н.А. Метод сетевого оператора для синтеза системы управления спуском космического аппарата при неопределенных начальных условиях// Проблемы машиностроения и надежности машин. 2009, № 3, С. 85-91.

30.     Дивеев А.И., Северцев Н.А., Софронова Е.А. Синтез системы управления метеорологической ракетой методом генетического программирования //Проблемы машиностроения и надежности машин. 2008, № 5. С. 104 - 108.

31.  Diveyev A.I., Sofronova E.A. Application of network operator method for synthesis of optimal structure and parameters of automatic control system// Proceedings of 17-th IFAC World Congress, Seoul, 2008, 05.07.2008 – 12.07.2008. P. 6106 – 6113.

32.  Дивеев А.И., Пупков К.А., Софронова Е.А. Синтез системы управления – задача тысячелетия// Вестник РУДН, 2011, № 2. С. 113-125.

33.  Дивеев А.И., Софронова Е.А. Многокритериальный структурно-параметрический синтез системы управления методом сетевого оператора. Программа для ЭВМ. № 2009613966.

34.     Дивеев А.И. Метод сетевого оператора. М.: Изд-во ВЦ РАН. 2010. 178с.

35.     Дивеев А.И. Синтез адаптивной системы управления методом сетевого оператора// Сб. статей Вопросы теории безопасности и устойчивости систем. М.: ВЦ РАН. 2010. Вып. 12. С. 41-55.

37.     Слинько М.Г. Основы и принципы математического моделирования каталитических процессов. Новосибирск: Институт катализа им. Г.К. Борескова СО РАН, 2009. 488 с.

38.     Овчинников М.Ю., Юнусов А.А., Хурсан С.Л., Губайдуллин И.М. Моделирование генерации синглетного кислорода при разложении диметилдиоксирана с использованием технологии OpenMP // Параллельные вычислительные технологии (ПаВТ’2012) : труды международной научной конференции (Новосибирск, 26-30 марта 2012 г.). Челябинск: Издательский центр ЮУрГУ, 2012. С. 735-736.

39. Волкович В. Л. Волошин А. Ф. Об одной схеме метода последовательного анализа и отсеивания вариантов // Кибернетика. 1978. № 4. С. 98-105.

40. Северцев Н. А. Дивеев А. И. Оптимальный выбор варианта технического изделия // Проблемы машиностроения и надежности машин / РАН. 2009. № 5. С. 3—8.

41. Дивеев А. И. К проблеме выбора варианта технической системы с монотонными параметрами // Проблемы машиностроения и надежности машин / РАН. 2010. № 4. С. 14—19.

42. Дивеев А. И., Северцев Н. А. Метод трансформации в схеме последовательного анализа и отсеивания вариантов // Труды международной конференции "Вопросы оптимизации вычислений (BOB-XXVII)". Киев, 6-8 окт., 2008 г. С. 94-97.

43. Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. М.: Мир, 2010, 536 с.

44.      Петров Ю.Ю. Управляемые генетические алгоритмы, основанные на статистике. // Вторая Всероссийская научная конференция

«Нечеткие системы и мягкие вычисления». г. Ульяновск. http://nsmv2008.ulstu.ru/index.php?url=68&type=file 2008 г.

45.      Панченко Т.В. Генетические алгоритмы. Под ред. Тарасевича Ю.Ю. // г.Астрахань: Издательский дом «Астраханский университет». mathmod.aspu.ru/images/File/ebooks/GAfinal.pdf, 2008 г. - 88с.

46.      Рутковская Д., Пилиньский М., Рутковский Л. Нейронные сети, генетические алгоритмы и нечеткие системы: Пер. с польск. Рудинский И.Д. - М.: Горячая линия - Телеком, 2009 г. - 452с.

47. Holland J.H. Adaptation in Natural and Artificial Systems. Ann Arbor: The University of Michigan Press, 2010.

48. Goldberg D.E. Genetic Algorithms in Search, Optimization and Machine Learning. Addison-Wesley Publishing Company, 2011.

49. http://www.wikipedia.org/. – свободная энциклопедия.

50. http:// www.studystore.ru


Приложение А.

unit Unit1;

//*********************************************************

                     INTERFACE

//*********************************************************

uses

 Windows, Messages, SysUtils, Variants,

 Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ComCtrls, Menus, UnitAdaptObjects;

type

 TForm1 = class(TForm)

   MainMenu1: TMainMenu;

   CreateNOP1: TMenuItem;

   GA1: TMenuItem;

   Geneticalgorithm1: TMenuItem;

   Optimization1: TMenuItem;

   Paretoset1: TMenuItem;

   Expression1: TMenuItem;

   Model1: TMenuItem;

   SaveDialog1: TSaveDialog;

   ProgressBar1: TProgressBar;

   Label1: TLabel;

   Memo1: TMemo;

   PopupMenu1: TPopupMenu;

   Unaryoperations1: TMenuItem;

   Binaryoperations1: TMenuItem;

   ParametersofGA1: TMenuItem;

   Showexpression1: TMenuItem;

   Savetofile1: TMenuItem;

   Clear1: TMenuItem;

   Pascal1: TMenuItem;

   Latex1: TMenuItem;

   Parametersofmodel1: TMenuItem;

   GAforNOPParameters1: TMenuItem;

   GAforParameters1: TMenuItem;

   Undefinedparameters1: TMenuItem;

   procedure Undefinedparameters1Click(Sender: TObject);

   procedure GAforParameters1Click(Sender: TObject);

   procedure GAforNOPParameters1Click(Sender: TObject);

   procedure Parametersofmodel1Click(Sender: TObject);

   procedure Latex1Click(Sender: TObject);

   procedure Savetofile1Click(Sender: TObject);

   procedure Clear1Click(Sender: TObject);

   procedure Pascal1Click(Sender: TObject);

   procedure Model1Click(Sender: TObject);

   procedure Paretoset1Click(Sender: TObject);

   procedure ParametersofGA1Click(Sender: TObject);

   procedure Geneticalgorithm1Click(Sender: TObject);

   procedure GA1Click(Sender: TObject);

   procedure Binaryoperations1Click(Sender: TObject);

   procedure Unaryoperations1Click(Sender: TObject);

   Procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

 TUser=class(TModel)

   Constructor Create(hh1, pp1, rr1, nfu1, lchr1, p1, c1, d1, epo1,

                      kel1:integer; alfa1, pmut1:real; L1, Mout1, kp1,

                      kr1, kw1, kv1,n1,m1,ll1,ny1:integer);

   Procedure Func(var Fu:TArrReal); override;

   Procedure RP(t1:real;x1:TArrReal;var f1:TArrReal); override;

   Procedure Initial;override;

   Procedure Viewer;override;

 end;

const

//  epsterm=1e-2;

 Vc=4.5;

 Cx=1.63;

//  Cy=0.15;//0.289;

 Cy=0.2934;

 g0=3.71e-3;

 m_S=96.8;

 ro_0=0.02e3;

 bet=0.093;

 b0c=-0.2;

 Rz=3396.9;

 //angle betta -0.296

 x0c:array [0..3] of double=(0,4.86,3556.9,-1.3);

 xfc:array[0..1] of real=(10,500); //высота, дальность

 uminc:array[0..1] of double=(-pi,-pi);

 umaxc:array[0..1] of double=(0,0);

//  uminc:array[0..1] of double=(0,0);

//  umaxc:array[0..1] of double=(0.2,0.2);

 O1sc:array [0..15] of integer=(1,2,3,4, 5,6,7,8, 9,10,14,15, 16,17,18,23);

 O2sc:array [0..1] of integer=(0,1);

 qc:array[0..3] of real=(1,1,1,1);

 qyminc:array [0..1]of real =(-0.32,-5);

 qymaxc:array [0..1]of real =(-0.28,5);

 stepsqyc:array[0..1]of real=(0.04,10);

 shtrafc=100;// Penalty for breakdown of phase constraints

 Pnumc:array [0..3] of integer=(0,2,4,6);

 Rnumc:array [0..3] of integer=(1,3,5,7);

 Dnumc:array [0..1] of integer=(23,23);

 tfc:real=300;// время окончания

 dtc:real=0.01;//шаг интегрирования

 eps=1e-7;

 epsterm=10;

 infinity=1e10;

 teta=20;

 pokmax=10;

 PsiBasc:array [0..23,0..23] of integer=

      ((0,0,0,0, 0,0,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,1,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,1,0, 0,1,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,1, 0,1,0,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 1,0,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,1,0,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 1,0,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,1,0,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,1,0),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1),

       (0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0));

var

 Form1: TForm1;

 EA:TUser;

 n1:integer=4;//dimention of system;

 m1:integer=2;//dimention of control;

 ll1:integer=8;//dimention of viewing;

 dt1:real=0.1; //step of integration;

 tf1:real=300;//terminal time;

 dtp:real=0.1;//step of print;

 x01:TArrReal;

 umin1:TArrReal;

 umax1:TarrReal;

 qymax1,qymin1,stepsqy1:TArrReal;

 hh1:integer=256; //number of chromosomes in an initial population

 pp1:integer=64;  // number of generations

 rr1:integer=128; // number of couples in one generation

 nfu1:integer=2;  // number of functionals

 lchr1:integer=8; //number of variations in one chromosome

 p1:integer=4;    //number of serching parameters

 c1:integer=2;    //number of bits for integer part

 d1:integer=10;    //number of bits for fractional part

 Epo1:integer=29;  // number of ganerations between exchange of basic NOM

 kel1:integer=16;  // number of elitaring chromosomes

 alfa1:real=0.4;  // parameter for crossover

 pmut1:real=0.7;  // probability of mutation

 L1:integer=24;   // dimension of network operator matrix

 kp1:integer=4;   //cardinal of set of variables

 kr1:integer=4;   //cardinal of set of parameters

 kw1:integer=16;   //cardinal of set of unary operations

 kv1:integer=2;   //cardinal of set of binary operations

 Mout1:integer=2; // number of outputs

 ny1:integer=2;// dimention of vector of undefine parameters

 O1s1,

 O2s1,

 Pnum1,

 Rnum1,

 Dnum1:TArrInt;

 q1:TArrReal;

 Psi1:TArrArrInt;

 kChoose:integer;// number of choose chromosome

 xm:TArrArrReal;

 tm:TArrReal;

 um:TArrArrReal;

 f0,f1:real;

Procedure UpProgressBar;

Function TermStop:boolean;

//*********************************************************

                    IMPLEMENTATION

//*********************************************************

Uses Calc3, Calc5, Calc4, Unit6, Unit7, Unit8, Unit9, Unit10, TGAModelUnit,

 Unit3, Unit2, Unit14;

{$R *.dfm}

//*********************************************************

Procedure TForm1.Binaryoperations1Click(Sender: TObject);

Begin

 Form5:=TForm5.create(self);

 Form5.ShowModal;

End;

Procedure TForm1.Clear1Click(Sender: TObject);

Begin

 Memo1.Clear;

End;

//*********************************************************

Procedure TForm1.FormCreate(Sender: TObject);

var

 i:integer;

 j: Integer;

Begin

 randomize;

 ProgressBar1.top:=212;

 ProgressBar1.left:=0;

 ProgressBar1.width:=ClientWidth;

 Memo1.Top:=0;

 Memo1.Left:=0;

 Memo1.Height:=progressbar1.top;

 Memo1.Width:=ClientWidth;

 Memo1.ReadOnly:=true;

 Setlength(O1s1,kW1);

 Setlength(O2s1,kV1);

 Setlength(Pnum1,kP1);

 Setlength(Rnum1,kR1);

 Setlength(Dnum1,Mout1);

 Setlength(x01,n1);

 Setlength(umin1,m1);

 Setlength(umax1,m1);

 Setlength(q1,p1);

 Setlength(xm,ll1);

 Setlength(um,m1);

 Setlength(qymax1,ny1);

 Setlength(qymin1,ny1);

 Setlength(stepsqy1,ny1);

 for i:=0 to kW1-1 do

   O1s1[i]:=O1sc[i];

 for i:=0 to kV1-1 do

   O2s1[i]:=O2sc[i];

 for i:=0 to kP1-1 do

   Pnum1[i]:=Pnumc[i];

 for i:=0 to kR1-1 do

   Rnum1[i]:=Rnumc[i];

 for i:=0 to Mout1-1 do

   Dnum1[i]:=Dnumc[i];

 for i:=0 to p1-1 do

   q1[i]:=qc[i];

 for i:=0 to n1-1 do

   x01[i]:=x0c[i];

 for i:=0 to m1-1 do

   umin1[i]:=uminc[i];

 for i:=0 to m1-1 do

   umax1[i]:=umaxc[i];

 SetLength(Psi1,L1,L1);

 for i:=0 to L1-1 do

   for j:=0 to L1-1 do

     Psi1[i,j]:=PsiBasc[i,j];

 for i:= 0 to ny1-1 do

 begin

   qymin1[i]:=qyminc[i];

   qymax1[i]:=qymaxc[i];

   stepsqy1[i]:=stepsqyc[i];

 end;

End;

//*********************************************************

Procedure TForm1.GA1Click(Sender: TObject);

Begin

 Form6:=TForm6.create(self);

 Form6.ShowModal;

 Form8:=TForm8.Create(self);

 Form8.ShowModal;

 if Application.MessageBox('If the object for GA with NOP will be create then '

                           +'you cannot to change some paprameters. To create?',

                           'Creation of object',

                           MB_OKCANCEL+MB_ICONWARNING)=ID_OK then

 begin

   EA:=TUser.Create(hh1, pp1, rr1, nfu1, lchr1, p1, c1, d1, epo1,

                      kel1, alfa1, pmut1, L1, Mout1, kp1,

                      kr1, kw1, kv1,n1,m1,ll1,ny1);

   GA1.Enabled:=false;

   Geneticalgorithm1.Enabled:=true;

   ParametersofGA1.Enabled:=true;

   EA.EndGeneration:=UpProgressBar;

 end

 else

   exit;

End;

//*********************************************************

Procedure TForm1.GAforNOPParameters1Click(Sender: TObject);

Begin

 ProgressBar1.Max:=EA.PP;

 EA.GenAlgorithm;

 Paretoset1.Enabled:=true;

End;

//*********************************************************

Procedure TForm1.GAforParameters1Click(Sender: TObject);

Begin

 ProgressBar1.Max:=EA.PP;

 EA.GenAlgorithm1;

 Paretoset1.Enabled:=true;

End;

//*********************************************************

Procedure TForm1.Geneticalgorithm1Click(Sender: TObject);

Begin

 Form7:=TForm7.create(self);

 Form7.ShowModal;

 Optimization1.Enabled:=true;

 Expression1.Enabled:=true;

End;

//*********************************************************

Procedure TForm1.Latex1Click(Sender: TObject);

var

 i:integer;

Begin

 EA.NOP.PsitoTexStr;

 for i:=0 to L1-1 do

   memo1.Lines.Add(EA.NOP.zs[i]);

End;

//*********************************************************

Procedure TForm1.Model1Click(Sender: TObject);

const

 epsterm=1e-2;

var

 k,i,j:integer;

 tp:real;

Begin

 Form2:=TForm2.Create(self);

 Form2.ShowModal;

 EA.Initial;

 tp:=0;

 k:=0;

 EA.NOP.SetCs(q1);

 f0:=0;

 repeat

   if abs(EA.t-tp)<EA.dt/2 then

   begin

     k:=k+1;

     for i:=0 to ll1-1 do

       Setlength(xm[i],k);

     for i:=0 to m1-1 do

       Setlength(um[i],k);

     Setlength(tm,k);

     EA.Viewer;

     EA.NOP.Vs[0]:=EA.y[EA.n];//x[0];

     EA.NOP.Vs[1]:=EA.y[EA.n+1];//x[1];

     EA.NOP.Vs[2]:=EA.y[EA.n+2];//x[2];

     EA.NOP.Vs[3]:=EA.y[EA.n+3];//x[3];

     EA.NOP.RPControl;

     for i:=0 to m1-1 do

       EA.u[i]:=EA.NOP.z[EA.NOP.Dnum[i]];

     EA.OgrUpr;

     for i:=0 to ll1-1 do

       xm[i,k-1]:=EA.y[i];

     for i:=0 to m1-1 do

       um[i,k-1]:=EA.u[i];

     tm[k-1]:=EA.t;

     tp:=tp+dtp;

   end;

   EA.Viewer;

   EA.NOP.Vs[0]:=EA.y[EA.n];//x[0];

   EA.NOP.Vs[1]:=EA.y[EA.n+1];//x[1];

   EA.NOP.Vs[2]:=EA.y[EA.n+2];//x[2];

   EA.NOP.Vs[3]:=EA.y[EA.n+3];//[3];

   if f0<EA.y[EA.lv-1] then f0:=EA.y[EA.lv-1];

   EA.Euler2;

 until (EA.y[EA.n]<=xfc[0])or(EA.t>=EA.tf);

 if EA.y[EA.n]>xfc[0] then

    f1:=abs(EA.y[EA.n]-xfc[0])+abs(EA.y[EA.n+1]-xfc[1])

 else f1:=abs(EA.y[EA.n+1]-xfc[1]);

 Form11:=TForm11.create(self);

 Form11.ShowModal;

End;

Procedure TForm1.ParametersofGA1Click(Sender: TObject);

Begin

 Form9:=TForm9.create(self);

 Form9.ShowModal;

End;

Procedure TForm1.Parametersofmodel1Click(Sender: TObject);

Begin

 Form3:=TForm3.Create(self);

 Form3.ShowModal;

End;

//*********************************************************

Procedure TForm1.Paretoset1Click(Sender: TObject);

var

 i:integer;

Begin

 Form10:=TForm10.create(self);

 Form10.ShowModal;

 label1.Caption:=inttostr(kchoose);

 EA.ReadChromosome(kchoose,q1,Psi1);

End;

//*********************************************************

Procedure TForm1.Pascal1Click(Sender: TObject);

var

 i:integer;

Begin

 EA.NOP.PsitoPasStr;

 for i:=0 to L1-1 do

   memo1.Lines.Add(EA.NOP.zs[i]);

End;

//*********************************************************

Procedure TForm1.Savetofile1Click(Sender: TObject);

Begin

 if savedialog1.Execute then

   Memo1.Lines.SaveToFile(savedialog1.FileName);

End;

//*********************************************************

Procedure TForm1.Unaryoperations1Click(Sender: TObject);

Begin

 Form4:=TForm4.create(self);

 Form4.ShowModal;

End;

//*********************************************************

Procedure TForm1.Undefinedparameters1Click(Sender: TObject);

var

 i:integer;

Begin

 Form14:=TForm14.Create(Self);

 Form14.ShowModal;

 EA.Setqymin(qymin1);

 EA.Setqymax(qymax1);

 EA.Setstepsqy(stepsqy1);

 for i:=0 to ny1-1 do

   EA.ix[i]:=trunc((qymax1[i]-qymin1[i])/stepsqy1[i]);

 EA.Setixmax(EA.ix);

End;

//*********************************************************

Procedure UpProgressBar;

Begin

 Form1.ProgressBar1.StepIt;

 Form1.Refresh;

End;

{ TGANOPUser }

//*********************************************************

Constructor TUser.Create(hh1, pp1, rr1, nfu1, lchr1, p1, c1, d1, epo1,

                        kel1: integer; alfa1, pmut1: real; L1, Mout1,

                        kp1, kr1, kw1, kv1,n1,m1,ll1,ny1: integer);

Begin

 Inherited Create(hh1, pp1, rr1, nfu1, lchr1, p1, c1, d1, epo1,

                  kel1, alfa1, pmut1, L1, Mout1, kp1, kr1, kw1,

                  kv1,n1,m1,ll1,ny1);

End;

//*********************************************************

Procedure TUser.Func(var Fu: TArrReal);

var

 t1,FF:real;

 i:integer;

 flag:boolean;

Begin

 Initial;

 t1:=t;

 flag:=false;

 FF:=0;

 for i:=0 to NOP.kR-1 do

   NOP.Cs[i]:=q[i];

 repeat

   Viewer;

   NOP.Vs[0]:=y[n];//x[0];

   NOP.Vs[1]:=y[n+1];//x[1];

   NOP.Vs[2]:=y[n+2];//x[2];

   NOP.Vs[3]:=y[n+3];//x[3];

   NOP.RPControl;

   if y[lv-1]>FF then

     FF:=y[lv-1];

   Euler2;

 until (y[n]<=xfc[0])or(t>=tf);

 Fu[0]:=FF;

 if xfc[0]<y[n] then Fu[1]:=abs(xfc[1]-y[n+1])+abs(xfc[0]-y[n])

 else Fu[1]:=abs(xfc[1]-y[n+1]);

End;

procedure TUser.Initial;

begin

 x[0]:=x0[0];

 x[1]:=vc*cos(qy[0]);

 x[2]:=x0[2]+qy[1];

 x[3]:=vc*sin(qy[0]);

 t:=0;

end;

//*********************************************************

Procedure TUser.RP(t1:real;x1:TArrReal;var f1:TArrReal);

var

 i:integer;

 V2,QQ,NN,ro,V,GG,RR:Double;

Begin

 u[0]:=NOP.z[NOP.Dnum[0]];

 u[1]:=NOP.z[NOP.Dnum[1]];

 OgrUpr;

 RR:=sqrt(sqr(x1[0])+sqr(x1[2]));

 ro:=ro_0*exp(-bet*(RR-Rz));

 V2:=sqr(x1[1])+sqr(x1[3]);

 V:=sqrt(V2);

 QQ:=Cx*ro*V2/2/m_S;

//  QQ:=Cx*(1+u[0])*ro*V2/2/m_S;

 NN:=Cy*ro*V2/2/m_S;

 f1[0]:=x1[1];

 f1[1]:=-QQ*x1[1]/V-NN*x1[3]*cos(u[0])/V-g0*sqr(Rz/RR)*x1[0]/RR;

 f1[2]:=x1[3];

 f1[3]:=-QQ*x1[3]/V+NN*x1[1]*cos(u[0])/V-g0*sqr(Rz/RR)*x1[2]/RR;

 for i:=0 to n-1 do

   if abs(f1[i])>infinity then

     f1[i]:=Ro_10(f1[i])*infinity;

End;

Procedure TUser.Viewer;

var

 i:integer;

 V2,QQ,NN,ro,VV,GG,RR,xper,yper,zper:double;

Begin

//  Upr(t,u);

//  OgrUpr(u);

 RR:=sqrt(sqr(x[0])+sqr(x[2]));

 ro:=ro_0*exp(-bet*(RR-Rz));

 V2:=sqr(x[1])+sqr(x[3]);

 VV:=sqrt(sqr(x[1])+sqr(x[3]));

 QQ:=Cx*ro*V2/2/m_S;

//  QQ:=Cx*(1+u[0])*ro*V2/2/m_S;

 NN:=Cy*ro*V2/2/m_S;

 xper:=-QQ*x[1]/VV-NN*x[3]*cos(u[0])/VV-g0*sqr(Rz/RR)*x[0]/RR;

 yper:=-QQ*x[3]/VV+NN*x[1]*cos(u[0])/VV-g0*sqr(Rz/RR)*x[2]/RR;

 zper:=NN*sin(u[0]);

 for i:=0 to n-1 do

   y[i]:=x[i];

 y[n]:=RR-Rz;

 y[n+1]:=Rz*arctan(x[0]/x[2]);

 y[n+2]:=VV;

 y[n+3]:=sqrt(sqr(xper)+sqr(yper)+sqr(zper))/g0;

End;

//*********************************************************

Function TermStop:boolean;

var

 i:integer;

 sum:real;

Begin

 sum:=0;

 for i:=0 to EA.n-1 do

   sum:=sum+sqr(EA.x[i]-xfc[i]);

 if sqrt(sum)<epsterm then

   result:=true

 else

   result:=false;

End;

//*********************************************************

END.

unit Unit2;

//*********************************************************

                     INTERFACE

//*********************************************************

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Grids, UnitAdaptObjects;

type

 TForm2 = class(TForm)

   StringGrid1: TStringGrid;

   StringGrid2: TStringGrid;

   Edit1: TEdit;

   Label1: TLabel;

   Edit2: TEdit;

   Label2: TLabel;

   Edit3: TEdit;

   Label3: TLabel;

   Label4: TLabel;

   Button1: TButton;

   StringGrid3: TStringGrid;

   Label5: TLabel;

   Label6: TLabel;

   Button2: TButton;

   procedure Button2Click(Sender: TObject);

   procedure StringGrid1Click(Sender: TObject);

   procedure Button1Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form2: TForm2;

 perm,u0m,HonL:TArrArrReal;

//*********************************************************

                    IMPLEMENTATION

//*********************************************************

Uses Unit1, Unit15;

{$R *.dfm}

Procedure TForm2.Button1Click(Sender: TObject);

var

 i,j:integer;

Begin

 for i:=0 to L1-1 do

   for j:=0 to L1-1 do

     Psi1[i,j]:=strtoint(StringGrid1.Cells[j,i]);

 for i:=0 to p1-1 do

   q1[i]:=strtofloat(StringGrid2.Cells[1,i]);

 for i:=0 to p1-1 do

   q1[i]:=strtofloat(StringGrid2.Cells[1,i]);

 for i:=0 to ny1-1 do

   EA.qy[i]:=strtofloat(StringGrid3.Cells[1,i]);

 dt1:=strtofloat(Edit1.Text);

 tf1:=strtofloat(Edit3.Text);

 dtp:=strtofloat(Edit2.Text);

 EA.NOP.SetPsi(Psi1);

 EA.Setq(q1);

 EA.Setdt(dt1);

 EA.Settf(tf1);

 close;

End;

Procedure TForm2.Button2Click(Sender: TObject);

var

 k,i,j:integer;

 tp:real;

Begin

//  Form2:=TForm2.Create(self);

//  Form2.ShowModal;

 EA.Initial;

 tp:=0;

 k:=0;

 EA.NOP.SetCs(q1);

 f0:=0;

 repeat

   if abs(EA.t-tp)<EA.dt/2 then

   begin

     k:=k+1;

     for i:=0 to ll1-1 do

       Setlength(xm[i],k);

     for i:=0 to m1-1 do

       Setlength(um[i],k);

     Setlength(tm,k);

     EA.Viewer;

     EA.NOP.Vs[0]:=EA.x[0];

     EA.NOP.Vs[1]:=EA.x[1];

     EA.NOP.Vs[2]:=EA.x[2];

     EA.NOP.Vs[3]:=EA.x[3];

{

     EA.NOP.Vs[0]:=xfc[0]-EA.y[4];

     EA.NOP.Vs[1]:=xfc[1]-EA.y[5];

     EA.NOP.Vs[2]:=(EA.x[0]*EA.x[1]+EA.x[2]*EA.x[3])/(EA.y[4]+Rz);

     EA.NOP.Vs[3]:=Rz*(EA.x[0]*EA.x[3]-EA.x[2]*EA.x[1])/(EA.y[4]+Rz);

}

     EA.NOP.RPControl;

     EA.u[0]:=EA.NOP.z[EA.NOP.Dnum[0]];

     EA.OgrUpr;

     for i:=0 to ll1-1 do

       xm[i,k-1]:=EA.y[i];

     for i:=0 to m1-1 do

       um[i,k-1]:=EA.u[i];

     tm[k-1]:=EA.t;

     tp:=tp+dtp;

   end;

   EA.Viewer;

   EA.NOP.Vs[0]:=EA.x[0];

   EA.NOP.Vs[1]:=EA.x[1];

   EA.NOP.Vs[2]:=EA.x[2];

   EA.NOP.Vs[3]:=EA.x[3];

{    EA.NOP.Vs[0]:=xfc[0]-EA.y[4];

   EA.NOP.Vs[1]:=xfc[1]-EA.y[5];

   EA.NOP.Vs[2]:=(EA.x[0]*EA.x[1]+EA.x[2]*EA.x[3])/(EA.y[4]+Rz);

   EA.NOP.Vs[3]:=Rz*(EA.x[0]*EA.x[3]-EA.x[2]*EA.x[1])/(EA.y[4]+Rz); }

   if f0<EA.y[EA.lv-1] then f0:=EA.y[EA.lv-1];

   EA.Euler2;

 until (EA.y[EA.n]<xfc[0])or(EA.t>=EA.tf);

 if EA.y[EA.n]<xfc[0] then

    f1:=sqrt(sqr(EA.y[EA.n]-xfc[0])+sqr(EA.y[EA.n+1]-xfc[1]))

 else f1:=infinity;

 Form15:=TForm15.create(self);

 Form15.ShowModal;

End;

Procedure TForm2.FormCreate(Sender: TObject);

var

 i,j:integer;

Begin

 color:=RGB(180,240,180);

 StringGrid1.ColCount:=L1;

 StringGrid1.RowCount:=L1;

 for i:=0 to L1-1 do

   for j:=0 to L1-1 do

     StringGrid1.Cells[j,i]:=inttostr(Psi1[i,j]);

 StringGrid2.ColWidths[1]:=96;

 StringGrid2.RowCount:=p1;

 for i:=0 to p1-1 do

 begin

   StringGrid2.Cells[0,i]:=inttostr(i);

   StringGrid2.Cells[1,i]:=floattostrf(q1[i],ffFixed,8,5);

 end;

 StringGrid3.ColWidths[1]:=96;

 StringGrid3.RowCount:=ny1;

 for i:=0 to ny1-1 do

 begin

   StringGrid3.Cells[0,i]:=inttostr(i);

   StringGrid3.Cells[1,i]:=floattostrf(qymin1[i],ffFixed,8,5);

 end;

 Edit1.Text:=floattostr(dt1);

 Edit2.Text:=floattostr(dtp);

 Edit3.Text:=floattostr(tf1);

End;

Procedure TForm2.StringGrid1Click(Sender: TObject);

Begin

 Label4.Caption:='Psi['+inttostr(StringGrid1.Row)+','+

    Inttostr(StringGrid1.Col)+']';

End;

END.

unit Unit3;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Grids;

type

 TForm3 = class(TForm)

   StringGrid1: TStringGrid;

   StringGrid2: TStringGrid;

   Label1: TLabel;

   Label2: TLabel;

   Edit1: TEdit;

   Edit2: TEdit;

   Label3: TLabel;

   Label4: TLabel;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form3: TForm3;

implementation

Uses Unit1;

{$R *.dfm}

Procedure TForm3.Button1Click(Sender: TObject);

var

 i:integer;

Begin

 for i:=0 to EA.n-1 do

   x01[i]:=strtofloat(StringGrid1.Cells[1,i]);

 for i:=1 to EA.m do

 begin

   umin1[i-1]:=strtofloat(StringGrid2.Cells[1,i]);

   umax1[i-1]:=strtofloat(StringGrid2.Cells[2,i]);

 end;

 dt1:=strtofloat(Edit1.Text);

 tf1:=strtofloat(Edit2.Text);

 EA.Setx0(x01);

 EA.Setuogr(umin1,umax1);

 EA.Setdt(dt1);

 EA.Settf(tf1);

 close;

End;

Procedure TForm3.FormCreate(Sender: TObject);

var

 i:integer;

Begin

 color:=RGB(200,110,210);

 StringGrid1.RowCount:=EA.n;

 StringGrid1.ColWidths[1]:=96;

 for i:=0 to EA.n-1 do

 begin

   StringGrid1.Cells[0,i]:=inttostr(i);

   StringGrid1.Cells[1,i]:=floattostrf(x01[i],ffFixed,8,4);

 end;

 StringGrid2.RowCount:=EA.m+1;

 StringGrid2.ColWidths[1]:=96;

 StringGrid2.ColWidths[2]:=96;

 StringGrid2.Cells[1,0]:='umin';

 StringGrid2.Cells[2,0]:='umax';

 for i:=1 to EA.m do

 begin

   StringGrid2.Cells[0,i]:=inttostr(i-1);

   StringGrid2.Cells[1,i]:=floattostrf(umin1[i-1],ffFixed,8,4);

   StringGrid2.Cells[2,i]:=floattostrf(umax1[i-1],ffFixed,8,4);

 end;

 Edit1.Text:=floattostrf(dt1,ffFixed,6,4);

 Edit2.Text:=floattostrf(tf1,ffFixed,6,4);

End;

END.

unit Unit6;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TForm6 = class(TForm)

   Edit1: TEdit;

   Label1: TLabel;

   Edit2: TEdit;

   Label2: TLabel;

   Edit3: TEdit;

   Label3: TLabel;

   Edit4: TEdit;

   Label4: TLabel;

   Edit5: TEdit;

   Label5: TLabel;

   Label6: TLabel;

   Edit6: TEdit;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form6: TForm6;

implementation

Uses Unit1;

{$R *.dfm}

Procedure TForm6.Button1Click(Sender: TObject);

Begin

 L1:=strtoint(Edit1.Text);

 kp1:=strtoint(Edit2.Text);

 kr1:=strtoint(Edit3.Text);

 kw1:=strtoint(Edit4.Text);

 kv1:=strtoint(Edit5.Text);

 Mout1:=strtoint(Edit6.Text);

 close;

End;

Procedure TForm6.FormCreate(Sender: TObject);

Begin

 color:=RGB(200,250,200);

 Edit1.Text:=inttostr(L1);   // dimension of network operator matrix

 Edit2.Text:=inttostr(kp1);  //cardinal of set of variables

 Edit3.Text:=inttostr(kr1);  //cardinel of set of parameters

 Edit4.Text:=inttostr(kw1);  //cardinal of set of unary operations

 Edit5.Text:=inttostr(kv1);  //cardinal of set of binary operations

 Edit6.Text:=inttostr(Mout1);// number of outputs

End;

end.

unit Unit7;

//*********************************************************

                     INTERFACE

//*********************************************************

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics,

 Controls, Forms, Dialogs, StdCtrls, Grids;

type

 TForm7 = class(TForm)

   StringGrid1: TStringGrid;

   StringGrid2: TStringGrid;

   Label1: TLabel;

   Label2: TLabel;

   StringGrid3: TStringGrid;

   StringGrid4: TStringGrid;

   StringGrid5: TStringGrid;

   Label3: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   StringGrid6: TStringGrid;

   Label6: TLabel;

   Label7: TLabel;

   StringGrid7: TStringGrid;

   Label8: TLabel;

   Button1: TButton;

   Button2: TButton;

   Memo1: TMemo;

   SaveDialog1: TSaveDialog;

   Button3: TButton;

   OpenDialog1: TOpenDialog;

   Button4: TButton;

   procedure Button4Click(Sender: TObject);

   procedure Button3Click(Sender: TObject);

   procedure Button2Click(Sender: TObject);

   procedure Button1Click(Sender: TObject);

   procedure StringGrid6Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

const

 Cyfr:set of char=['0'..'9'];

var

 Form7: TForm7;

//*********************************************************

                    IMPLEMENTATION

//*********************************************************

Uses Unit1;

{$R *.dfm}

Procedure TForm7.Button1Click(Sender: TObject);

var

 i,j:integer;

Begin

 for i:=0 to kW1-1 do

   O1s1[i]:=strtoint(StringGrid1.Cells[i,0]);

 for i:=0 to kV1-1 do

   O2s1[i]:=strtoint(StringGrid2.Cells[i,0]);

 for i:=0 to kp1-1 do

   Pnum1[i]:=strtoint(StringGrid3.Cells[i,0]);

 for i:=0 to kr1-1 do

   Rnum1[i]:=strtoint(StringGrid4.Cells[i,0]);

 for i:=0 to Mout1-1 do

   Dnum1[i]:=strtoint(StringGrid5.Cells[i,0]);

 for i:=0 to L1-1 do

   for j:=0 to L1-1 do

     Psi1[i,j]:=strtoint(StringGrid6.Cells[j,i]);

 for i:=0 to p1-1 do

   q1[i]:=strtofloat(StringGrid7.Cells[1,i]);

 EA.NOP.SetO1s(O1s1);

 EA.NOP.SetO2s(O2s1);

 EA.NOP.SetPnum(Pnum1);

 EA.NOP.SetRnum(Rnum1);

 EA.NOP.SetDnum(Dnum1);

 EA.NOP.SetPsi(Psi1);

 EA.Setq(q1);

 Close;

End;

Procedure TForm7.Button2Click(Sender: TObject);

var

 i,j:integer;

 s:string;

Begin

 Savedialog1.FileName:='Psi.txt';

 if Savedialog1.Execute then

 begin

   Memo1.clear;

   Memo1.Lines.Add('*******************');

   Memo1.Lines.Add(label1.Caption);

   s:='';

   for j:=0 to StringGrid1.ColCount-1 do

     s:=s+StringGrid1.Cells[j,0]+' ';

   Memo1.Lines.Add(s);

   Memo1.Lines.Add('*******************');

   Memo1.Lines.Add(label2.Caption);

   s:='';

   for j:=0 to StringGrid2.ColCount-1 do

     s:=s+StringGrid2.Cells[j,0]+' ';

   Memo1.Lines.Add(s);

   Memo1.Lines.Add('*******************');

   Memo1.Lines.Add(label3.Caption);

   s:='';

   for j:=0 to StringGrid3.ColCount-1 do

     s:=s+StringGrid3.Cells[j,0]+' ';

   Memo1.Lines.Add(s);

   Memo1.Lines.Add('*******************');

   Memo1.Lines.Add(label4.Caption);

   s:='';

   for j:=0 to StringGrid4.ColCount-1 do

     s:=s+StringGrid4.Cells[j,0]+' ';

   Memo1.Lines.Add(s);

   Memo1.Lines.Add('*******************');

   Memo1.Lines.Add(label5.Caption);

   s:='';

   for j:=0 to StringGrid5.ColCount-1 do

     s:=s+StringGrid5.Cells[j,0]+' ';

   Memo1.Lines.Add(s);

   Memo1.Lines.Add('*******************');

   Memo1.Lines.Add(label6.Caption);

   for i:=0 to StringGrid6.RowCount-1 do

   begin

     s:='';

     for j:=0 to StringGrid6.ColCount-1 do

       s:=s+StringGrid6.Cells[j,i]+' ';

     Memo1.Lines.Add(s);

   end;

   Memo1.Lines.Add('*******************');

   Memo1.Lines.Add(Label8.Caption);

   for i:=0 to StringGrid7.RowCount-1 do

     Memo1.Lines.Add(StringGrid7.Cells[1,i]);

   Memo1.Lines.SaveToFile(Savedialog1.FileName);

   Memo1.Clear;

   for i:=0 to StringGrid6.RowCount-1 do

   begin

     s:='';

     for j:=0 to StringGrid6.ColCount-1 do

       s:=s+StringGrid6.Cells[j,i]+' ';

     Memo1.Lines.Add(s);

   end;

   Memo1.Lines.SaveToFile('Psi00.txt');

   Memo1.Clear;

   for i:=0 to StringGrid7.RowCount-1 do

     Memo1.Lines.Add(StringGrid7.Cells[1,i]);

   Memo1.Lines.SaveToFile('q00.txt');

 end;

End;

Procedure TForm7.Button3Click(Sender: TObject);

var

 i,j,k:integer;

 s,s1:string;

Begin

 if OpenDialog1.Execute then

 begin

   memo1.Lines.LoadFromFile(OpenDialog1.FileName);

   for i:=0 to L1-1 do

   begin

     s:=memo1.Lines[i];

     k:=1;

     for j:=0 to L1-1 do

     begin

       s1:='';

       while s[k] in Cyfr do

       begin

         s1:=s1+s[k];

         k:=k+1;

       end;

       if s[k]=' ' then

         StringGrid6.Cells[j,i]:=s1;

       k:=k+1;

       while (k<length(s))and(s[k]=' ') do k:=k+1;

     end;

   end;

 end;

End;

Procedure TForm7.Button4Click(Sender: TObject);

var

 i,j:integer;

 s:string;

Begin

 if Opendialog1.Execute then

 begin

   memo1.Clear;

   memo1.Lines.LoadFromFile(Opendialog1.FileName);

   for i:=0 to p1-1 do

     stringGrid7.cells[1,i]:=memo1.Lines[i];

 end;

End;

Procedure TForm7.FormCreate(Sender: TObject);

var

 i,j:integer;

Begin

 color:=RGB(240,240,100);

 StringGrid1.ColCount:=kw1;

 StringGrid2.ColCount:=kv1;

 StringGrid3.ColCount:=kp1;

 StringGrid4.ColCount:=kr1;

 StringGrid5.ColCount:=Mout1;

 StringGrid6.ColCount:=L1;

 StringGrid6.RowCount:=L1;

 StringGrid7.RowCount:=p1;

 for i:=0 to p1-1 do

   StringGrid7.Cells[0,i]:=inttostr(i);

 StringGrid7.ColWidths[1]:=108;

 for i:=0 to kW1-1 do

   StringGrid1.Cells[i,0]:=inttostr(O1s1[i]);

 for i:=0 to kV1-1 do

   StringGrid2.Cells[i,0]:=inttostr(O2s1[i]);

 for i:=0 to kP1-1 do

   StringGrid3.Cells[i,0]:=inttostr(Pnum1[i]);

 for i:=0 to kR1-1 do

   StringGrid4.Cells[i,0]:=inttostr(Rnum1[i]);

 for i:=0 to Mout1-1 do

   StringGrid5.Cells[i,0]:=inttostr(Dnum1[i]);

 for i:=0 to L1-1 do

   for j:=0 to L1-1 do

     StringGrid6.Cells[j,i]:=inttostr(Psi1[i,j]);

 for i:=0 to p1-1 do

   stringgrid7.Cells[1,i]:=floattostrf(q1[i],ffFixed,8,5);

End;

Procedure TForm7.StringGrid6Click(Sender: TObject);

Begin

 Label7.Caption:='Psi['+inttostr(StringGrid6.Row)+','+

                 inttostr(StringGrid6.Col)+']';

End;

END.

unit Unit8;

//*********************************************************

                     INTERFACE

//*********************************************************

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TForm8 = class(TForm)

   Edit1: TEdit;

   Label1: TLabel;

   Edit2: TEdit;

   Label2: TLabel;

   Edit3: TEdit;

   Label3: TLabel;

   Edit4: TEdit;

   Label4: TLabel;

   Edit5: TEdit;

   Label5: TLabel;

   Edit6: TEdit;

   Label6: TLabel;

   Edit7: TEdit;

   Label7: TLabel;

   Edit8: TEdit;

   Label8: TLabel;

   Edit9: TEdit;

   Label9: TLabel;

   Edit10: TEdit;

   Label10: TLabel;

   Edit11: TEdit;

   Label11: TLabel;

   Edit12: TEdit;

   Label12: TLabel;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form8: TForm8;

//*********************************************************

                    IMPLEMENTATION

//*********************************************************

Uses Unit1;

{$R *.dfm}

Procedure TForm8.Button1Click(Sender: TObject);

Begin

 hh1:=strtoint(Edit1.Text);

 pp1:=strtoint(Edit2.Text);

 rr1:=strtoint(Edit3.Text);

 nfu1:=strtoint(Edit4.Text);

 lchr1:=strtoint(Edit5.Text);

 p1:=strtoint(Edit6.Text);

 c1:=strtoint(Edit7.Text);

 d1:=strtoint(Edit8.Text);

 Epo1:=strtoint(Edit9.Text);

 kel1:=strtoint(Edit10.Text);

 alfa1:=strtofloat(Edit11.Text);

 pmut1:=strtofloat(Edit12.Text);

 close;

End;

Procedure TForm8.FormCreate(Sender: TObject);

Begin

 color:=RGB(250,100,250);

 Edit1.Text:=inttostr(hh1);   //number of chromosomes in an initial population

 Edit2.Text:=inttostr(pp1);   // number of generations

 Edit3.Text:=inttostr(rr1);   // number of couples in one generation

 Edit4.Text:=inttostr(nfu1);  // number of functionals

 Edit5.Text:=inttostr(lchr1); // number of variations in one chromosome

 Edit6.Text:=inttostr(p1);    // number of serching parameters

 Edit7.Text:=inttostr(c1);    // number of bits for integer part

 Edit8.Text:=inttostr(d1); // number of bits for fractional part

 Edit9.Text:=inttostr(Epo1);//number of ganerations between exchange of basic NOM

 Edit10.Text:=inttostr(kel1);  // number of elitaring chromosomes

 Edit11.Text:=floattostr(alfa1);  // parameter for crossover

 Edit12.Text:=floattostr(pmut1);  // probability of mutation

End;

END.

unit Unit9;

//*********************************************************

                     INTERFACE

//*********************************************************

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TForm9 = class(TForm)

   Edit1: TEdit;

   Label1: TLabel;

   Edit2: TEdit;

   Label2: TLabel;

   Label3: TLabel;

   Edit3: TEdit;

   Edit4: TEdit;

   Label4: TLabel;

   Edit5: TEdit;

   Label5: TLabel;

   Edit6: TEdit;

   Label6: TLabel;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form9: TForm9;

//*********************************************************

                    IMPLEMENTATION

//*********************************************************

Uses Unit1;

{$R *.dfm}

Procedure TForm9.Button1Click(Sender: TObject);

Begin

 pp1:=strtoint(Edit1.Text);

 rr1:=strtoint(Edit2.Text);

 Epo1:=strtoint(Edit3.Text);

 kel1:=strtoint(Edit4.Text);

 alfa1:=strtofloat(Edit5.Text);

 pmut1:=strtofloat(Edit6.Text);

 EA.PP:=pp1;

 EA.RR:=rr1;

 EA.Epo:=Epo1;

 EA.kel:=kel1;

 EA.alfa:=alfa1;

 EA.pmut:=pmut1;

 close;

End;

Procedure TForm9.FormCreate(Sender: TObject);

Begin

 color:=RGB(220,100,250);

 Edit1.Text:=inttostr(pp1);

 Edit2.Text:=inttostr(rr1);

 Edit3.Text:=inttostr(Epo1);

 Edit4.Text:=inttostr(kel1);

 Edit5.Text:=floattostr(alfa1);

 Edit6.Text:=floattostr(pmut1);

End;

END.

unit TGAModelUnit;

interface

uses

 Windows, Messages, SysUtils,

 Variants, Classes, Graphics,

 Controls, Forms,

 Dialogs, ComCtrls, StdCtrls,

 TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type

 TForm11 = class(TForm)

   Chart1: TChart;

   Series1: TLineSeries;

   ListBox1: TListBox;

   Button4: TButton;

   SaveDialog1: TSaveDialog;

   ComboBox1: TComboBox;

   ComboBox2: TComboBox;

   Label2: TLabel;

   Label3: TLabel;

   Button6: TButton;

   Label1: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   Series2: TLineSeries;

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

   procedure ListBox1Click(Sender: TObject);

   procedure Button4Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure Button6Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

//  TArrReal=array of real;

var

 Form11: TForm11;

implementation

uses unit1;

{$R *.dfm}

Procedure TForm11.ListBox1Click(Sender: TObject);

Begin

 label1.Caption:='t='+floattostrf(tm[listbox1.itemindex],ffFixed,8,4);

End;

Procedure TForm11.Button1Click(Sender: TObject);

const

 deltc=0.1;

var

 i:integer;

 x,y,alf:real;

Begin

 Series2.Clear;

 Series2.XValues.Order:=loNone;

 if (Combobox1.ItemIndex=3)and(Combobox2.ItemIndex=1) then

 begin

   alf:=0;

   repeat

     x:=EA.qy[1]*cos(alf)+EA.qy[0];

     y:=EA.qy[1]*sin(alf);

     alf:=alf+deltc;

     series2.AddXY(x,y);

   until alf>2*pi+deltc;

 end;

 if (Combobox1.ItemIndex=5)and(Combobox2.ItemIndex=1) then

 begin

   x:=EA.qy[0]-EA.qy[1];

   y:=0;

   series2.AddXY(x,y);

   x:=EA.qy[0]-EA.qy[1];

   y:=EA.qy[2];

   series2.AddXY(x,y);

   x:=EA.qy[0]+EA.qy[1];

   y:=EA.qy[2];

   series2.AddXY(x,y);

   x:=EA.qy[0]+EA.qy[1];

   y:=0;

   series2.AddXY(x,y);

 end;

End;

Procedure TForm11.Button4Click(Sender: TObject);

Begin

 if savedialog1.execute then

   Chart1.SaveToBitmapFile(savedialog1.FileName);

End;

Procedure TForm11.FormCreate(Sender: TObject);

var

 i:integer;

Begin

 Color:=RGB(200,170,220);

 ComboBox1.Clear;

 ComboBox2.Clear;

 ComboBox1.Items.Add('t');

 ComboBox2.Items.Add('t');

 for i:=0 to EA.lv-1 do

 begin

   ComboBox1.Items.Add('x['+inttostr(i)+']');

   ComboBox2.Items.Add('x['+inttostr(i)+']');

 end;

 for i:=0 to EA.m-1 do

 begin

   ComboBox1.Items.Add('u['+inttostr(i)+']');

   ComboBox2.Items.Add('u['+inttostr(i)+']');

 end;

 ComboBox1.ItemIndex:=1;

 ComboBox2.ItemIndex:=0;

 Label4.Caption:='F1='+floattostrf(f0,ffGeneral,8,5);

 Label5.Caption:='F2='+floattostrf(f1,ffGeneral,8,5);

End;

Procedure TForm11.Button6Click(Sender: TObject);

var

 i:integer;

 argm,funm:array of real;

Begin

 setlength(argm,length(tm));

 setlength(funm,length(tm));

 if Combobox1.ItemIndex=0 then

   for i:=0 to high(tm) do

     funm[i]:=tm[i]

 else

   if ComboBox1.ItemIndex<=EA.lv then

     for i:=0 to high(tm) do

       funm[i]:=xm[ComboBox1.itemindex-1,i]

   else

     for i:=0 to high(tm) do

       funm[i]:=um[ComboBox1.itemindex-EA.lv-1,i];

 if Combobox2.ItemIndex=0 then

   for i:=0 to high(tm) do

     argm[i]:=tm[i]

 else

   if ComboBox2.ItemIndex<=EA.lv then

     for i:=0 to high(tm) do

       argm[i]:=xm[ComboBox2.itemindex-1,i]

   else

     for i:=0 to high(tm) do

       argm[i]:=um[ComboBox2.itemindex-EA.lv-1,i];

 Series1.Clear;

 Series2.Clear;

 Series1.XValues.Order:=loNone;

 for i:=0 to high(tm) do

   Series1.AddXY(argm[i],funm[i]);

 ListBox1.Clear;

 for i:=0 to high(tm) do

   ListBox1.Items.Add(FloattoStrf(funm[i],ffGeneral,10,5));

End;

END.

unit Calc3;

interface

const

 infinity=1e8;

 eps=1e-8;

 pokmax=16;

function Ro_1(z:real):real;

function Ro_2(z:real):real;

function Ro_3(z:real):real;

function Ro_4(z:real):real;

function Ro_5(z:real):real;

function Ro_6(z:real):real;

function Ro_7(z:real):real;

function Ro_8(z:real):real;

function Ro_9(z:real):real;

function Ro_10(z:real):real;

function Ro_11(z:real):real;

function Ro_12(z:real):real;

function Ro_13(z:real):real;

function Ro_14(z:real):real;

function Ro_15(z:real):real;

function Ro_16(z:real):real;

function Ro_17(z:real):real;

function Ro_18(z:real):real;

function Ro_19(z:real):real;

function Ro_20(z:real):real;

function Ro_21(z:real):real;

function Ro_22(z:real):real;

function Ro_23(z:real):real;

function Ro_24(z:real):real;

function Xi_0(z1,z2:real):real;

function Xi_1(z1,z2:real):real;

function Xi_2(z1,z2:real):real;

function Xi_3(z1,z2:real):real;

function Xi_4(z1,z2:real):real;

implementation

function Ro_1(z:real):real;

Begin

 result:=z;

End;

function Ro_2(z:real):real;

Begin

 if abs(z)>sqrt(infinity) then result:=infinity

 else result:=sqr(z);

End;

function Ro_3(z:real):real;

Begin

 result:=-z;

End;

function Ro_4(z:real):real;

Begin

 result:=Ro_10(z)*sqrt(abs(z));

End;

Function Ro_5(z:real):real;

Begin

 if abs(z)>eps then result:=1/z

   else result:=Ro_10(z)/eps;

End;

function Ro_6(z:real):real;

Begin

 if z>-ln(eps) then result:=-ln(eps)

 else result:=exp(z);

End;

function Ro_7(z:real):real;

Begin

 if abs(z)<exp(-pokmax) then result:=ln(eps)

   else result:=ln(abs(eps));

End;

function Ro_8(z:real):real;

Begin

 if abs(z)>-ln(eps) then

   result:=Ro_10(z)

 else

   result:=(1-exp(-z))/(1+exp(-z));

End;

function Ro_9(z:real):real;

Begin

 if z>=0 then result:=1

   else result:=0;

End;

function Ro_10(z:real):real;

Begin

  if z>=0 then result:=1

  else

     result:=-1;

End;

function Ro_11(z:real):real;

Begin

 result:=cos(z);

End;

function Ro_12(z:real):real;

Begin

 result:=sin(z);

End;

function Ro_13(z:real):real;

Begin

 result:=arctan(z);

End;

function Ro_14(z:real):real;

Begin

 if abs(z)>Ro_15(infinity) then result:=Ro_10(z)*infinity

 else result:=sqr(z)*z;

End;

function Ro_15(z:real):real;

Begin

 if abs(z)<eps then result:=Ro_10(z)*eps

 else

   result:=Ro_10(z)*exp(ln(abs(z))/3);

End;

function Ro_16(z:real):real;

Begin

 if abs(z)<1 then result:=z

 else result:=Ro_10(z);

End;

function Ro_17(z:real):real;

Begin

 result:=Ro_10(z)*ln(abs(z)+1);

End;

function Ro_18(z:real):real;

Begin

 if abs(z)>-ln(eps) then

   result:=Ro_10(z)*infinity

 else

   result:=Ro_10(z)*(exp(abs(z))-1);

End;

function Ro_19(z:real):real;

Begin

 if abs(z)>-ln(eps) then result:=0

 else result:=Ro_10(z)*exp(-abs(z));

End;

function Ro_20(z:real):real;

Begin

 if z>eps then result:=1

 else

   if z<0 then result:=-1

   else result:=3*z/sqr(eps)-2*Ro_14(z)/sqr(eps)/eps;

End;

function Ro_21(z:real):real;

Begin

 if z>eps/2 then result:=1

 else

   if z<-eps/2 then result:=-1

   else result:=3*z/sqr(eps)-4*Ro_14(z)/sqr(eps)/eps;

End;

function Ro_22(z:real):real;

Begin

 if abs(z)>-ln(eps) then result:=0

 else  result:=exp(abs(z));

End;

function Ro_23(z:real):real;

Begin

 if abs(z)>1/eps then result:=-Ro_10(z)/eps

 else  result:=z-z*sqr(z);

End;

function Ro_24(z:real):real;

Begin

 if z>-ln(eps) then result:=eps/(1+eps)

 else  result:=1/(1+exp(-z));

End;

function Xi_0(z1,z2:real):real;

Begin

 result:=z1+z2;

End;

function Xi_1(z1,z2:real):real;

Begin

 result:=z1*z2;

End;

function Xi_2(z1,z2:real):real;

Begin

 if z1>=z2 then result:=z1

 else result:=z2;

End;

function Xi_3(z1,z2:real):real;

Begin

 if z1<z2 then result:=z1

 else result:=z2;

End;

function Xi_4(z1,z2:real):real;

Begin

 result:=z1+z2-z1*z2;

End;

function Xi_5(z1,z2:real):real;

Begin

 result:=sqrt(sqr(z1)+sqr(z2));

End;

function Xi_6(z1,z2:real):real;

Begin

 result:=abs(z1)+abs(z2);

End;

function Xi_7(z1,z2:real):real;

Begin

 result:=Xi_2(abs(z1),abs(z2));

End;

END.

Unit UnitAdaptObjects;

//*********************************************************

                     INTERFACE

//*********************************************************

Uses Calc3,SysUtils;

type

 TArrInt=array of integer;

 TArrArrInt=array of TArrInt;

 TArr4Int=array [0..3]of integer;

 TArrArr4Int=array of TArr4Int;

 TArrArrArr4int=array of TArrArr4Int;

 TArrReal=array of real;

 TArrArrReal=array of TArrReal;

 TArrString=array of string;

 TProc=Procedure;

 TNetOper=class(TObject)

   L:integer; //dimention of network operator matrix

   Mout:integer;//number of outputs

   Vs:TArrReal;//set of variables

   Cs:TArrReal;//set of parameters

   O1s:TArrInt;//set of unary operations

   O2s:TArrInt;//set of binary operations

   kP:integer;//cardinal of the set of variables

   kR:integer;//cardinal of the set of parameters

   kW:integer;//cardinal of the set of unary operations

   kV:integer;//cardinal of the set of binary operations

   Pnum:TArrInt;//vector of number nodes for variables

   Rnum:TArrInt;//vector of number nodes for parameters

   Dnum:TArrInt;//vector of number nodes for outputs

   z:TArrReal;//vector of nodes

   zs:TArrString;//string for mathematical expression

   Psi,Psi0:TArrArrInt;//Network  operator matrices

   Constructor Create(L1,Mout1,kp1,kr1,kw1,kv1:integer);//create of NOP

   Procedure SetVs(vs1:TArrReal);

   Procedure SetCs(cs1:TArrReal);

   Procedure SetO1s(o1s1:TArrInt);

   Procedure SetO2s(o2s1:TArrInt);

   Procedure SetPnum(pnum1:TArrInt);

   Procedure SetRnum(rnum1:TArrInt);

   Procedure SetDnum(dnum1:TArrInt);

   Procedure SetPsiBas(Psi1:TArrArrInt);

   Procedure SetPsi(Psi1:TArrArrInt);

   Procedure GenVar(var w:TArr4Int);

   Procedure Variations(w:TArr4Int);

   Procedure RPControl;

   Procedure PsitoPas;

   Procedure PsitoTex;

   Procedure PsitoPasStr;

   Procedure PsitoTexStr;

   Procedure ReadPsi(var Psi1:TArrArrInt);

   Procedure ReadPsi0(var Psi1:TArrArrInt);

 end;

 TGANOP=class(TObject)

   PopChrStr:TArrArrArr4Int;//array for structural parts of chromosomes

   PopChrPar:TArrArrInt;//array for perametrical parts of chromosomes

   HH:integer;// number of cromosomes in initial population

   RR:integer;// number of couples in one generation

   PP:integer;// number of generations

   nfu:integer;//number of functionals

   lchr:integer;//length of structural part of chromosome

   Epo:integer;//number of generations between epochs

   kel:integer;//number of elitared chromosomes

   Fuh:TArrArrReal;// values of functionals for each chromosome

   Lh:TArrInt;// values distance to Pareto set

   Pareto:TArrInt;// Pareto set

   Son1s,Son2s,Son3s,Son4s:TArrArr4Int;//structural part of sons

   Son1p,Son2p,Son3p,Son4p:TArrInt;//parametrical part of sons

   L1,L2,L3,L4:integer;//values distance to Pareto set for sons

   Fu1,Fu2,Fu3,Fu4:TArrReal;// values of functionals for sons

   alfa:real;//parameter for select of parents

   pmut:real;//probability of mutation

   NOP:TNetOper;// Network operator

   p:integer;//number of parameters

   c:integer;// number of bit for integer part

   d:integer;// number of bit for fractional part

   q:TArrReal;//vector of parameters

   zb:TArrInt;//additional vector

   EndGeneration:TProc;

   Constructor Create(hh1,pp1,rr1,nfu1,lchr1,p1,c1,d1,

                      Epo1,kel1:integer;alfa1,pmut1:real;

                      L1,Mout1,kp1,kr1,kw1,kv1:integer);

   Procedure GenAlgorithm;// genetic algorithm for structural-parametrical optimization

   Procedure GenAlgorithm1;// genetic algorithm for parametrical optimization

   Function Rast(Fu:TArrReal):integer;//distance to Pareto set

   Procedure GreytoVector(y:TArrInt);

   Procedure VectortoGrey(var y: TArrInt);

   Procedure ChoosePareto;

   Procedure ImproveChrom(q:TArrReal;var StrChrom: TArrArr4Int);

   Procedure Setq(q1:TArrReal);

   Procedure ReadFunc(k:integer;var Fu1:TArrReal);

   Procedure Readq(var q1:TArrReal);

   Procedure ReadChromosome(k:integer;var q1:TArrReal;var Psi1:TArrArrInt);

   Procedure Func0(var Fu:TArrReal); virtual;//Values of functionals

 end;

 TModel=class(TGANOP)

   x:TArrReal;// vector of condition

   qy:TArrReal;//vextor of undefined parameters

   x0:TArrReal;// vector of initial condition

   xs:TArrReal;//

   fb:TArrReal;

   fa:TArrReal;

   su:TArrReal;

   su1:TArrReal;

   u:TArrReal;// vector of control

   umin:TArrReal;// vector of control

   umax:TArrReal;// vector of control

   y:TArrReal;// vector of vewing

   n:integer;

   ny:integer;//dimention of undefined parameters

   qymax,qymin:TArrReal;

   ix,ixmax:TArrInt;

   stepsqy:TArrReal;//vector of steps of undefine parameters

   m:integer;

   lv:integer;

   dt:real;

   t:real;

   tf:real;

   Constructor Create(hh1,pp1,rr1,nfu1,lchr1,p1,c1,d1,

                      Epo1,kel1:integer;alfa1,pmut1:real;

                      L1,Mout1,kp1,kr1,kw1,kv1,n1,m1,ll1,ny1:integer);

   Procedure Euler2;

   Procedure Func(var Fu:TArrReal); virtual;

   Procedure Func0(var Fu:TArrReal); override;

   Procedure Initial;virtual;

   Procedure Viewer;virtual;

   Procedure Integr;

   Procedure LexPM(var ix:tArrInt;var flag:boolean);

   Procedure OgrUpr;

   Procedure RP(t1:real;x1:TArrReal;var f1:TArrReal);virtual;//Правые части

   Procedure Setdt(dt1:real);

   Procedure Setixmax(ix1:TArrInt);

   Procedure Setqymax(qymax1:TArrReal);

   Procedure Setqymin(qymin1:TArrReal);

   Procedure Setstepsqy(stepsqy1:TArrReal);

   Procedure Settf(tf1:real);

   Procedure Setuogr(umin1,umax1:TArrReal);

   Procedure Setx0(x01:TArrReal);

   Procedure Upr;

 end;

//*********************************************************

                   IMPLEMENTATION

//*********************************************************

{ TNetOper }

Constructor TNetOper.Create(L1, Mout1, kp1, kr1, kw1, kv1: integer);

Begin

 L:=L1;

 kP:=kp1;

 kR:=kr1;

 kW:=kw1;

 kV:=kv1;

 Mout:=Mout1;

 Setlength(Psi,L,L);

 Setlength(Psi0,L,L);

 Setlength(z,L);

 Setlength(zs,L);

 Setlength(Vs,kP);

 Setlength(Cs,kR);

 Setlength(O1s,kW);

 Setlength(O2s,kV);

 Setlength(Pnum,kP);

 Setlength(Rnum,kR);

 Setlength(Dnum,Mout);

End;

Procedure TNetOper.SetCs(cs1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to kR-1 do

   Cs[i]:=cs1[i];

End;

Procedure TNetOper.SetDnum(dnum1: TArrInt);

var

 i:integer;

Begin

 for i:=0 to Mout-1 do

   Dnum[i]:=dnum1[i];

End;

Procedure TNetOper.SetO1s(o1s1: TArrInt);

var

 i:integer;

Begin

 for i:=0 to kW-1 do

   O1s[i]:=o1s1[i];

End;

Procedure TNetOper.SetO2s(o2s1: TArrInt);

var

 i:integer;

Begin

 for i:=0 to kV-1 do

   O2s[i]:=o2s1[i];

End;

Procedure TNetOper.SetPnum(pnum1: TArrInt);

var

 i:integer;

Begin

 for i:=0 to kP-1 do

   Pnum[i]:=pnum1[i];

End;

Procedure TNetOper.SetPsi(Psi1:TArrArrInt);

var

 i,j:integer;

Begin

 for i:=0 to L-1 do

   for j:= 0 to L-1 do

     Psi[i,j]:=Psi1[i,j];

End;

Procedure TNetOper.SetPsiBas(Psi1: TArrArrInt);

var

 i,j:integer;

Begin

 for i:=0 to L-1 do

   for j:= 0 to L-1 do

     Psi0[i,j]:=Psi1[i,j];

End;

Procedure TNetOper.SetRnum(rnum1: TArrInt);

var

 i:integer;

Begin

 for i:=0 to kR-1 do

   Rnum[i]:=rnum1[i];

End;

Procedure TNetOper.SetVs(Vs1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to high(Vs1) do

   Vs[i]:=vs1[i];

End;

Procedure TNetOper.ReadPsi(var Psi1: TArrArrInt);

var

 i,j:integer;

Begin

 for i:=0 to L-1 do

   for j:=0 to L-1 do

     Psi1[i,j]:=Psi[i,j];

End;

Procedure TNetOper.ReadPsi0(var Psi1: TArrArrInt);

var

 i,j:integer;

Begin

 for i:=0 to L-1 do

   for j:=0 to L-1 do

     Psi1[i,j]:=Psi0[i,j];

End;

Procedure TNetOper.RPControl;

var

 i,j:integer;

 zz:real;

Begin

 for i:=0 to L-1 do

   case psi[i,i] of

     0,4: z[i]:=0;

     1: z[i]:=1;

     2: z[i]:=-infinity;

     3: z[i]:=infinity;

   end;

 for i:=0 to kP-1 do

   z[Pnum[i]]:=Vs[i];

 for i:=0 to kR-1 do

   z[Rnum[i]]:=Cs[i];

 for i:=0 to L-2 do

   for j:=i+1 to L-1 do

     if Psi[i,j]<>0 then

     begin

       case Psi[i,j] of

         1: zz:=Ro_1(z[i]);

         2: zz:=Ro_2(z[i]);

         3: zz:=Ro_3(z[i]);

         4: zz:=Ro_4(z[i]);

         5: zz:=Ro_5(z[i]);

         6: zz:=Ro_6(z[i]);

         7: zz:=Ro_7(z[i]);

         8: zz:=Ro_8(z[i]);

         9: zz:=Ro_9(z[i]);

         10: zz:=Ro_10(z[i]);

         11: zz:=Ro_11(z[i]);

         12: zz:=Ro_12(z[i]);

         13: zz:=Ro_13(z[i]);

         14: zz:=Ro_14(z[i]);

         15: zz:=Ro_15(z[i]);

         16: zz:=Ro_16(z[i]);

         17: zz:=Ro_17(z[i]);

         18: zz:=Ro_18(z[i]);

         19: zz:=Ro_19(z[i]);

         20: zz:=Ro_20(z[i]);

         21: zz:=Ro_21(z[i]);

         22: zz:=Ro_22(z[i]);

         23: zz:=Ro_23(z[i]);

         24: zz:=Ro_24(z[i]);

       end;

       case Psi[j,j] of

         0: z[j]:=Xi_0(z[j],zz);

         1: z[j]:=Xi_1(z[j],zz);

         2: z[j]:=Xi_2(z[j],zz);

         3: z[j]:=Xi_3(z[j],zz);

         4: z[j]:=Xi_4(z[j],zz);

       end;

     end;

End;

Procedure TNetOper.Variations(w:TArr4Int);

// Элементарные операции

// 0 - замена недиагонального элемента

// 1 - замена диагонального элемента

// 2 - добавление дуги

// 3 - удаление дуги

var

 i,j,s1,s2:integer;

Begin

 if (w[0]<>0)or(w[1]<>0)or(w[2]<>0) then

   case w[0] of

     0: if Psi[w[1],w[2]]<>0 then Psi[w[1],w[2]]:=w[3];

     1: Psi[w[1],w[1]]:=w[3];

     2: if Psi[w[1],w[2]]=0 then Psi[w[1],w[2]]:=w[3];

     3:

     begin

       s1:=0;

       for i:=0 to w[2]-1 do

         if Psi[i,w[2]]<>0 then s1:=s1+1;

       s2:=0;

       for j:=w[1]+1 to L-1 do

         if (Psi[w[1],j]<>0)then s2:=s2+1;

       if s1>1 then

         if s2>1 then

           Psi[w[1],w[2]]:=0;

     end;

   end;

End;

Procedure TNetOper.GenVar(var w:TArr4Int);

// Генерация элементарной операции

 Function TestSource(j:integer):boolean;

 // если j-номер узла источника, то возвращает false

 var

   i:integer;

   flag:boolean;

 Begin

   flag:=true;

   i:=0;

   while(i<=high(Pnum)) and (j<>Pnum[i]) do i:=i+1;

   if i<=high(Pnum) then flag:=false

   else

   begin

     i:=0;

     while(i<=high(Rnum)) and (j<>Rnum[i]) do i:=i+1;

     if i<=high(Rnum) then flag:=false;

   end;

   result:=flag;

 End;

Begin

 w[0]:=random(4);

 case w[0] of

   0,2,3: // замена недиагонального элемента, добавление и удаление дуги

   begin

    w[1]:=random(L-1);

    w[2]:=random(L-w[1]-1)+w[1]+1;

//     while not TestSource(w[2]) do w[2]:=w[2]+1;

    w[3]:=O1s[random(kW)];

   end;

   1: // замена диагонального элемента

   begin

     w[1]:=random(L);

 //     while not TestSource(w[1]) do w[1]:=w[1]+1;

     w[2]:=w[1];

     w[3]:=O2s[random(kV)];

   end;

 end;

End;

Procedure TNetOper.PsitoPas;

// It tranforms from Psi to Pascal

var

 i,j:integer;

 zz:string;

Begin

 for i:=0 to L-1 do

   case Psi[i,i] of

     0,4: zs[i]:='0';

     1: zs[i]:='1';

     2: zs[i]:='-inf';

     3: zs[i]:='inf';

   end;

 for i:=0 to kP-1 do

   zs[Pnum[i]]:='x['+inttostr(i)+']';

 for i:=0 to kR-1 do

   zs[Rnum[i]]:='q['+inttostr(i)+']';

 for i:=0 to L-2 do

 begin

   for j:=i+1 to L-1 do

     if Psi[i,j]<>0 then

     begin

       if Psi[i,j]=1 then

         zz:=zs[i]

       else

         zz:='Ro_'+inttostr(Psi[i,j])+'('+zs[i]+')';

       if((Psi[j,j]=0)and(zs[j]='0'))or

         ((Psi[j,j]=1)and(zs[j]='1'))or

         ((Psi[j,j]=2)and(zs[j]='-inf'))or

         ((Psi[j,j]=3)and(zs[j]='inf'))or

         ((Psi[j,j]=4)and(zs[j]='0')) then

         zs[j]:=zz

       else

         zs[j]:='Xi_'+inttostr(Psi[j,j])+'('+zs[j]+','+zz+')';

     end;

 end;

End;

Procedure TNetOper.PsitoPasStr;

var

 i,j:integer;

Begin

 for j:=L-1 downto 0 do

 begin

   zs[j]:='z'+inttostr(j)+'=';

   case Psi[j,j] of

     0: zs[j]:=zs[j]+'Sum(';

     1: zs[j]:=zs[j]+'Prod(';

     2: zs[j]:=zs[j]+'Min(';

     3: zs[j]:=zs[j]+'Max(';

     4: zs[j]:=zs[j]+'Pol(';

   end;

   for i:=j-1 downto 0 do

     if Psi[i,j]<>0 then

       if Psi[i,j]<>1 then

         zs[j]:=zs[j]+'Ro_'+inttostr(Psi[i,j])+'(z_'+inttostr(i)+'),'

       else

         zs[j]:=zs[j]+'z_'+inttostr(i)+',';

   if zs[j,length(zs[j])]=',' then

     zs[j,length(zs[j])]:=')'

   else

     zs[j]:=zs[j]+')';

 end;

 for i:=0 to kP-1 do

   zs[Pnum[i]]:='z_'+inttostr(Pnum[i])+'=x_'+inttostr(i);

 for i:=0 to kR-1 do

   zs[Rnum[i]]:='z_'+inttostr(Rnum[i])+'=q_'+inttostr(i);

End;

Procedure TNetOper.PsitoTex;

// It tranforms from Psi to LaTeX

var

 i,j:integer;

 zz:string;

Begin

 for i:=0 to L-1 do

   case Psi[i,i] of

     0,4: zs[i]:='0';

     1: zs[i]:='1';

     2: zs[i]:='-\infinity';

     3: zs[i]:='\infinity';

   end;

 for i:=0 to kP-1 do

   zs[Pnum[i]]:='x_{'+inttostr(i)+'}';

 for i:=0 to kR-1 do

   zs[Rnum[i]]:='q_{'+inttostr(i)+'}';

 for i:=0 to L-2 do

 begin

   for j:=i+1 to L-1 do

     if Psi[i,j]<>0 then

     begin

       if Psi[i,j]=1 then

         zz:=zs[i]

       else

         zz:='\rho_{'+inttostr(Psi[i,j])+'}('+zs[i]+')';

       if((Psi[j,j]=0)and(zs[j]='0'))or

         ((Psi[j,j]=1)and(zs[j]='1'))or

         ((Psi[j,j]=2)and(zs[j]='-\infinity'))or

         ((Psi[j,j]=3)and(zs[j]='\infinity'))or

         ((Psi[j,j]=4)and(zs[j]='0')) then

         zs[j]:=zz

       else

         zs[j]:='\chi_{'+inttostr(Psi[j,j])+'}('+zs[j]+','+zz+')';

     end;

 end;

End;

Procedure TNetOper.PsitoTexStr;

var

 i,j:integer;

Begin

 for j:=L-1 downto 0 do

 begin

   zs[j]:='$z_{'+inttostr(j)+'}=';

   case Psi[j,j] of

     2: zs[j]:=zs[j]+'\text{Min}(';

     3: zs[j]:=zs[j]+'\text{Max}(';

     4: zs[j]:=zs[j]+'\text{Pol}(';

   end;

   for i:=j-1 downto 0 do

     if Psi[i,j]<>0 then

     begin

       if Psi[i,j]<>1 then

         zs[j]:=zs[j]+'\rho_{'+inttostr(Psi[i,j])+'}(z_{'+inttostr(i)+'})'

       else

         zs[j]:=zs[j]+'z_{'+inttostr(i)+'}';

       case Psi[j,j] of

         0:zs[j]:=zs[j]+'+';

         1:zs[j]:=zs[j]+'*';

       end;

     end;

   if (zs[j,length(zs[j])]='+')or(zs[j,length(zs[j])]='*') then

     zs[j,length(zs[j])]:=')'

   else

     zs[j]:=zs[j]+')';

   zs[j]:=zs[j]+'$\\';

 end;

 for i:=0 to kP-1 do

   zs[Pnum[i]]:='z_{'+inttostr(Pnum[i])+'}=x_{'+inttostr(i)+'}';

 for i:=0 to kR-1 do

   zs[Rnum[i]]:='z_{'+inttostr(Rnum[i])+'}=q_{'+inttostr(i)+'}';

End;

Procedure TGANOP.ChoosePareto;

var

 i,j:integer;

Begin

 j:=0;

 for i:=0 to HH-1 do

   if Lh[i]=0 then

   begin

     j:=j+1;

     setlength(Pareto,j);

     Pareto[j-1]:=i;

   end;

End;

Constructor TGANOP.Create(hh1, pp1, rr1, nfu1, lchr1, p1, c1, d1, epo1,

                         kel1: integer; alfa1, pmut1: real; L1, Mout1,

                         kp1, kr1, kw1,kv1: integer);

Begin

 Inherited Create;

 HH:=hh1;

 PP:=pp1;

 RR:=rr1;

 nfu:=nfu1;

 lchr:=lchr1;

 p:=p1;

 c:=c1;

 d:=d1;

 Epo:=epo1;

 kel:=kel1;

 alfa:=alfa1;

 pmut:=pmut1;

 NOP:=TNetOper.Create(L1, Mout1, kp1, kr1, kw1, kv1);

 Setlength(PopChrStr,HH,lchr);

 Setlength(PopChrPar,HH,p*(c+d));

 Setlength(Fuh,HH,nfu);

 Setlength(Lh,HH);

 Setlength(Fu1,nfu);

 Setlength(Fu2,nfu);

 Setlength(Fu3,nfu);

 Setlength(Fu4,nfu);

 Setlength(Son1s,lchr);

 Setlength(Son2s,lchr);

 Setlength(Son3s,lchr);

 Setlength(Son4s,lchr);

 Setlength(Son1p,p*(c+d));

 Setlength(Son2p,p*(c+d));

 Setlength(Son3p,p*(c+d));

 Setlength(Son4p,p*(c+d));

 SetLength(q,p);

 SetLength(zb,p*(c+d));

End;

Procedure TGANOP.Func0(var Fu:TArrReal);

var

 i:integer;

Begin

 NOP.RPControl;

 for i:=0 to nfu-1 do

   Fu[i]:=NOP.z[NOP.Dnum[i]];

End;

Procedure TGANOP.GenAlgorithm;

// Генетический алгоритм

var

 i,j,k,pt,rt,k1,k2,lmax,imax,ks1,ks2:integer;

 ksi,su,su1,Fumax,Fumin:real;

 FuhNorm:TArrArrreal;

Begin

 setlength(FuhNorm,HH,nfu);

 //generating population

 NOP.SetPsiBas(NOP.Psi);

 VectortoGrey(PopChrPar[0]);

 for i:=0 to lchr-1 do

   for j:=0 to 3 do

     PopChrStr[0,i,j]:=0;

 for i:=1 to HH-1 do

 begin

   for j:=0 to lchr-1 do

     NOP.GenVar(PopChrStr[i,j]);

   for j:=0 to p*(c+d)-1 do

     PopChrPar[i,j]:=random(2);

 end;

 // calculating values of functionals

 for i:=0 to HH-1 do

 begin

   NOP.SEtPsi(NOP.Psi0);

   for j:=0 to lchr-1 do

     NOP.Variations(PopChrStr[i,j]);

   GreytoVector(PopChrPar[i]);

   Func0(Fuh[i]);

 end;

 //caculating distances to Pareto set

 for i:=0 to HH-1 do

   Lh[i]:=Rast(Fuh[i]);

 //Start of cycle for generations

 pt:=1;  // first current generation

 repeat

   //start of cycle for crossovering

   rt:=1;//first couple for crossoving

   repeat

     //select of two parents

     k1:=random(HH);

     k2:=random(HH);

     ksi:=random;

     if (ksi<(1+alfa*Lh[k1])/(1+Lh[k1])) or

        (ksi<(1+alfa*Lh[k2])/(1+Lh[k2])) then

     begin

       //if true

       ks1:=random(lchr);

       ks2:=random(p*(c+d));

       //crossoving? creating four sons

       for i:=0 to lchr-1 do

       begin

         Son1s[i]:=PopChrStr[k1,i];

         Son2s[i]:=PopChrStr[k2,i];

       end;

       for i:=0 to ks2-1 do

       begin

         Son1p[i]:=PopChrPar[k1,i];

         Son2p[i]:=PopChrPar[k2,i];

         Son3p[i]:=PopChrPar[k1,i];

         Son4p[i]:=PopChrPar[k2,i];

       end;

       for i:=ks2 to p*(c+d)-1 do

       begin

         Son1p[i]:=PopChrPar[k2,i];

         Son2p[i]:=PopChrPar[k1,i];

         Son3p[i]:=PopChrPar[k2,i];

         Son4p[i]:=PopChrPar[k1,i];

       end;

       for i:=0 to ks1-1 do

       begin

         Son3s[i]:=PopChrStr[k1,i];

         Son4s[i]:=PopChrStr[k2,i];

       end;

       for i:=ks1 to lchr-1 do

       begin

         Son3s[i]:=PopChrStr[k2,i];

         Son4s[i]:=PopChrStr[k1,i];

       end;

       //mutation for 1st son

       if random<pmut then

       begin

         son1p[random(p*(c+d))]:=random(2);

         NOP.GenVar(son1s[random(lchr)]);

       end;

       //functional for 1st son

       NOP.SetPsi(NOP.Psi0);;

       for j:=0 to lchr-1 do

         NOP.Variations(son1s[j]);

       GreytoVector(son1p);

       Func0(Fu1);

       //Distance for 1st son

       L1:=Rast(Fu1);

       //Chromosome with biggest distance to Pareto set

       Lmax:=Lh[0];

       imax:=0;

       for i:=1 to HH-1 do

         if Lh[i]>Lmax then

         begin

           Lmax:=Lh[i];

           imax:=i;

         end;

       if L1<Lmax then

       //if distance to Pareto set 1st son is less than biggest distance

       //...in population then make substitution

       begin

         for i:=0 to lchr-1 do

           PopChrStr[imax,i]:=son1s[i];

         for i:=0 to p*(c+d)-1 do

           PopChrPar[imax,i]:=son1p[i];

         for i:=0 to nfu-1 do

           Fuh[imax,i]:=Fu1[i];

       end;

       //calculating all distances for population

       for i:=0 to HH-1 do

         Lh[i]:=Rast(Fuh[i]);

       //mutation for 2nd son

       if random<pmut then

       begin

         son2p[random(p*(c+d))]:=random(2);

         NOP.GenVar(son2s[random(lchr)]);

       end;

       //functional for 2nd son

       NOP.SetPsi(NOP.Psi0);

       for j:=0 to lchr-1 do

         NOP.Variations(son2s[j]);

       GreytoVector(son2p);

       Func0(Fu2);

       //Distance for 2nd son

       L2:=Rast(Fu2);

       //Chromosome with biggest distance to Pareto set

       Lmax:=Lh[0];

       imax:=0;

       for i:=1 to HH-1 do

         if Lh[i]>Lmax then

         begin

           Lmax:=Lh[i];

           imax:=i;

         end;

       if L1<Lmax then

       //if distance to Pareto set 2nd son is less than biggest distance

       //...in population then make substitution

       begin

         for i:=0 to lchr-1 do

           PopChrStr[imax,i]:=son2s[i];

         for i:=0 to p*(c+d)-1 do

           PopChrPar[imax,i]:=son2p[i];

         for i:=0 to nfu-1 do

           Fuh[imax,i]:=Fu2[i];

       end;

       //calculating all distances for population

       for i:=0 to HH-1 do

         Lh[i]:=Rast(Fuh[i]);

       //mutation for 3rd son

       if random<pmut then

       begin

         son3p[random(p*(c+d))]:=random(2);

         NOP.GenVar(son3s[random(lchr)]);

       end;

       //functional for 3rd son

       NOP.SetPsi(NOP.Psi0);

       for j:=0 to lchr-1 do

         NOP.Variations(son1s[j]);

       GreytoVector(son1p);

       Func0(Fu3);

       //Distance for 3rd son

       L3:=Rast(Fu3);

       //Chromosome with biggest distance to Pareto set

       Lmax:=Lh[0];

       imax:=0;

       for i:=1 to HH-1 do

         if Lh[i]>Lmax then

         begin

           Lmax:=Lh[i];

           imax:=i;

         end;

       if L3<Lmax then

       //if distance to Pareto set 3rd son is less than biggest distance

       //...in population then make substitution

       begin

         for i:=0 to lchr-1 do

           PopChrStr[imax,i]:=son3s[i];

         for i:=0 to p*(c+d)-1 do

           PopChrPar[imax,i]:=son3p[i];

         for i:=0 to nfu-1 do

           Fuh[imax,i]:=Fu3[i];

       end;

       //calculating all distances for population

       for i:=0 to HH-1 do

         Lh[i]:=Rast(Fuh[i]);

       //mutation for 4th son

       if random<pmut then

       begin

         son4p[random(p*(c+d))]:=random(2);

         NOP.GenVar(son4s[random(lchr)]);

       end;

       //functional for 4th son

       NOP.SetPsi(NOP.Psi0);

       for j:=0 to lchr-1 do

         NOP.Variations(son4s[j]);

       GreytoVector(son4p);

       Func0(Fu4);

       //Distance for 4th son

       L4:=Rast(Fu4);

       //Chromosome with biggest distance to Pareto set

       Lmax:=Lh[0];

       imax:=0;

       for i:=1 to HH-1 do

         if Lh[i]>Lmax then

         begin

           Lmax:=Lh[i];

           imax:=i;

         end;

       if L4<Lmax then

       //if distance to Pareto set 4th son is less than biggest distance

       //...in population then make substitution

       begin

         for i:=0 to lchr-1 do

           PopChrStr[imax,i]:=son4s[i];

         for i:=0 to p*(c+d)-1 do

           PopChrPar[imax,i]:=son4p[i];

         for i:=0 to nfu-1 do

           Fuh[imax,i]:=Fu4[i];

       end;

       //calculating all distances for population

       for i:=0 to HH-1 do

         Lh[i]:=Rast(Fuh[i]);

     end;

     rt:=rt+1;

     //End of cycle for crossoving

   until rt>RR;

   // generating new chromosomes

   // Checking Epoch

   pt:=pt+1;

   //if epoch is over then changing basic

   if pt mod Epo=0 then

   begin

     //... на наиболее близкую хромосому к утопической

     // хромосоме в пространстве нормированных криетриев

     for i:=0 to nfu-1 do

     begin

       Fumax:=Fuh[0,i];

       Fumin:=Fuh[0,i];

       // ищем максимальное и минимальное значения по каждому функционалу

       for k:=0 to HH-1 do

         if Fuh[k,i]>Fumax then

           Fumax:=Fuh[k,i]

         else

           if Fuh[k,i]< Fumin then

             Fumin:=Fuh[k,i];

       // нормируем критерии, поделив каждое значение на разность между

       // максимумом и минимумом

       if Fumax<>Fumin then

         for k:=0 to HH-1 do

           FuhNorm[k,i]:=Fuh[k,i]/(Fumax-Fumin);

     end;

     // находим хромосому с наименьшей величиной нормы нормированных критериев

     k:=0;

     su:=0;

//      for i:=0 to nfu-1 do

//        su:=su+sqr(FuhNorm[0,i]);

//

//      su:=sqrt(su);

     su:=FuhNorm[0,1];

     for i:=1 to HH-1 do

     begin

//        su1:=0;

//        for j:=0 to nfu-1 do

//          su1:=su1+sqr(FuhNorm[i,j]);

//        su1:=sqrt(su1);

       su1:=FuhNorm[i,1];

       if su1<su then

       begin

         su:=su1;

         k:=i;

       end;

     end;

     // заменяем базис

     // строим матрицу для найденной хромосомы

     NOP.SetPsi(NOP.Psi0);

     for j:=0 to lchr-1 do

       NOP.Variations(PopChrStr[k,j]);

     // меняем базисную матрицу на новую

     NOP.SetPsiBas(NOP.Psi);

     //генерируем тождественную хромосому

     for i:=0 to lchr-1 do

       for j:=0 to 3 do

         PopChrStr[0,i,j]:=0;

     for i:=0 to p*(c+d)-1 do

       PopChrPar[0,i]:=PopChrPar[k,i];

     //вычисляем все фунционалы для всей популяции

     for i:=0 to HH-1 do

     begin

       NOP.SetPsi(NOP.Psi0);

       for j:=0 to lchr-1 do

         NOP.Variations(PopChrStr[i,j]);

       GreytoVector(PopChrPar[i]);

       Func0(Fuh[i]);

     end;

     // формируем элиту

     for i:=0 to kel-1 do

     begin

       j:=random(HH-1)+1;

       GreytoVector(PopChrPar[j]);

       ImproveChrom(q,PopChrStr[j]);

     end;

     //вычисляем новые расстояния

     for i:=0 to HH-1 do

       Lh[i]:=Rast(Fuh[i]);

   end;

   //конец цикла поколений

   EndGeneration;

//    form1.ProgressBar1.StepIt;

//    Form1.Refresh;

 until pt>PP;

 ChoosePareto;

//строим множество Парето

End;

Procedure TGANOP.GenAlgorithm1;

// Генетический алгоритм для поиска оптимальных значений параметров

var

 i,j,pt,rt,k1,k2,lmax,imax,ks2:integer;

 ksi:real;

 FuhNorm:TArrArrreal;

Begin

 setlength(FuhNorm,HH,nfu);

 //генерация популяции

 NOP.SetPsiBas(NOP.Psi);

 VectortoGrey(PopChrPar[0]);

 for i:=1 to HH-1 do

 begin

   for j:=0 to p*(c+d)-1 do

     PopChrPar[i,j]:=random(2);

 end;

 //вычисление значений функционалов для каждой хромосомы

 for i:=0 to HH-1 do

 begin

   GreytoVector(PopChrPar[i]);

   Func0(Fuh[i]);

 end;

 //вычисление расстояний до множества Парето

 for i:=0 to HH-1 do

   Lh[i]:=Rast(Fuh[i]);

 //начало цикла поколений

 pt:=1;  // первое текущее поколение

 repeat

   //начало цикла скрещивания

   rt:=1;//первая пара скрещивания

   repeat

     //отбор двух родителей

     k1:=random(HH);

     k2:=random(HH);

     ksi:=random;

     if (ksi<(1+alfa*Lh[k1])/(1+Lh[k1])) or

        (ksi<(1+alfa*Lh[k2])/(1+Lh[k2])) then

     begin

       //если условие скрещивания выполнено

       ks2:=random(p*(c+d));

       //скрещивание, получение 2-х потомков

       for i:=0 to ks2-1 do

       begin

         Son1p[i]:=PopChrPar[k1,i];

         Son2p[i]:=PopChrPar[k2,i];

       end;

       for i:=ks2 to p*(c+d)-1 do

       begin

         Son1p[i]:=PopChrPar[k2,i];

         Son2p[i]:=PopChrPar[k1,i];

       end;

       //мутация для 1го потомка

       if random<pmut then

         son1p[random(p*(c+d))]:=random(2);

       //вычисление функционалов для 1го потомка

       GreytoVector(son1p);

       Func0(Fu1);

       //вычисление расстояния для 1го потомка

       L1:=Rast(Fu1);

       //нахождение хромосомы с наибольшим расстоянием

       Lmax:=Lh[0];

       imax:=0;

       for i:=1 to HH-1 do

         if Lh[i]>Lmax then

         begin

           Lmax:=Lh[i];

           imax:=i;

         end;

       if L1<Lmax then

       //если расстояние у 1го потомка меньше, чем наибольшее, то

       //...осуществляем замену

       begin

         for i:=0 to p*(c+d)-1 do

           PopChrPar[imax,i]:=son1p[i];

         for i:=0 to nfu-1 do

           Fuh[imax,i]:=Fu1[i];

       end;

       //вычисляем все расстояния для популяции

       for i:=0 to HH-1 do

         Lh[i]:=Rast(Fuh[i]);

       //мутация для 2го потомка

       if random<pmut then

         son2p[random(p*(c+d))]:=random(2);

       //вычисление функционалов для 2го потомка

       GreytoVector(son2p);

       Func0(Fu2);

       //вычисление расстояния для 2го потомка

       L2:=Rast(Fu2);

       //нахождение хромосомы с наибольшим расстоянием

       Lmax:=Lh[0];

       imax:=0;

       for i:=1 to HH-1 do

         if Lh[i]>Lmax then

         begin

           Lmax:=Lh[i];

           imax:=i;

         end;

       if L1<Lmax then

       //если расстояние у 2го потомка меньше, чем наибольшее, то

       //...осуществляем замену

       begin

         for i:=0 to p*(c+d)-1 do

           PopChrPar[imax,i]:=son2p[i];

         for i:=0 to nfu-1 do

           Fuh[imax,i]:=Fu2[i];

       end;

       //вычисляем все расстояния для популяции

       for i:=0 to HH-1 do

         Lh[i]:=Rast(Fuh[i]);

     end;

     rt:=rt+1;

     //конец цикла скрещивания

   until rt>RR;

   // генерируем новые хромосомы

   //проверка конца эпохи

   pt:=pt+1;

   //конец цикла поколений

   EndGeneration;

 until pt>PP;

 ChoosePareto;

//строим множество Парето

End;

Procedure TGANOP.GreytoVector(y: TArrInt);

var

 i,j,l1,l:integer;

 g,g1:real;

Begin

 l:=c+d;

 l1:=high(y)+1;

 for i:=0 to l1-1 do

   if i mod l=0 then

     zb[i]:=y[i]

   else

     zb[i]:=zb[i-1] xor y[i];

 j:=-1;

 g1:=1;

 g:=1;

 for i:=0 to c-2 do

   g1:=g1*2;

 for i:=0 to l1-1 do

 begin

   if i mod l=0 then

   begin

     j:=j+1;

     q[j]:=0;

     g:=g1;

   end;

   q[j]:=q[j]+g*zb[i];

   g:=g/2;

 end;

End;

Procedure TGANOP.ImproveChrom(q:TArrReal;var StrChrom: TArrArr4Int);

var

 i,j,k:integer;

 flag:boolean;

Begin

 NOP.SetPsi(NOP.Psi0);

 Func0(Fu1);

 k:=-1;

 for i:=0 to lchr-1 do

 begin

   NOP.Variations(StrChrom[i]);

   Func0(Fu2);

   flag:=true;

   for j:=0 to nfu-1 do

     if Fu2[j]>Fu1[j] then flag:=false;

   if flag then

   begin

     for j:=0 to nfu-1 do

       Fu1[j]:=Fu2[j];

     k:=i;

   end;

 end;

 for i:=k+1 to lchr-1 do

   for j:=0 to 3 do

     StrChrom[i,j]:=0;

End;

Function TGANOP.Rast(Fu: TArrReal): integer;

var i,j,k,count:integer;

Begin

 count:=0;

 for i:=0 to HH-1 do

 begin

   j:=0;

   while (j<nfu) and (Fu[j]>=Fuh[i,j]) do j:=j+1;

   if j>=nfu then

   begin

     k:=0;

     while (k<nfu) and (Fu[k]=Fuh[i,k]) do k:=k+1;

     if k<nfu then count:=count+1;

   end;

 end;

 result:=count;

End;

Procedure TGANOP.ReadChromosome(k: integer; var q1: TArrReal;

 var Psi1: TArrArrInt);

var

 i:integer;

Begin

 NOP.SetPsi(NOP.Psi0);

 for i:=0 to lchr-1 do

   NOP.Variations(PopChrStr[k,i]);

 GreytoVector(PopChrPar[k]);

 Readq(q1);

 NOP.ReadPsi(Psi1);

End;

Procedure TGANOP.ReadFunc(k: integer; var Fu1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to nfu-1 do

   Fu1[i]:=Fuh[k,i];

End;

Procedure TGANOP.Readq(var q1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to p-1 do

   q1[i]:=q[i];

End;

Procedure TGANOP.Setq(q1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to high(q1) do

   q[i]:=q1[i];

End;

Procedure TGANOP.VectortoGrey(var y: TArrInt);

var

 x,i,j,k:integer;

 r:real;

Begin

 for i:=0 to p*(c+d)-1 do

   zb[i]:=0;

 for j:=0 to p-1 do

 begin

   x:=trunc(q[j]);

   r:=q[j]-x;

   k:=c+j*(c+d)-1;

   while k>=j*(c+d) do

   begin

     zb[k]:=x mod 2;

     x:=x div 2;

     k:=k-1;

   end;

   k:=c+j*(c+d);

   while k<(c+d)*(j+1) do

   begin

     r:=2*r;

     x:=trunc(r);

     zb[k]:=x;

     r:=r-x;

     k:=k+1;

   end;

   y[j*(c+d)]:=zb[j*(c+d)];

   for i:=j*(c+d)+1 to (j+1)*(c+d)-1 do

     y[i]:=zb[i] xor zb[i-1];

 end;

End;

{ TModel }

Constructor TModel.Create(hh1,pp1,rr1,nfu1,lchr1,p1,c1,d1,

                      Epo1,kel1:integer;alfa1,pmut1:real;

                      L1,Mout1,kp1,kr1,kw1,kv1,n1,m1,ll1,ny1:integer);

Begin

 inherited Create(hh1,pp1,rr1,nfu1,lchr1,p1,c1,d1,

                      Epo1,kel1,alfa1,pmut1,

                      L1,Mout1,kp1,kr1,kw1,kv1);

 n:=n1;

 m:=m1;

 lv:=ll1;

 ny:=ny1;

 SetLength(x,n);

 SetLength(x0,n);

 SetLength(xs,n);

 SetLength(fa,n);

 SetLength(fb,n);

 SetLength(u,m);

 SetLength(umax,m);

 SetLength(umin,m);

 SetLength(qymin,ny);

 SetLength(qymax,ny);

 SetLength(qy,ny);

 SetLength(ixmax,ny);

 SetLength(ix,ny);

 SetLength(stepsqy,ny);

 SetLength(y,lv);

 SetLength(su,nfu);

 SetLength(su1,nfu);

End;

Procedure TModel.Euler2;

var

 i:integer;

Begin

 RP(t,x,fa);

 for i:=0 to n-1 do

   xs[i]:=x[i]+dt*fa[i];

 RP(t+dt,xs,fb);

 for i:=0 to n-1 do

   x[i]:=x[i]+dt*(fa[i]+fb[i])/2;

 t:=t+dt;

End;

Procedure TModel.Func(var Fu: TArrReal);

var

 i:integer;

Begin

 for i:=0 to nfu-1 do

   fu[i]:=0;

End;

Procedure TModel.Func0(var Fu: TArrReal);

var

 i:integer;

Begin

 Integr;

 for i:=0 to nfu-1 do

   Fu[i]:=su[i];

End;

Procedure TModel.Initial;

var

 i:integer;

Begin

 for i:=0 to n-1 do

   x[i]:=x0[i];

 t:=0;

End;

Procedure TModel.Integr;

var

 i,j:integer;

 flag:boolean;

Begin

 for i:=0 to ny-1 do

   ix[i]:=0;

 for i:=0 to nfu-1 do

   su[i]:=0;

 repeat

   for i:=0 to ny-1 do

     qy[i]:=qymin[i]+stepsqy[i]*ix[i];

   Func(su1);

   for i:=0 to nfu-1 do

     su[i]:=su[i]+su1[i];

   LexPM(ix,flag);

 until not flag;

End;

Procedure TModel.LexPM(var ix: tArrInt; var flag: boolean);

var

 i,j:integer;

Begin

 i:=ny-1;

 while (i>=0)and(ix[i]=ixmax[i]) do i:=i-1;

 if i>=0 then

 begin

   ix[i]:=ix[i]+1;

   for j:=i+1 to ny-1 do

     ix[j]:=0;

   flag:=true;

 end

 else

   flag:=false;

End;

Procedure TModel.OgrUpr;

var

 i:integer;

Begin

 for i:=0 to m-1 do

   if u[i]>umax[i] then

     u[i]:=umax[i]

   else

     if u[i]<umin[i] then

       u[i]:=umin[i];

End;

Procedure TModel.RP(t1:real;x1:TArrReal;var f1:TArrReal);

const

 TT=0.5;

 ksi=0.09;

 ko=1;

var

 i:integer;

Begin

 Upr;

 f1[0]:=x[1];

 f1[1]:=-2*ksi*x[1]/TT+(ko*u[0]-x[0])/sqr(TT);

 for i:=0 to n-1 do

   if abs(f1[i])>infinity then

     f1[i]:=Ro_10(f1[i])*infinity;

End;

Procedure TModel.Setdt(dt1: real);

Begin

 dt:=dt1;

End;

Procedure TModel.Setixmax(ix1: TArrInt);

var

 i:integer;

Begin

 for i:=0 to ny-1 do

   ixmax[i]:=ix1[i];

End;

Procedure TModel.Setqymax(qymax1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to ny-1 do

   qymax[i]:=qymax1[i];

End;

Procedure TModel.Setqymin(qymin1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to ny-1 do

   qymin[i]:=qymin1[i];

End;

Procedure TModel.Setstepsqy(stepsqy1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to ny-1 do

   stepsqy[i]:=stepsqy1[i];

End;

Procedure TModel.Settf(tf1: real);

Begin

 tf:=tf1;

End;

Procedure TModel.Setuogr(umin1, umax1: TArrReal);

var

 i:integer;

Begin

 for i:=0 to m-1 do

 begin

   umin[i]:=umin1[i];

   umax[i]:=umax1[i];

 end;

End;

Procedure TModel.Setx0(x01: TArrReal);

var

 i:integer;

Begin

 for i:=0 to n-1 do

   x0[i]:=x01[i];

End;

Procedure TModel.Upr;

Begin

 u[0]:=1;

End;

Procedure TModel.Viewer;

var

 i:integer;

Begin

 for i:=0 to n-1 do

   y[i]:=x[i];

End; END.


Приложение Б:

z_0=x_0

z_1=q_0

z_2=x_1

z_3=q_1

z_4=x_2

z_5=q_2

z_6=x_3

z_7=q_3

z8=Prod(z_1,z_0)

z9=Prod(z_3,z_2)

z10=Prod(z_5,z_4)

z11=Prod(z_7,z_6)

z12=Sum(z_9,z_8)

z13=Sum(z_11,z_10)

z14=Sum(z_12)

z15=Sum(z_13)

z16=Sum(z_12)

z17=Sum(z_13)

z18=Sum(Ro_18(z_13),z_12)

z19=Sum(z_17,Ro_9(z_14),Ro_23(z_6))

20=Sum(z_18)

z21=Sum(z_19)

z22=Sum(z_20,Ro_6(z_10))

z23=Sum(z_22,Ro_17(z_21))


вручную

аналитически

программно

Стало возможным с 1992г с появлением генетического программирования.

(Koza J.R.)

Разновидность ГП:

  •  Грамматическая эволюция (1998 г. , O'Neill M., Ryan C.)
  •  Аналитическое программирование (Zelinka I., Oplatkova Z.)
  •  Метод сетевого оператора (2006г, Дивеев А.И., Софронова Е.А.)

На основе интуиции и опыта исследователя для определенных систем и функционалов.

Методы:

  •  АКОР*

(Лётов А.М.,1960г.) – для линейных систем с квадратичным критерием качества.

  •  АКАР**

(Колесников А.А.,1999) –требует построения притягивающих многообразий.

На основе интуиции и опыта исследователя.

b1

u3

u2

u1

b1

b1

b2

q1

x1

q3

x2

q2

b22222

u3

b1

b2

b2

b2

b1

b1

q2

X2

q1

x1

x2

q1

X1

x1

b1

u3

u1

b2

u2

b1

b1

X1

q1

X2

X1

q1

u3

b1

b2

b2

b2

b2

b1

q3

b1

q2

X1

X2

X2

q2

X1

q1


 

А также другие работы, которые могут Вас заинтересовать

19950. Связи между параметрами переноса и влияние на них дополнительных гипотез 57.09 KB
  Рассмотреть связи между параметрами переноса и влияние на них дополнительных гипотез. Представить методику определения предэкпонентных членов коэффициентов диффузии. Обосновать желание использовать дополнительные экспериментальные материалы по выходу ГПД в низкотемпературной области. Предложить модель для описания выхода ГПД при низкой температуре. Поставить и решить соответствующую задачу. Сопоставить расчет с экспериментом.
19951. Предположение о равенстве зернограничных параметров переноса в низкотемпературной и высокотемпературной области для образца с (Топливо ВВЭР) 93.93 KB
  Ввести предположение о равенстве зернограничных параметров переноса в низкотемпературной и высокотемпературной области для образца с (Топливо ВВЭР). Рассмотреть связи (аналитическая и графическая форма) между параметрами переноса и влияние на них указанного выше предположения. Представить численные значения параметров переноса и погрешности их восстановления. Сопоставить полученные результаты с данными других авторов.
19952. Результаты экспериментальных исследований влияния деформации ползучести на выход ГПД 59.44 KB
  Познакомить слушателей с результатами экспериментальных исследований влияния деформации ползучести на выход ГПД. Предложить диффузионно-конвективную модель для описания выхода ГПД при наличии пластической деформации. Поставить и решить стационарную задачу. Сопоставить аналитическое решение с экспериментом.
19953. Современный этап развития ядерной энергетики. Реакторы на тепловых и быстрых нейтронах 87.44 KB
  Конкретные пути решения задач, поставленных Президентом, представлены в «Стратегии развития ядерной энергетики России до середины XXI века», принятой Минатомом России в 2000-м году и одобренной Правительством РФ. В последующие годы были разработаны и приняты к исполнению ряд конкретных программ по направлениям. Некоторые из них включают разделы связанные непосредственно с решением проблем экологии и выводом АЭС из эксплуатации, эти задачи обеспечиваются значительной финансовой поддержкой.
19954. Элементы активной зоны ядерного реактора и реакторные испытания 30.76 KB
  Снижение затрат в процессе разработки твэлов удается достигнуть при использовании расчетных программ определения их работоспособности. Использование в программах расчета феноменологических характеристик материалов требует экспериментального исследования последних в режимах, близких к режимам эксплуатации материалов в твэлах. Знание этих характеристик особенно важно для разработчиков твэлов.
19955. Программа комплексной стандартизации методов, облучательных устройств и технических требований к реакторным и стендовым испытаниям 23.73 KB
  Рассмотреть программу комплексной стандартизации методов, облучательных устройств и технических требований к реакторным и стендовым испытаниям. Познакомить слушателей с каталогом и рубрикатором методов радиационных испытаний материалов и изделий ядерной техники в реакторах и защитных камерах и отраслевыми стандартами.
19956. Классификаций реакторных испытаний 28.86 KB
  Любую классификацию, по-видимому, следует рассматривать как, достаточно, подвижную форму упорядочения наших представлений. Именно поэтому ее не следует считать законченной и устоявшейся. К представленной ниже классификации необходимо относиться как к одному из многих возможных вариантов, который может дополняться и уточняться.
19957. Исследовательские реакторы ИРТ-2000 (проект) и ИРТ-МИФИ 28.79 KB
  Рассмотреть ядерный исследовательский реактор как источник излучений для реакторных испытаний. Познакомить слушателей с техническими характеристиками исследовательских реакторов Российской Федерации. Обосновать выбор реакторов для последующего детального рассмотрения. Дать общие представления о проекте типового исследовательского реактора ИРТ-2000 и рассмотреть возможности реактора ИРТ-МИФИ.
19958. Исследовательский реактор ИВВ-2- пример максимально возможного использования оборудования типового проекта ИРТ-2000 29.79 KB
  Познакомить слушателей с техническими характеристиками исследовательского реактора ИВВ-2, результатами его модернизации, устройством активной зоны и его возможностями и приспособленностью для проведения реакторных испытаний. Рассмотреть картограмму активной зоны и распределения потоков излучений по экспериментальным каналам.