Генетический алгоритм обучения нейронечеткой сети "Управление ИБФ вуза"

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

Рубрика Программирование, компьютеры и кибернетика
Вид научная работа
Язык русский
Дата добавления 11.01.2020
Размер файла 1,4 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Генетический алгоритм обучения нейронечеткой сети «Управление ИБФ вуза»

Введение

Сетевые информационные ресурсы в сочетании с традиционными ресурсами обеспечивают современной вузовской библиотеке роль информационно-образовательного центра. Для многих вузов РФ становится актуальной задача непрерывного мониторинга уровня информационного обеспечения учебного процесса и обоснованности рационального использования аппаратно-программных и людских ресурсов вуза на комплектование соответствующих фондов.

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

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

1. Модуль «СППР по оценке соответствия аккредитационным показателям деятельности информационно-библиотечных структур вуза»

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

К нормативным показателям работы библиотеки вуза относят: объём учебного фонда, показатель книгообеспеченности, показатель наличия изданий с грифом и критерий устареваемости изданий учебного фонда. Федеральное агентство по образованию устанавливает нормативные значения этих показателей, относительно которых выполняется аттестация библиотеки вуза.

Обозначим математическую модель, которая предназначена для класса слабоформализованных, слабоструктурированных задач с расплывчатыми ограничениями, неполными и нечеткими данными, сильно зависящими от изменений внешней среды и субъективных предпочтений ЛПР на основе применения методов теории принятия решений, теории нечетких множеств и методов искусственного интеллекта, и представляет собой нейрро-нечёткую сеть типа ANFIS.

Математическая модель рассматриваемой СППР базируется пятислойной нечёткой продукционной сети ANFIS, реализующей алгоритм нечёткого вывода Мамдани, на основе Базы правил Y1 примет вид, представленный на рисунке 1. Входами данной модели являются определяющие критерии работы библиотеки - x1, x2, x3 и x4, а выходом - x7 - критерий оценки вуза Федеральным агентством по образованию РФ на соответствие минимальным нормам обеспеченности информационно-библиотечными ресурсами.

Рисунок 1. Структура сети ANFIS на основе Базы правил Y1

Слой L1. Включает элементы, каждый из которых реализует функцию принадлежности нечёткого множества Aji, где = 1, n, = 1, m. Выходы элементов этого слоя представляют собой значения функций принадлежности , (I = [1; 4], j = [1; 36]) при конкретных (заданных) значениях входных переменных x'I (этап fuzzification).

Цель слоя - оценить степень принадлежности входных данных x'I к соответствующим нечётким множествам Aji. В данной задаче применяется операция фуззификации типа синглетон (singleton):

. (1)

Обратим внимание, что параметры функций принадлежности являются стартовыми и в процессе обучения изменятся. Количество элементов слоя L1 равно 10.

Слой L2. Конфигурация связей этого слоя соответствует базе правил, а мультипликаторы - блоку вывода. Элементы второго слоя выполняют агрегирование степеней истинности предпосылок каждого правила базы (всего правил нечеткого вывода - m=36 в соответствии с операцией T-нормы, в качестве которой здесь используется операция min-конъюкции, по формуле:

. (2)

Количество элементов этого слоя равно 36 - количеству правил m. Каждый узел слоя L1 соединён со всеми узлами слоя L2 и представляет j-тое правило с соответствующими нечёткими множествами суждений этого правила.

Слой L3. Элементы данного слоя выполняют активизацию (определение степеней истинности) заключений по каждому из правил (прил. 2) на основе операции min-активизации:

(3)

Количество элементов этого слоя равно количеству правил m. Каждый узел слоя L3 связан с узлом слоя L2 соответствующего j-того правила. На выходе слоя формируется результат вывода в виде значения функции принадлежности бi-уровня - j-того правила.

Слой L4. Слой L4 содержит только один узел, который связан со всеми узлами слоя L3. Элемент данного слоя аккумулирует полученные на предыдущем этапе заключения по всем правилам. Объединение найденных усечённых нечётких множеств проводится с использованием операции максимум (max-дизъюнкции). В итоге формируется нечёткое множество для выходной переменной x7 с функцией принадлежности:

. (4)

Слой L5. Единственный элемент этого слоя вычисляет выход сети, который определяется как «центр тяжести» для фигуры - этап приведения к чёткости (defuzzification) выходной переменной y:

, (5)

где и - границы интервала носителя нечёткого множества выходной переменной x7.

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

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

По заданным значениям критериев (рис. 3) с использованием алгоритма Мамдани в программном модуле выполняется нечёткий вывод сети.

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

В модуле присутствует возможность просмотра функций принадлежности (ФП) лингвистических переменных (ЛП), созданных по каждому качественному нормативному показателю. На рисунках 5-8 обозначены функции принадлежности и их термы соответственно для нормативных показателей объём учебного фонда, показатель книгообеспеченности, показатель наличия изданий с грифом и критерий устареваемости изданий учебного фонда.

Рисунок 4. ФП для ЛП «Объём фонда»

Рисунок 5. ФП ЛП «Критерий устареваемости»

Рисунок 6. ФП ЛП «Наличие изданий с грифом»

Рисунок 7. ФП ЛП «Критерий устареваемости»

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

2. Оптимизация параметров гибридной сети при мониторинге информационного библиотечного фонда вуза (ИБФВ). Обучение нечёткой продукционной сети ANFIS на основе базы правил Y1

библиотечный гибридный сеть алгоритм

Параметрическими слоями нечёткой нейронной продукционной сети ANFIS, на основе Базы правил Y1, т.е. слоями, параметры элементов в которых будут настраиваться в ходе обучения, являются слои L1 и L3, а настраиваемыми в процессе обучения параметрами служат:

· в слое L1 - нелинейные параметры aji, bji, сji функций принадлежности нечётких множеств предпосылок правил (для входов x1, x2, x3, и x4);

· в слое L3 - нелинейные параметры aji, bji, сji функций принадлежности нечётких множеств предпосылок правил (для выхода x7).

Для корректной настройки параметров функций принадлежности входов и выхода сети, проведём обучение нейро-нечёткой сети с помощью эволюционного алгоритма (рис. 8).

Рисунок 8. Блок-схема генетического алгоритма поиска наилучшего набора весов

Эволюционный подход к обучению нейронных сетей состоит из двух основных этапов. Первый из них - это выбор соответствующей схемы представления весов связей. В данном случае остановимся на кодировании весов связей двоичными последовательностями. С учётом необходимой точности q=6 установим шаг r = 0,000001 кодирования веса связи на интервале [0,1]. Из формулы (4.4) [1] находим длину двоичной последовательности m= 20, достаточной для кодирования параметров сети (рис. 10) по формуле (4.5) [1]. На рисунке 9 представлены фенотипы (вещественные значения) параметров сети и соответствующие им значения генотипов (кодовые последовательности с длиной 20).

Рисунок 9. Популяция особей (хромосом, содержащих

Рисунок 10. Кодовое представление параметра сети

На втором этапе осуществляется сам процесс эволюции, основанный на генетическом алгоритме.

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

Шаг 1. Создаётся случайным образом первое поколение особей. Размерность популяции равна 180 особей. Каждая особь состоит из 30 хромосом, что соответствует количеству настраиваемых параметров сети (рис. 9).

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

Шаг 3. Рассчитывается общая среднеквадратическая погрешность (целевая функция) между фактическими и заданными значениями на всех выходах сети при подаче на её входы обучающих образов. Размер обучающей выборки составит 30 образов. Найденная погрешность (целевая функция) определяет приспособленность особи в популяции:

, (6)

здесь I - номер особи в популяции (выборки, содержащей закодированное множество весов нейронной сети); n - размерность обучающей выборки (n=30); j - номер обучающего образа; -эталонное значение выхода сети; -фактический выход сети i-той особи.

Шаг 4. Выполняем проверку условия остановки алгоритма.

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

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

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

Расчётная ошибка «наилучшей» особи сравнивается с предельной, и если предельная больше, то обучение завершено, иначе обучение нечётко-нейронной сети продолжается. Алгоритм может быть остановлен и после выполнения 500000 итераций (эпох обучения).

Шаг 5. Выполняется селекция хромосом, которая заключается в выборе (по рассчитанным значениям целевой функции - для турнирного метода, или функции приспособленности - для метода рулетки) тех хромосом, которые будут участвовать в создании потомков для следующей популяции, то есть для очередного поколения. Такой выбор производится согласно принципу естественного отбора, по которому наибольшие шансы на участие в создании новых особей имеют хромосомы с наибольшими значениями функции приспособленности. В качестве метода селекции может быть использован либо метод рулетки (roulette wheel selection), либо турнирный метод (tournament selection). Дополнительно, в методе «Рулетка» для предотвращения преждевременной сходимости генетического алгоритма и для лучшего поиска оптимального решения применяется степенное масштабирование (power law scaling) функции приспособленности

, (7)

где функция приспособленности i-той особи вычисляется по формуле

. (8)

В результате процесса селекции создаётся родительская популяция, также называемая родительским пулом (mating pool) с численностью, равной текущей популяции - 180 особей.

Шаг 6. На данном этапе осуществляется применение генетических операторов к хромосомам, отобранным с помощью селекции (шаг 5), что приводит к формированию новой популяции потомков от созданной на предыдущем шаге родительской популяции. В генетическом алгоритме применяются два основных генетических оператора: оператор скрещивания (crossover) и оператор мутации (mutation).

В данной работе реализована процедура двухточечного скрещивания хромосом (two-point crossover) с вероятностью . В этом случае потомки наследуют фрагменты родительских хромосом, определяемые двумя случайно выбранными точками скрещивания. После скрещивания, на популяции потомков выполняется этап мутации хромосом с вероятностью . Мутации подвергаются несколько генов хромосомы, определяемых случайным образом. Локус (позиция) гена тоже задаётся случайным образом на интервале [2,19], исключая граничные кодовые значения хромосомы.

Шаг 7. Хромосомы, полученные в результате применения генетических операторов к хромосомам временной родительской популяции, и 30% хромосом, полученных на этапе элитарной стратегии, включаются в состав новой популяции. Дополнительно, каждые 250 эпох обучения или в случае совпадения (с точностью до 0,000001) среднего значения целевой функции популяции с «наилучшим» значением целевой функции особи выполняется рестарт популяции, то есть оставшиеся 70% особей в популяции заменяются новыми случайными значениями весов сети. Полученная популяция становится текущей для данной эпохи обучения генетического алгоритма, и для неё повторяются шаги 2-7.

Исследования подтверждают, что турнирный метод действует эффективнее, чем метод рулетки [1], и потому рассмотрим результаты обучения нейро-нечёткой сети на основе турнирного метода селекции хромосом (рис. 11). На рисунке 12 представлены различные результаты обучения сети с заданной точностью обучения.

Рисунок 11. Форма приложения обучения сети ANFIS

После этапа обучения можно записать полученные значения параметров сети в локальную базу данных формата Paradox 7.0, после чего они будут доступны для загрузки в качестве исходных параметров в нейро-нечёткую сеть (рис. 12).

Рисунок 12. Статистические данные результатов обучения сети

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

Рисунок 13. Коррекция параметров сети

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

Рисунок 14. Отчёт в Excel, содержащий статистические данные обучения сети

Ниже представлены графики функций принадлежности входов сети, полученных после её обучения (рис. 15 - 18).

Рисунок 15. Функции принадлежности

Рисунок 16. Функции принадлежности лингвистической переменной «Коэффициент книгообеспеченности»

Рисунок 17. Функции принадлежности лингвистической переменной «Наличие учебных изданий с грифом»

Рисунок 18. Функции принадлежности лингвистической переменной «Критерий устареваемости основных учебных изданий из учебного фонда»

В результате после подключения модуля принятия решений к многомерной структуре данных для Норильского индустриального института для получения результата проведения аттестации вуза «НИИ» по показателям библиотеки относительно фонда ГСЭ получены результаты, представленные на рисунках 19, 24. На рисунке 20 показаны результаты нечёткого вывода до обучения сети (установленные на основании экспертной оценки по умолчанию), а на рисунке 21 - после её обучения.

Рисунок 19. Главная форма приложения «Информационное обеспечение вуза»

Рисунок 20. Результаты нечёткого вывода алгоритма Мамдани до обучения сети

Рисунок 21. Результат нечёткого вывода алгоритма Мамдани после обучения сети

В результате получим значение центра тяжести фигуры 0,6600 и 0,7300 соответственно до и после обучения, что соответствует результату - вуз «Аттестован». Последний результат учитывает все нюансы состояния ИБФ НИИ и, естественно, точнее отражает все показатели работы библиотеки относительно фонда ГСЭ, которые в данном случае соответствуют установленным минимальным нормам Федерального агентства по образованию РФ.

В качестве примера, зададим другие данные (рис. 24): объём фонда основной учебной литературы составляет 56% от всего фонда библиотеки; книгообеспеченность на одного студента - 47%; издания с грифом УМО составляют 52% от основной учебной литературы и устареваемость книги соответствует на 60%. Таким образом, получим, что вуз будет аттестован с замечаниями (рис. 22 и 23).

Рисунок 22. Результаты нечёткого вывода алгоритма Мамдани до обучения сети

Рисунок 23. Результаты нечёткого вывода алгоритма Мамдани после обучения сети

Рисунок 24. Главная форма приложения «Информационное обеспечение вуза»

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

unit Unit3;

interface

uses

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

Dialogs, Grids, StdCtrls, Math, XPMan, ExtCtrls, Menus, Qt;

const n_7 = 20; // 20 - длина двоичной последовательности

n_30 = 30;

n_100 = 180;

n_50 = n_100 div 2;

n_Elit= trunc (n_100 * 0.1);

ai = 0;

bi = 1;

r = 0.000001; // 6 - точность (6 знаков после запятой)

mi = 20; // 20 - длина двоичной последовательности

type

TStr = string [n_7];

TGenotip = array [1..n_7] of 0..1; // двоичное представление числа - 7 генов хромосомы

TChromosome = record // хромосома

Genotip: TGenotip; // параметр (вес) хромосомы

GenSum: TStr; // генотип хромосомы

Fenotip: double; // фенотип хромосомы

end;

TOcob = record

Chr: array [1..n_30] of TChromosome; // 30 хромосом

FunPris: double; // Функция приспособленности особи - функция эффективности - 1/E

p_chi: double; // Вероятность селекции хромосомы Chr: p_chi=FunPris/Сумма_FunPris

v_chi: double; // Сектор колеса, который соответствует данной хромосоме в%: v_chi = p_chi * 100%

a: double; // Начало и

b: double; // конец фрагмента окружности, соответсвующие v_chi - сектору колеса

Cross: boolean; // Вероятность скрещивания (true - равна 1)

Mutat: boolean; // Вероятность мутации (true - равна 1)

Centr: double; // Выход сети (фактическое значение)

end;

TSpecimen = record // Особь, состоящая из

Ocob: TOcob; // 30 хромосом

Error: double; // Целевая функция особи -

 // среднеквадратическая сумма разности вычисленного и эталонного выхода сети

end;

TPopulation = array [1..n_100] of TSpecimen; // Популяция, состоящая из 100 особей

TDescendant = array [1..n_50] of TSpecimen; // Потомок, состоящий из 50 особей родительского пула

TElitist = array [1..n_Elit] of TSpecimen; // Элитарная популяция

type

Thread = class(TThread)

private

{Private declarations}

protected

{Protected declarations}

procedure Execute; override;

end;

type

TForm3 = class(TForm)

GroupBox1: TGroupBox;

SG1: TStringGrid;

Button1: TButton;

GroupBox2: TGroupBox;

SG2: TStringGrid;

GroupBox3: TGroupBox;

SG3: TStringGrid;

Button2: TButton;

CheckBox1: TCheckBox;

Label2: TLabel;

Label1: TLabel;

PopupMenu1: TPopupMenu;

N1: TMenuItem;

RadioGroup1: TRadioGroup;

Edit1: TEdit;

GroupBox4: TGroupBox;

Memo1: TMemo;

RadioGroup2: TRadioGroup;

Button3: TButton;

CheckBox2: TCheckBox;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

Label3: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Timer1: TTimer;

Label4: TLabel;

procedure SG2SelectCell (Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);

procedure Button2Click (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure CheckBox1Click (Sender: TObject);

procedure Timer1Timer (Sender: TObject);

procedure FormCreate (Sender: TObject);

procedure Edit1Click (Sender: TObject);

procedure N1Click (Sender: TObject);

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

procedure Button3Click (Sender: TObject);

procedure CheckBox2Click (Sender: TObject);

procedure N2Click (Sender: TObject);

private

{Private declarations}

public

{Public declarations}

T1: Thread;

procedure P_Genotip (var Gen: TGenotip; Fen: integer); // по значению Yi записываем его генотип (двоичное число)

procedure P_Step_First (var P1: TPopulation); // Первое поколение особей

procedure P_BestChr (Osob1: TOcob); // Формируем «наилучшую» комбинацию хромосом

procedure P_Draw_SG3;

procedure P_Sorting (var P_Sort: TPopulation); // Упорядочиваем особи в популяции по значению целевой функции

procedure P_Div2 (var P1: TPopulation); // Копируем первую половину массива (особей в популяции) во вторую половину

procedure P_RWS (var P1: TPopulation); // RWS - Roulette wheel selection - Метод рулеткм для селекциии хромосом

procedure P_Tourn (var P1: TPopulation); // Турнирный метод - Tournament selection

procedure P_ScalePris (var P1: TPopulation); // Масштабирование ФП

procedure P_MatingPool (P1: TPopulation; var M_i: TSpecimen; r: real); // Формирование родительского пула в результате селекции (отбора по методу рулетки)

procedure P_Crossover (var M1: TPopulation); // Скрещивание двух потомков родительского пула

procedure P_Lokus (var Chr1, Chr2: TGenotip; var Lk1, Lk2: integer); // Объединяем пары родителей и формируем пару потомков

procedure P_Mytation (var P1:TPopulation);

procedure P_Mut_Gen (var Chr1: TGenotip; Lk: integer);

procedure P_FactOut (Osob1: TOcob); // Вывод значений «наилучшей» особи - фактического выхода сети в сетку

function F_Yi (mi:integer; ai, bi, xi: double):integer; // десятичное значение Yi генотипа

function F_GenSum (Gen: TGenotip): TStr; // суммируем 0 и 1, то есть получаем десятичное число, например, 1100110

function F_Fenotip (Gen: TGenotip; mi: integer; ai, bi: double): double; // По значению гена - Yi - получаем фенотип хромосомы - Xi

function F_Error (var Osob1: TOcob): double; // Вычисляем выход сети - каждой особи по конкретной обучающей выборке и

 // рассчитываем абсолютной среднеквадратичной погрешности между фактическим и заданным значением

 // на выходах сетей на основе обучающих эталонов

function F_index_min (P1: TPopulation): integer; // Поиск номера минимального элемента - с наименьшим значением суммарной ошибки

function F_Sred_Elit (P1: TPopulation; index_min: integer): boolean; // Вычисляем возможность рестарта

procedure P_Buttons (b1: boolean);

procedure P_Elitist_Strategy (P1: TPopulation; var Elitist1: TElitist); // Элитарная стратегия - получаем особи с наилучшей ФП

procedure P_ReStart (var P1: TPopulation; Elitist1: TElitist); // Выполняем рестарт алгоритма

procedure P_Elitist (var P1: TPopulation; Elitist1: TElitist); // Сохраняем лучшие особи в популяции

end;

var

Form3: TForm3;

Kol: integer;

P: TPopulation;

Stop: boolean;

detector1, detector2: array [1..n_50] of integer; // Позиция гена - Локус - точка скрещивания хромосом

E: real;

EndTime: Longint; // Время обучения сети в СЕКУНДАХ

Elitist: TElitist;

StartDateTime: TDateTime; // Время НАЧАЛА обучения сети

EndDateTime: TDateTime; // Время ОКОНЧАНИЯ обучения сети

SystemTime: TSystemTime;

Stamp: TTimeStamp;

implementation

uses Unit1, Unit2, Unit4, Unit5, Unit7, Unit1_CorFP, DateUtils;

{$R *.dfm}

 // - //

 // Вычисляем возможность рестарта

function TForm3.F_Sred_Elit (P1: TPopulation; index_min: integer): boolean;

var i: integer;

S: double;

begin

S:= 0;

for i:= 1 to n_100 do S:= S + P1 [i].Error;

S:= S / n_100;

if (abs (S - P1 [index_min].Error) < 0.000001) then F_Sred_Elit:= true

else F_Sred_Elit:= false;

end;

 // - //

 // - //

 // Сохраняем лучшие особи в популяции

procedure TForm3.P_Elitist (var P1: TPopulation; Elitist1: TElitist);

var i: integer;

begin

for i:= 1 to n_Elit do P1 [i]:= Elitist1 [i];

end;

 // - //

 // - //

 // Выполняем рестарт алгоритма

procedure TForm3.P_ReStart (var P1: TPopulation; Elitist1: TElitist);

var i1, j1: integer;

begin

for i1:= 1 to n_100 do

begin

for j1:=1 to n_30 do

begin

if (i1>=1) and (i1<=n_Elit) then P1 [i1]:= Elitist1 [i1]

else begin

P1 [i1].Ocob. Chr[j1].Fenotip:= random(32756) / 32755;

P_Genotip (P1 [i1].Ocob. Chr[j1].Genotip, F_Yi (mi, ai, bi, P1 [i1].Ocob. Chr[j1].Fenotip)); // Находим генный состав (0 и 1) каждой хромосомы в особи

P1 [i1].Ocob. Chr[j1].GenSum:= F_GenSum (P1 [i1].Ocob. Chr[j1].Genotip); // получаем строку из 0 и 1, то есть «0011001»

end; end;

end;

end;

 // - //

 // - //

 // Элитная стратегия - получаем особи с наилучшей ФП

procedure TForm3.P_Elitist_Strategy (P1: TPopulation; var Elitist1: TElitist);

var i: integer;

begin

if Form3. RadioGroup2. ItemIndex = 1 then P_Sorting(P1);

for i:= 1 to n_Elit do Elitist1 [i]:= P1 [i];

end;

 // - //

 // - //

 // Поиск номера минимального элемента - с наименьшим значением суммарной ошибки

function TForm3.F_index_min (P1: TPopulation): integer;

var i: integer;

index: integer;

begin

index:= 1;

for i:= 2 to n_100 do if (P1 [i].Error < P1 [index].Error) then index:= i;

F_index_min:= index;

end;

 // - //

 // - //

 // Турнирный метод - Tournament selection - метод непропорциональной селекции

procedure TForm3.P_Tourn (var P1: TPopulation);

Var M1: TPopulation;

Temp: TSpecimen;

i, j, k: integer;

begin

{1. Формируем первую половину промежуточной популяции - индексы элементов массива P1 - нечётные}

M1:= P1;

i:= 1;

while (i < n_100) do

begin

if (M1 [i].Error < M1 [i+1].Error)

then begin P1 [i].Ocob:= M1 [i].Ocob; P1 [i].Error:= M1 [i].Error; end

else begin P1 [i].Ocob:= M1 [i+1].Ocob; P1 [i].Error:= M1 [i+1].Error; end;

i:= i + 2;

end;

{2. Перемешиваем случайным образом исходную популяцию}

for k:= n_100 downto 2 do

begin

j:= random (k-1)+1;

Temp:= M1 [k];

M1 [k]:= M1 [j];

M1 [j]:= Temp;

end;

{3. Формируем вторую половину промежуточной популяции}

i:= 1;

while (i < n_100) do

begin

if (M1 [i].Error < M1 [i+1].Error)

then begin P1 [i+1].Ocob:= M1 [i].Ocob; P1 [i+1].Error:= M1 [i].Error; end

else begin P1 [i+1].Ocob:= M1 [i+1].Ocob; P1 [i+1].Error:= M1 [i+1].Error; end;

i:= i + 2;

end;

end;

 // - //

 // - //

 // Процедура отключающая / включающая визуальные компоненты

procedure TForm3.P_Buttons (b1: boolean);

begin

Form3. Button2. Enabled:= b1; // false - обучение закончено

Form3. CheckBox1. Enabled:= b1; // false - нельзя приостановить процесс обучения

Form3. CheckBox2. Enabled:= b1; // false - нельзя отключить визуальные компоненты

Form3. Button1. Enabled:= not(b1); // true - можно начать обучение заново

Form3. Button3. Enabled:= not(b1); // true - можно очистить компоненты после обучения

Form3. Edit1. Enabled:= not(b1); // false - нельзя изменить значение точности обучения

Form3. RadioGroup1. Enabled:= not(b1); // false - нельзя изменить значение точности обучения

Form3. RadioGroup2. Enabled:= not(b1); // false - нельзя изменить метод селекции

Form3. PopupMenu1. Items[0].Enabled:= not(b1); // true - После обучения сети, данные записываем в файл

Form3. PopupMenu1. Items[1].Enabled:= not(b1); // true - После обучения сети, можем получить генотип хромосомы

Form2.N1. Enabled:= not (b1); // false - можно добавлять параметры сети

Form2.N3. Enabled:= not (b1); // false - можно скорректировать параметры сети

Form1.N8. Enabled:= not (b1); // false - можно добавлять параметры сети

if (b1 = true) then

begin

Label5. Caption:= «;

Label6. Caption:= «;

Label7. Caption:= «;

end;

end;

 // - //

 // - //

 // Процедура обучения сети с помощью генетического алгоритма

procedure Thread. Execute;

var i: integer;

index_min: integer;

begin

{Шаг 1. Инициализация начальной популяции}

Form3. Button3Click(Self);

Stop:= false;

Kol:= 0;

Form3.P_Step_First(P);

while (Stop = false) and (Kol <= 500000) do

begin

{Шаг 2. Оценивание приспособленности особи в популяции}

Kol:= Kol + 1;

for i:=1 to n_100 do

begin

P[i].Error:= Form3.F_Error (P[i].Ocob);

if Form3. CheckBox2. Checked=false then Form3.SG3. Cells [1, i]:= FloatToStrF (P[i].Error, ffFixed, 5, 7);

end;

{Шаг 3. Особи сортируются в зависимости от величины ошибки,}

{т.о. во второй половине массива окажутся наиболее неприспособленные особи}

if Form3. RadioGroup2. ItemIndex = 0 then

begin

Form3.P_Sorting(P);

if Form3. CheckBox2. Checked=false then for i:=1 to n_100 do Form3.SG3. Cells [2, i]:= FloatToStrF (P[i].Error, ffFixed, 5, 6);

index_min:=1;

end;

if Form3. RadioGroup2. ItemIndex = 1 then index_min:= Form3.F_index_min(P);

if Form3. CheckBox2. Checked = false then

begin

Form3. Memo1. Lines. Add ('Этап: ' + IntToStr(Kol) + ' Ошибка: ' + FloatToStrF (P[index_min].Error, ffFixed, 6, 10));

Synchronize (Form4.DRAW);

end;

{Сохраняем наилучшую хромосому}

Form3.P_Elitist_Strategy (P, Elitist);

{Шаг 4. Проверка условия остановки алгоритма}

if (P [index_min].Error < E) or (Kol=500000) or Terminated then

begin

Stop:= true;

Form3.P_BestChr (P[index_min].Ocob);

for i:=1 to n_30 do Form3.SG1. Cells [3, i]:= FloatToStrF (P[index_min].Ocob. Chr[i].Fenotip, fffIxed, 5,6);

Form3.P_FactOut (P[index_min].Ocob);

if Form3. Button2. Enabled = true then Form3. Button2Click(Self);

if Form3. CheckBox2. Checked = true then Form3. CheckBox2. Checked:= false;

Break;

end;

if (Stop <> true) then

begin

{Шаг 5. Селекция хромосом - Метод рулетки}

if Form3. RadioGroup2. ItemIndex = 0 then

begin

{5.1. Первая половина массива копируется во вторую, то есть наиболее неприспособленные особи ликвидируются}

 // Form3.P_Div2 (P);

{5.2. Рассчитываем функцию эффективности особи как 1/Е}

 // for i:=1 to n_100 do P[i].Ocob. FunPris:= 1/P[i].Error;

{5.3. Масштабирование функции приспособленности: 1/(E*1,005)}

Form3.P_ScalePris(P);

{5.4. Формируем родительский пул - M}

Form3.P_RWS(P);

end;

{Шаг 5. Селекция хромосом - Турнирный Метод}

if Form3. RadioGroup2. ItemIndex = 1 then Form3.P_Tourn(P);

{Шаг 6. Применение генетических операторов}

{6.1. Оператор скрещивания}

Form3.P_Crossover(P);

{6.2. Оператор мутации}

Form3.P_Mytation(P);

{Шаг 7. Создание новой популяции}

{Выполняем рестарт алгоритма}

if (Kol mod 250 = 0) or (Form3.F_Sred_Elit (P, index_min) = true)

then Form3.P_ReStart (P, Elitist)

else Form3.P_Elitist (P, Elitist);

end;

end;

end;

 // - //

 // - //

 //

procedure TForm3.P_Draw_SG3;

var i: integer;

begin

Form3.SG3. RowCount:= n_100 +1;

for i:=1 to Form3.SG3. RowCount-1 do Form3.SG3. Cells [0, i]:= '№ ' + IntToStr(i);

Form3.SG3. Cells [1,0]:= 'Ошибка';

Form3.SG3. Cells [2,0]:= 'Упоряд.';

end;

 // - //

 // - //

 // Перевод числа из 10 системы счисления в двоичную (2)

procedure TForm3.P_Genotip (var Gen: TGenotip; Fen: integer);

var i1: integer;

b1: boolean;

begin

b1:= false;

for i1:=1 to n_7 do

begin

if (b1 <> true) then

begin

if (Fen = 1) then

begin

Gen[i1]:= 1;

b1:= true;

end;

if (Fen <> 1) then

begin

Gen[i1]:= Fen - (Fen div 2) *2;

Fen:= (Fen div 2);

end;

end

else Gen[i1]:= 0;

end;

end;

 // - //

 // - //

 // Yi - десятичное значение двоичной последовательности, кодирующей число Xi

function TForm3.F_Yi (mi:integer; ai, bi, xi: double):integer;

begin

result:= trunc((xi - ai) * (power (2, mi) - 1) / (bi-ai));

end;

 // - //

 // - //

 //

function TForm3.F_GenSum (Gen: TGenotip): TStr;

var i1: integer;

s1: TStr;

begin

s1:= «;

for i1:=n_7 downto 1 do s1:= s1 + IntToStr (Gen[i1]);

result:= s1;

end;

 // - //

 // - //

 //

function TForm3.F_Fenotip (Gen: TGenotip; mi: integer; ai, bi: double): double;

 // Шаг 2. Декодирование хромосомы каждой особи

var i1, Yi: integer;

Xi: double;

begin

Yi:= 0;

for i1:=1 to n_7 do Yi:= Yi + Gen[i1]*trunc (power(2, i1-1));

Xi:= ai + Yi*(bi-ai)/(power (2, mi) - 1);

result:= Xi;

end;

 // - //

 // - //

 //

procedure TForm3.P_Step_First (var P1: TPopulation);

 // Шаг 1. Исходная популяция хромосом

var i1, j1: integer;

begin

for i1:= 1 to n_100 do

begin

for j1:=1 to n_30 do

begin

P1 [i1].Ocob. Chr[j1].Fenotip:= random(32756) / 32755;

P_Genotip (P1 [i1].Ocob. Chr[j1].Genotip, F_Yi (mi, ai, bi, P1 [i1].Ocob. Chr[j1].Fenotip)); // Находим генный состав (0 и 1) каждой хромосомы в особи

P1 [i1].Ocob. Chr[j1].GenSum:= F_GenSum (P1 [i1].Ocob. Chr[j1].Genotip); // получаем строку из 0 и 1, то есть «0011001»

end;

end;

end;

 // - //

 // - //

 //

procedure TForm3.P_BestChr (Osob1: TOcob);

begin

Form1.X1_A11_a:= Osob1. Chr[1].Fenotip;

Form1.X1_A11_b:= Osob1. Chr[2].Fenotip;

Form1.X1_A21_a:= Osob1. Chr[3].Fenotip;

Form1.X1_A21_b:= Osob1. Chr[4].Fenotip;

Form1.X2_A12_a:= Osob1. Chr[5].Fenotip;

Form1.X2_A12_b:= Osob1. Chr[6].Fenotip;

Form1.X2_A22_a:= Osob1. Chr[7].Fenotip;

Form1.X2_A22_b:= Osob1. Chr[8].Fenotip;

Form1.X2_A22_c:= Osob1. Chr[9].Fenotip;

Form1.X2_A32_a:= Osob1. Chr[10].Fenotip;

Form1.X2_A32_b:= Osob1. Chr[11].Fenotip;

Form1.X3_A13_a:= Osob1. Chr[12].Fenotip;

Form1.X3_A13_b:= Osob1. Chr[13].Fenotip;

Form1.X3_A23_a:= Osob1. Chr[14].Fenotip;

Form1.X3_A23_b:= Osob1. Chr[15].Fenotip;

Form1.X4_A14_a:= Osob1. Chr[16].Fenotip;

Form1.X4_A14_b:= Osob1. Chr[17].Fenotip;

Form1.X4_A24_a:= Osob1. Chr[18].Fenotip;

Form1.X4_A24_b:= Osob1. Chr[19].Fenotip;

Form1.X4_A24_c:= Osob1. Chr[20].Fenotip;

Form1.X4_A34_a:= Osob1. Chr[21].Fenotip;

Form1.X4_A34_b:= Osob1. Chr[22].Fenotip;

Form1.X7_A17_a:= Osob1. Chr[23].Fenotip;

Form1.X7_A17_b:= Osob1. Chr[24].Fenotip;

Form1.X7_A17_c:= Osob1. Chr[25].Fenotip;

Form1.X7_A27_b:= Osob1. Chr[26].Fenotip;

Form1.X7_A27_c:= Osob1. Chr[27].Fenotip;

Form1.X7_A37_a:= Osob1. Chr[28].Fenotip;

Form1.X7_A37_b:= Osob1. Chr[29].Fenotip;

Form1.X7_A37_c:= Osob1. Chr[30].Fenotip;

end;

 // - //

 // - //

 // Вывод фактического выхода сети

procedure TForm3.P_FactOut (Osob1: TOcob);

var i: integer;

begin

P_BestChr(Osob1);

Form1.B_Obuc:= true;

for i:=1 to n_30 do {Обучающая выборка}

begin

Form1.N_Obuc:= i;

Form1.P_Output (Form1.B_Obuc, Form1.N_Obuc);

Osob1. Centr:= Form1. Centr_X;

SG1. Cells [4, i]:= FloatToStrF (Osob1. Centr, ffFixed, 6,6);

end;

end;

 // - //

 // - //

 //

function TForm3.F_Error (var Osob1: TOcob): double;

var i: integer;

Err: double;

begin

Err:= 0;

P_BestChr(Osob1);

Form1.B_Obuc:= true;

for i:=1 to n_30 do {Обучающая выборка}

begin

Form1.N_Obuc:= i;

Form1.P_Output (Form1.B_Obuc, Form1.N_Obuc);

Osob1. Centr:= Form1. Centr_X;

Err:= Err + sqr (abs(Osob1. Centr) - abs (StrToFloat(SG2. Cells [5, i])));

end;

Err:= Err / n_30;

result:= Err;

end;

 // - //

 // - //

 //

procedure TForm3.P_Sorting (var P_Sort: TPopulation);

{Сортировка элементов массива методом Вставками}

var i, j: integer;

temp: TSpecimen;

begin

for i:=2 to n_100 do

begin

j:= i;

while (j > 1) do

begin

if (P_Sort[j].Error < P_Sort [j-1].Error) then

begin

temp. Ocob:= P_Sort[j].Ocob;

temp. Error:= P_Sort[j].Error;

P_Sort[j].Ocob:= P_Sort [j-1].Ocob;

P_Sort[j].Error:= P_Sort [j-1].Error;

P_Sort [j-1].Ocob:= temp. Ocob;

P_Sort [j-1].Error:= temp. Error;

end;

j:= j - 1;

end;

end;

end;

 // - //

 // - //

 //

procedure TForm3.P_Div2 (var P1: TPopulation);

var i, j, t: integer;

begin

j:= 0;

t:= n_100 div 2;

for i:=t+1 to n_100 do

begin

j:= j+1;

P1 [i].Ocob:= P1 [j].Ocob;

P1 [i].Error:= P1 [j].Error;

end;

end;

 // - //

 // - //

 //

procedure TForm3.P_ScalePris (var P1: TPopulation);

var i: integer;

begin

 // Степенное масштабирование (power law scaling)

 // for i:=1 to n_100 do P1 [i].Ocob. FunPris:= Power (P1 [i].Ocob. FunPris, 1.005);

for i:=1 to n_100 do P1 [i].Ocob. FunPris:= 1/Power (P1 [i].Error, 1.005);

end;

 // - //

 // - //

 // Метод рулетки

procedure TForm3.P_RWS (var P1:TPopulation);

var i: integer;

Sum_FunPris: double;

M1: TPopulation;

begin

{Рисуем сектора рулетки}

Sum_FunPris:= 0;

for i:=1 to n_100 do Sum_FunPris:= Sum_FunPris + P1 [i].Ocob. FunPris;

for i:=1 to n_100 do

begin

P1 [i].Ocob.p_chi:= P1 [i].Ocob. FunPris / Sum_FunPris;

P1 [i].Ocob.v_chi:= P1 [i].Ocob.p_chi * 100;

if (i=1) then

begin

P1 [i].Ocob.a:= 0.0;

P1 [i].Ocob.b:= P1 [i].Ocob.v_chi;

end

else

begin

if (i=n_100) then

begin

P1 [i].Ocob.a:= P1 [i-1].Ocob.b;

P1 [i].Ocob.b:= 100.0;

end

else

begin

P1 [i].Ocob.a:= P1 [i-1].Ocob.b;

P1 [i].Ocob.b:= P1 [i].Ocob.a + P1 [i].Ocob.v_chi;

end;

end;

end;

{Создание родительской популяции - родительского пула - mating pool}

for i:=1 to n_100 do P_MatingPool (P1, M1 [i], (random(32756) / 32755)*100);

P1:= M1;

end;

 // - //

 // - //

 //

procedure TForm3.P_MatingPool (P1: TPopulation; var M_i: TSpecimen; r: real);

var i: integer;

begin

for i:= 1 to n_100 do if (r >= P1 [i].Ocob.a) and (r <= P1 [i].Ocob.b) then M_i:= P1 [i];

end;

 // - //

 // - //

 // Проводим двухточечное скрещивание хромосом

procedure TForm3.P_Lokus (var Chr1, Chr2: TGenotip; var Lk1, Lk2: integer);

var i: integer;

t: 0..1;

temp: integer;

begin

{

 // Одноточечное скрещивание

for i:=(n_7-Lk + 1) downto 1 do

begin

t:= Chr1 [i];

Chr1 [i]:= Chr2 [i];

Chr2 [i]:= t;

end;

}

if (Lk1 > Lk2) then

begin

temp:= Lk1;

Lk1:= Lk2;

Lk2:= temp;

end;

for i:=(n_7-Lk1) downto (n_7 - Lk2) do

begin

t:= Chr1 [i];

Chr1 [i]:= Chr2 [i];

Chr2 [i]:= t;

end;

end;

 // - //

 // - //

 // Процедура скрещивания хромосом двух пар особей

procedure TForm3.P_Crossover (var M1: TPopulation);

var d1, d2: TDescendant;

Pc: real;

i, j: integer;

begin

{Начальное значение}

for i:=1 to n_100 do

begin

M1 [i].Ocob. Cross:= false;

M1 [i].Ocob. Mutat:= false;

end;

for i:=1 to n_50 do

begin

d1 [i].Ocob. Cross:= false; d1 [i].Ocob. Mutat:= false;

d2 [i].Ocob. Cross:= false; d2 [i].Ocob. Mutat:= false;

end;

{Формируем 50 пар -}

for i:=1 to n_50 do

begin

j:= 1;

while (d1 [i].Ocob. Cross = false) do

begin

Pc:= random(32756) / 32755;

if (M1 [j].Ocob. Cross = false) and (Pc >= 0.5) then

begin

d1 [i].Ocob. Cross:= true;

M1 [j].Ocob. Cross:= true;

d1 [i].Ocob:= M1 [j].Ocob;

d1 [i].Error:= M1 [j].Error;

end;

if (j = n_100) then j:= 1

else j:= j +1;

end;

end;

for i:=1 to n_50 do

begin

j:= 1;

while (d2 [i].Ocob. Cross = false) do

begin

Pc:= random(32756) / 32755;

if (M1 [j].Ocob. Cross = false) and (Pc >= 0.5) then

begin

d2 [i].Ocob. Cross:= true;

M1 [j].Ocob. Cross:= true;

d2 [i].Ocob:= M1 [j].Ocob;

d2 [i].Error:= M1 [j].Error;

end;

if (j = n_100) then j:= 1

else j:= j +1;

end;

end;

{Определяем Локус}

if Form3. RadioGroup2. ItemIndex = 0 then begin {Метод «Рулетки»}

 //for i:= trunc (n_100 * 0.15) to n_50 do

for i:= 1 to n_50 do

begin

for j:=1 to n_30 do begin

detector1 [i]:= random (n_7-1) + 1;

detector2 [i]:= random (n_7-1) + 1;

P_Lokus (d1 [i].Ocob. Chr[j].Genotip, d2 [i].Ocob. Chr[j].Genotip, detector1 [i], detector2 [i]);

end;

end;

end;

if Form3. RadioGroup2. ItemIndex = 1 then begin {«Турнирный» метод}

for i:= 1 to n_50 do

begin

for j:=1 to n_30 do begin

detector1 [i]:= random (n_7-1) + 1;

detector2 [i]:= random (n_7-1) + 1;

P_Lokus (d1 [i].Ocob. Chr[j].Genotip, d2 [i].Ocob. Chr[j].Genotip, detector1 [i], detector2 [i]);

end;

end;

end;

for i:= 1 to n_50 do

begin

for j:=1 to n_30 do begin d1 [i].Ocob. Chr[j].GenSum:= F_GenSum (d1 [i].Ocob. Chr[j].Genotip);

d1 [i].Ocob. Chr[j].Fenotip:= F_Fenotip (d1 [i].Ocob. Chr[j].Genotip, mi, ai, bi);

end;

for j:=1 to n_30 do begin d2 [i].Ocob. Chr[j].GenSum:= F_GenSum (d2 [i].Ocob. Chr[j].Genotip);

d2 [i].Ocob. Chr[j].Fenotip:= F_Fenotip (d2 [i].Ocob. Chr[j].Genotip, mi, ai, bi);

end;

end;

j:= 0;

for i:=1 to n_100 do

begin

if (i<=n_50) then M1 [i].Ocob:= d1 [i].Ocob;

if (i> n_50) then

begin j:= j + 1;

M1 [i].Ocob:= d2 [j].Ocob;

end;

end;

end;

 // - //

 // - //

 //

procedure TForm3.P_Mut_Gen (var Chr1: TGenotip; Lk: integer);

begin

if (Chr1 [Lk] = 0) then Chr1 [Lk]:= 1

else Chr1 [Lk]:= 0;

end;

 // - //

 // - //

 // Мутация

procedure TForm3.P_Mytation (var P1:TPopulation);

var i: integer;

j: integer;

k1: integer;

k2: integer;

Pm: real;

begin

if Form3. RadioGroup2. ItemIndex = 0 then begin {Метод «Рулетки»}

 //for i:=trunc (n_100 * 0.30) to n_100 do

for i:=1 to n_100 do

begin

for j:=1 to n_30 do

begin

Pm:= random(32756) / 32755;

if (Pm >= 0.00001) and (Pm <=0.06) then {Зададим вероятность мутации равной - 6%}

begin

k2:= random (trunc(n_7/3))+1;

for k1:= 1 to k2 do P_Mut_Gen (P1 [i].Ocob. Chr[j].Genotip, random (n_7)+1);

P1 [i].Ocob. Chr[j].GenSum:= F_GenSum (P1 [i].Ocob. Chr[j].Genotip);

P1 [i].Ocob. Chr[j].Fenotip:= F_Fenotip (P1 [i].Ocob. Chr[j].Genotip, mi, ai, bi);

end;

end;

end; end;

if Form3. RadioGroup2. ItemIndex = 1 then begin {«Турнирный» метод}

for i:=1 to n_100 do

begin

for j:=1 to n_30 do

begin

Pm:= random(32756) / 32755;

if (Pm >= 0.00001) and (Pm <=0.06) then {Зададим вероятность мутации равной - 6%}

begin

k2:= random (trunc(n_7/3))+1;

for k1:= 1 to k2 do P_Mut_Gen (P1 [i].Ocob. Chr[j].Genotip, random (n_7)+1);

P1 [i].Ocob. Chr[j].GenSum:= F_GenSum (P1 [i].Ocob. Chr[j].Genotip);

P1 [i].Ocob. Chr[j].Fenotip:= F_Fenotip (P1 [i].Ocob. Chr[j].Genotip, mi, ai, bi);

end;

end;

end; end;

end;

 // - //

 // - //

 //

procedure TForm3.SG2SelectCell (Sender: TObject; ACol, ARow: Integer;

var CanSelect: Boolean);

var i:integer;

begin

for i:=1 to n do Form1.SG1. Cells [1, i]:= Form3.SG2. Cells [i, ARow];

Form1.SG1. Cells [1,5]:= «;

Form1. Memo1. Lines. Clear;

Form1. SpeedButton5. Visible:= false;

Form1.CB1. Visible:= false;

end;

 // - //

 // - //

 //

procedure TForm3. Button2Click (Sender: TObject);

var CreationTime, ExitTime, KernelTime, UserTime: TFileTime;

E_Str: string;

begin

if GetThreadTimes (Form3.T1. Handle, CreationTime, ExitTime, KernelTime, UserTime) = true

then

begin

 // FileTimeToSystemTime (UserTime, SystemTime);

 // EndTime:= EncodeTime (SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds);

GetLocalTime(SystemTime); // Получаем текущее время окончания обучения

EndDateTime:= SystemTimeToDateTime(SystemTime); // Запоминаем в переменной текущее время обучения

Label6. Caption:= DateTimeToStr(EndDateTime); // Выводим

Stamp:= DateTimeToTimeStamp (EndDateTime - StartDateTime); // Из типа данных DateTime получаем Дату и Время типа Integer

EndTime:= (Stamp. Date - 693594)*60*60*24 + // Получаем ДАТУ обучения в СЕКУНДАХ

round (Stamp. Time/1000); // Получаем ВРЕМЯ обучения в СЕКУНДАХ

Label7. Caption:= IntToStr(EndTime);

end;

if Assigned (Form3.T1) then

begin

Form3.T1. Terminate;

E_Str:= FloatToStrF (P[Form3.F_index_min(P)].Error, ffFixed, 9,8);

try

if Stop = false then if InputQuery ('Внимание! Процесс обучения сети остановлен пользователем!', 'Установить новое значение точности обучения?', E_Str) = true then E:= StrToFloat (E_Str);

except

ShowMessage ('Точность обучения сети введена не верно.' + #13 + 'Будет установлена толерантная точность обучения.');

end;

end;

P_Buttons(false); // Останавливаем обучение

end;

 // - //

 // - //

 //

procedure TForm3. Button1Click (Sender: TObject);

 //var i: integer;

begin

try

if (Form3. RadioGroup1. ItemIndex <> 5) then E:= StrToFloat (RadioGroup1. Items [Form3. RadioGroup1. ItemIndex])

else E:= StrToFloat (Form3. Edit1. Text);

T1:= Thread. Create(true);

 // Деструктор потока будет вызван автоматически по его завершению, т.к. true

T1. FreeOnTerminate:= True;

 // Задаём приоритет потока

T1. Priority:= tpLower;

 // Запускаем поток

T1. Resume;

P_Buttons(true); // Начинаем обучение сети

GetLocalTime(SystemTime); // Получаем текущее время НАЧАЛА обучения сети

StartDateTime:= SystemTimeToDateTime(SystemTime); // Запоминаем время начала обучения

Label5. Caption:= DateTimeToStr(StartDateTime); // Выводим время начала обучения

except

Application. MessageBox ('Задайте корректное значение «точности ошибки обучения»!', 'Ошибка!', MB_OK + MB_ICONERROR);

end;

end;

 // - //

 // - //

 //

procedure TForm3. CheckBox1Click (Sender: TObject);

begin

if CheckBox1. Checked = true then

begin

{Приостановление работы потока}

T1. Suspend;

Button2. Enabled:= not (CheckBox1. Checked);

CheckBox2. Enabled:= not (CheckBox1. Checked);

end

else

begin

{Продолжение работы потока}

T1. Resume;

Button2. Enabled:= not (CheckBox1. Checked);

CheckBox2. Enabled:= not (CheckBox1. Checked);

end;

end;

 // - //

 // - //

 //

procedure TForm3. Timer1Timer (Sender: TObject);

begin

Label1. Caption:= TimeToStr(time);

end;

 // - //

 // - //

 //

procedure TForm3. FormCreate (Sender: TObject);

var i1: integer;

begin

Label5. Caption:= «;

Label6. Caption:= «;

Label7. Caption:= «;

randomize; {}

Timer1. OnTimer(Self);

P_Draw_SG3;

 //for i1:=0 to SG1. RowCount-1 do SG1. Rows[i1].Clear;

SG1. Cells [0,0]:= 'Параметр'; SG1. Cells [2,0]:= 'Исх. знач.';

SG1. Cells [0,1]:= 'X1_A11_a'; SG1. Cells [2,1]:= FloatToStrF (Form1.X1_A11_a, ffFixed, 4,2);

SG1. Cells [0,2]:= 'X1_A11_b'; SG1. Cells [2,2]:= FloatToStrF (Form1.X1_A11_b, ffFixed, 4,2);

SG1. Cells [0,3]:= 'X1_A21_a'; SG1. Cells [2,3]:= FloatToStrF (Form1.X1_A21_a, ffFixed, 4,2);

SG1. Cells [0,4]:= 'X1_A21_b'; SG1. Cells [2,4]:= FloatToStrF (Form1.X1_A21_b, ffFixed, 4,2);

SG1. Cells [0,5]:= 'X2_A12_a'; SG1. Cells [2,5]:= FloatToStrF (Form1.X2_A12_a, ffFixed, 4,2);

SG1. Cells [0,6]:= 'X2_A12_b'; SG1. Cells [2,6]:= FloatToStrF (Form1.X2_A12_b, ffFixed, 4,2);

SG1. Cells [0,7]:= 'X2_A22_a'; SG1. Cells [2,7]:= FloatToStrF (Form1.X2_A22_a, ffFixed, 4,2);

SG1. Cells [0,8]:= 'X2_A22_b'; SG1. Cells [2,8]:= FloatToStrF (Form1.X2_A22_b, ffFixed, 4,2);

SG1. Cells [0,9]:= 'X2_A22_c'; SG1. Cells [2,9]:= FloatToStrF (Form1.X2_A22_c, ffFixed, 4,2);

SG1. Cells [0,10]:= 'X2_A32_a'; SG1. Cells [2,10]:= FloatToStrF (Form1.X2_A32_a, ffFixed, 4,2);

SG1. Cells [0,11]:= 'X2_A32_b'; SG1. Cells [2,11]:= FloatToStrF (Form1.X2_A32_b, ffFixed, 4,2);

SG1. Cells [0,12]:= 'X3_A13_a'; SG1. Cells [2,12]:= FloatToStrF (Form1.X3_A13_a, ffFixed, 4,2);

SG1. Cells [0,13]:= 'X3_A13_b'; SG1. Cells [2,13]:= FloatToStrF (Form1.X3_A13_b, ffFixed, 4,2);

SG1. Cells [0,14]:= 'X3_A23_a'; SG1. Cells [2,14]:= FloatToStrF (Form1.X3_A23_a, ffFixed, 4,2);

SG1. Cells [0,15]:= 'X3_A23_b'; SG1. Cells [2,15]:= FloatToStrF (Form1.X3_A23_b, ffFixed, 4,2);

SG1. Cells [0,16]:= 'X4_A14_a'; SG1. Cells [2,16]:= FloatToStrF (Form1.X4_A14_a, ffFixed, 4,2);

SG1. Cells [0,17]:= 'X4_A14_b'; SG1. Cells [2,17]:= FloatToStrF (Form1.X4_A14_b, ffFixed, 4,2);

SG1. Cells [0,18]:= 'X4_A24_a'; SG1. Cells [2,18]:= FloatToStrF (Form1.X4_A24_a, ffFixed, 4,2);

SG1. Cells [0,19]:= 'X4_A24_b'; SG1. Cells [2,19]:= FloatToStrF (Form1.X4_A24_b, ffFixed, 4,2);

SG1. Cells [0,20]:= 'X4_A24_c'; SG1. Cells [2,20]:= FloatToStrF (Form1.X4_A24_c, ffFixed, 4,2);

SG1. Cells [0,21]:= 'X4_A34_a'; SG1. Cells [2,21]:= FloatToStrF (Form1.X4_A34_a, ffFixed, 4,2);

SG1. Cells [0,22]:= 'X4_A34_b'; SG1. Cells [2,22]:= FloatToStrF (Form1.X4_A34_b, ffFixed, 4,2);

SG1. Cells [0,23]:= 'X7_A17_a'; SG1. Cells [2,23]:= FloatToStrF (Form1.X7_A17_a, ffFixed, 4,2);

SG1. Cells [0,24]:= 'X7_A17_b'; SG1. Cells [2,24]:= FloatToStrF (Form1.X7_A17_b, ffFixed, 4,2);

SG1. Cells [0,25]:= 'X7_A17_c'; SG1. Cells [2,25]:= FloatToStrF (Form1.X7_A17_c, ffFixed, 4,2);

SG1. Cells [0,26]:= 'X7_A27_b'; SG1. Cells [2,26]:= FloatToStrF (Form1.X7_A27_b, ffFixed, 4,2);

SG1. Cells [0,27]:= 'X7_A27_c'; SG1. Cells [2,27]:= FloatToStrF (Form1.X7_A27_c, ffFixed, 4,2);

SG1. Cells [0,28]:= 'X7_A37_a'; SG1. Cells [2,28]:= FloatToStrF (Form1.X7_A37_a, ffFixed, 4,2);

SG1. Cells [0,29]:= 'X7_A37_b'; SG1. Cells [2,29]:= FloatToStrF (Form1.X7_A37_b, ffFixed, 4,2);

SG1. Cells [0,30]:= 'X7_A37_c'; SG1. Cells [2,30]:= FloatToStrF (Form1.X7_A37_c, ffFixed, 4,2);

SG1. Cells [1,0]:= 'Вес сети';

for i1:= 1 to SG1. RowCount-1 do SG1. Cells [1, i1]:= ' w'+IntToStr(i1);

SG1. Cells [3,0]:= 'Обуч.знач.';

SG1. Cells [4,0]:= 'Выход сети';

{Заполнение сетки обучающими данными}

SG2. Cells [0,0]:= 'Критерий';

for i1:=1 to SG2. ColCount-1 do SG2. Cells [i1,0]:= 'Крит. №'+IntToStr(i1);

for i1:=1 to SG2. RowCount-1 do SG2. Cells [0, i1]:= 'Об.выб.'+IntToStr(i1);

SG2. Cells [1,1]:= '0,56'; SG2. Cells [2,1]:= '0,47'; SG2. Cells [3,1]:= '0,52'; SG2. Cells [4,1]:= '0,60'; SG2. Cells [5,1]:= '0,5813';

...

Подобные документы

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

    курсовая работа [33,5 K], добавлен 26.08.2010

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

    дипломная работа [5,1 M], добавлен 19.01.2017

  • Типовая структура информационно-вычислительной сети. Функции, процедуры, механизмы и средства защиты ИВС. Технология виртуальных частных сетей. Разработка алгоритмов управления интенсивностью информационного обмена удаленных сегментов распределенной ИВС.

    дипломная работа [2,1 M], добавлен 21.12.2012

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

    дипломная работа [1,9 M], добавлен 11.04.2013

  • Возможности программ моделирования нейронных сетей. Виды нейросетей: персептроны, сети Кохонена, сети радиальных базисных функций. Генетический алгоритм, его применение для оптимизации нейросетей. Система моделирования нейронных сетей Trajan 2.0.

    дипломная работа [2,3 M], добавлен 13.10.2015

  • Разработка системы управления базой данных "Структура ВУЗа". Требования к программе: функциональным характеристикам, надежности, эксплуатации, составу и параметрам технических средств. Требования к программной документации. Порядок контроля и приемки.

    курсовая работа [982,7 K], добавлен 08.06.2015

  • Задачи школьной библиотеки. Проблемы перехода школ на ОС Linux. Обзор рынка библиотечных информационных систем. Сравнительный анализ Microsoft Office и OpenOffice. Законодательные акты учёта библиотечного фонда. Средства, входящие в OpenOffice Base.

    дипломная работа [1,8 M], добавлен 22.06.2013

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

    дипломная работа [1,9 M], добавлен 10.07.2017

  • Методы решения проблем, возникающих на стадиях и этапах процесса принятия решений, их реализация в информационных системах поддержки принятия решений (СППР). Назначение СППР, история их эволюции и характеристика. Основные типы СППР, области их применения.

    реферат [389,3 K], добавлен 22.11.2016

  • Организационная структура предприятия "ЛЕПСЕ", состав сетевых приложений. Выбор конфигурации сети Fast Ethernet, применение сетевой топологии "звезда". Структура кабельной системы сети организации. Проверка работоспособности проектируемой сети.

    контрольная работа [64,3 K], добавлен 10.05.2011

  • Оптимизация и дальнейшее развитие локальной сети Костанайского социально-технического университета им. академика З. Алдамжар. Перестройка существующей структуры локальной сети в соответствии с результатами анализа. Антивирусная защита компьютерной сети.

    дипломная работа [2,0 M], добавлен 02.07.2015

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

    курсовая работа [39,5 K], добавлен 15.07.2013

  • Организация работы приемной комиссии и делопроизводства ВУЗа. Назначение, основные задачи системы управления базами данных "Абитуриент". Схема организации компьютерной сети. Автоматизированная система подачи заявлений и зачисления абитуриентов.

    отчет по практике [2,3 M], добавлен 01.07.2015

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

    курсовая работа [90,4 K], добавлен 03.10.2013

  • Математическая модель искусственной нейронной сети. Структура многослойного персептрона. Обучение без учителя, методом соревнования. Правило коррекции по ошибке. Метод Хэбба. Генетический алгоритм. Применение нейронных сетей для синтеза регуляторов.

    дипломная работа [1,5 M], добавлен 17.09.2013

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

    курсовая работа [1,7 M], добавлен 14.06.2015

  • Исследование существующих методов организации динамических структур данных. Методы реализации мультисписковых структур используя особенности языка C++. Физическая структура данных для сохранения в файл. Разработка алгоритмов и реализация основных функций.

    курсовая работа [504,1 K], добавлен 25.01.2015

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

    реферат [79,8 K], добавлен 14.04.2015

  • Разработка информационной системы ВУЗа с использованием методики объектно-ориентированного моделирования UML. Анализ требований к системе. Концептуальная (содержательная) модель. Диаграмма компонентов и классов. Программная реализация приложения.

    курсовая работа [797,7 K], добавлен 16.04.2014

  • Разработка информационного и алгоритмического обеспечения системой управления базами данных Microsoft Access. Реализация и принцип работы основных компонентов подсистемы поддержки принятия решений. Особенности разработки программного модуля в Delphi.

    реферат [333,9 K], добавлен 15.11.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.