<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Электронный научно-практический журнал «Современная техника и технологии» &#187; C#</title>
	<atom:link href="http://technology.snauka.ru/tags/c/feed" rel="self" type="application/rss+xml" />
	<link>https://technology.snauka.ru</link>
	<description></description>
	<lastBuildDate>Fri, 30 Jan 2026 18:56:12 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>О технологиях организации интерфейса к базе данных</title>
		<link>https://technology.snauka.ru/2015/06/7260</link>
		<comments>https://technology.snauka.ru/2015/06/7260#comments</comments>
		<pubDate>Tue, 16 Jun 2015 11:00:41 +0000</pubDate>
		<dc:creator>Плахотная Людмила Александровна</dc:creator>
				<category><![CDATA[Общая рубрика]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[main button form]]></category>
		<category><![CDATA[MS Access]]></category>
		<category><![CDATA[OLE DB]]></category>
		<category><![CDATA[SQL requests]]></category>
		<category><![CDATA[SQL запросы]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[база данных]]></category>
		<category><![CDATA[главная кнопочная форма]]></category>
		<category><![CDATA[интерфейс]]></category>

		<guid isPermaLink="false">https://technology.snauka.ru/?p=7260</guid>
		<description><![CDATA[В настоящее время многие организации используют информационные системы. Для работы на такой системе требуются настройки приложения и дополнительные ресурсы, а также умение человека работать с этим программным обеспечением. Используя интерфейс, организованный к базе данных можно значительно облегчить задачу пользователям информационных систем. Поэтому организация такого интерфейса посредством языков программирования является сегодня актуальной задачей. В данной статье [...]]]></description>
			<content:encoded><![CDATA[<p><span style="text-align: justify;">В настоящее время многие организации используют информационные системы. Для работы на такой системе требуются настройки приложения и дополнительные ресурсы, а также умение человека работать с этим программным обеспечением. Используя интерфейс, организованный к базе данных можно значительно облегчить задачу пользователям информационных систем. Поэтому организация такого интерфейса посредством языков программирования является сегодня актуальной задачей.</span></p>
<p style="text-align: justify;"><span>В данной статье рассмотрим организацию интерфейса посредством языка программирования C# к базе данных, созданной инструментальными средствами MS Access.<br />
</span></p>
<p style="text-align: justify;"><span>Сайт Microsoft для разработчиков Microsoft Developer Network предоставляет справочник по C# в свободном доступе [1]. На сайте CyberForum.ru проводилось обсуждение самых частых проблем при программировании на C# [2]. Работу с Access на C# разъяснял в своём видео Itist [3]. Проблемой разработки интерфейса к базе данных занимались такие исследователи как Л.А. Плахотная и А.С. Якимов<span style="color: red;"><br />
</span>[4], Р.И. Баженов и др. [5-7]. Г. Шилдт написал полный справочник по C#, где он в подробностях объяснил синтаксис, основные понятия языка, а также проиллюстрировал все свои знания на примерах [8]. А.М.Герасимов в своей диссертации исследовал взаимодействие пользователя с базой данных и анализировал проблему разработки эффективного интерфейса [9]. В своей статье «О технологии организации web-интерфейса к базе данных» исследователи Л.А. Плахотная и А.С. Винокуров рассмотрели реализацию web-интерфейса к базе данных, созданной инструментальными средствами MS Access [10]. В.В. Варкентин и Т.А. Барбасова в статье «Разработка программного обеспечения автоматизированных систем управления технологическими процессами с использованием Visual Studio и базы данных Oracle» [11] рассматривали организацию связи программного обеспечения автоматизированных систем управления технологическими процессами в среде Visual Studio на языке С# с СУБД Oracle. В книге В. Понамарева [12] рассматриваются особенности разработки приложений в среде Visual Studio на языке C#, приведены множество схем, рисунков, а также примеров.<br />
</span></p>
<p style="text-align: justify;"><span>Для реализации нашей задачи будем использовать программное обеспечение Visual C# 2010 Express от Microsoft. Устанавливать соединение с базой данных будем с помощью технологии OLE DB.<br />
</span></p>
<p style="text-align: justify;"><span>Создадим новый проект Приложение Windows Forms. Новую форму назовем &#8220;Заказы и продажи товаров&#8221;. Создадим четыре кнопки: три кнопки для таблиц &#8220;Заказы и продажи&#8221;, &#8220;Покупатели&#8221;, &#8220;Товары&#8221; и одна кнопка для выхода из приложения. Получится следующая форма (см. рис. 1).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_1.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 1 &#8211; Внешний вид главной кнопочной формы.<br />
</span></p>
<p style="text-align: justify;"><span>Создадим новую форму и назовем её «Таблица &#8220;Заказы и продажи&#8221;». Заполним форму полями из таблицы &#8220;Заказы и продажи&#8221;, а также добавим поле &#8220;Фамилия&#8221; из таблицы &#8220;Покупатели&#8221;. Создадим панель навигации, в которую добавим кнопки для перехода по записям, кнопки для добавления новой записи, удаления текущей записи и печати отчета. Получится следующая форма (см. рис. 2).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_2.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 2 &#8211; Внешний вид формы для таблицы &#8220;Заказы и продажи&#8221;.<br />
</span></p>
<p style="text-align: justify;"><span>Теперь отредактируем код формы для таблицы &#8220;Заказы и продажи&#8221;. Для создания соединения с базой данных через OLE DB нам потребуется дополнительная библиотека – System.Data.OleDb. Также для создания отчета и печати нам потребуются библиотеки: Microsoft.Office.Interop.Excel (для использования данной библиотеки потребуется указать ссылку) и System.Drawing.Printing.<br />
</span></p>
<p style="text-align: justify;"><span>Для начала работы с базой данных, необходимо создать экземпляры классов OleDbConnection, OleDbCommand, OleDbDataReader. При загрузке формы проинициализируем соединение с помощью ConnectionString.<br />
</span></p>
<p style="text-align: justify;"><span>Создадим два метода: findFamily (см. рис. 3), который поможет отыскать фамилию, соответствующую текущему заказу, и loaddata (см. рис. 4), который загрузит данные из таблиц в форму. Также для обработки ошибок, если таковые произойдут, заключим код метода loaddata в конструкцию try-catch-finally.<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_3.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 3 &#8211; Программный код для метода findFamily.<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_4.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 4 &#8211; Программный код для метода loaddata.<br />
</span></p>
<p style="text-align: justify;"><span>Переменная n отвечает за текущий номер заказа. Метод loaddata загружает данные из таблицы, используя переменную n. Соответственно, чтобы осуществить переход на одну запись вперед, нужно к n прибавить 1, чтобы перейти на одну запись назад, от n отнять 1 и т.д.<br />
</span></p>
<p style="text-align: justify;"><span>Для удаления текущей записи придется создать два метода: deleteValue, собственно для удаления записи, и patch для исправления номера заказа (см. рис. 5).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_5.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 5 &#8211; Программный код для методов deleteValue и patch.<br />
</span></p>
<p style="text-align: justify;"><span>Введем новые переменные, которые понадобятся для печати отчета (см. рис. 6).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_6.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 6 &#8211; Переменные для печати отчетов.<br />
</span></p>
<p style="text-align: justify;"><span>Метод uploadData будет обращаться к базе данных с помощью запросов и записывать значения полей в ячейки Excel. Запишем код для кнопки &#8220;Печать отчета&#8221; (см. рис. 7).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_7.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 7 &#8211; Программный код для кнопки &#8220;Печать отчета&#8221;.<br />
</span></p>
<p style="text-align: justify;"><span>Создадим новую форму и назовем её &#8220;Новый заказ&#8221;.<br />
</span></p>
<p style="text-align: justify;"><span>Добавим новый метод AddValue, который будет добавлять новую запись в таблицу и обращаться к форме &#8220;Заказы и продажи&#8221; для загрузки данных в форму. Метод AddValue ничем не отличается от удаления записи – вместо команды DELETE необходимо использовать команду INSERT. Выполнение всех методов прописывается в соответствующих кнопках.<br />
</span></p>
<p style="text-align: justify;"><span>На этом разработка программы заканчивается. Формы и программный код для таблиц &#8220;Покупатели&#8221; и &#8220;Товары&#8221; создаются аналогичным способом. В данной статье рассмотрено создание формы только для таблицы &#8220;Заказы и продажи&#8221;.<br />
</span></p>
<p style="text-align: justify;"><span>Теперь подробно рассмотрим работу программы. При запуске открывается главная кнопочная форма (см. рис. 8).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_8.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 8 &#8211; Главная кнопочная форма.<br />
</span></p>
<p style="text-align: justify;"><span>Щелкая по кнопке &#8220;Заказы и продажи&#8221; мы переходим к форме «Таблица &#8220;Заказы и продажи&#8221;», где можем просмотреть все записи (см. рис. 9).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_9.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 9 &#8211; Форма для таблицы &#8220;Заказы и продажи&#8221;.<br />
</span></p>
<p style="text-align: justify;"><span>При нажатии кнопки добавления новой записи (кнопка со знаком &#8220;+&#8221;) откроется новая форма &#8220;Новый заказ&#8221;. Заполнив поля и нажав кнопку &#8220;ОК&#8221; программа добавит новую запись в базу данных (см. рис. 10).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_10.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 10 &#8211; Добавление нового заказа.<br />
</span></p>
<p style="text-align: justify;"><span>Кнопка удаления (кнопка со знаком &#8220;Х&#8221;) удалит текущую запись.<br />
</span></p>
<p style="text-align: justify;"><span>При нажатии кнопки &#8220;Печать отчета&#8221; программа на основе заранее подготовленного шаблона создаст отчет в Excel, куда запишет всю информацию заказов из базы данных, и выведет его на печать (см. рис. 11).<br />
</span></p>
<p style="text-align: center;"><img src="https://technology.snauka.ru/wp-content/uploads/2015/06/061615_1100_11.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 11 &#8211; Сформированный отчет в Excel на основе шаблона.<br />
</span></p>
<p style="text-align: justify;"><span>Таким образом, в статье была рассмотрена возможность взаимодействия с базой данных, посредством интуитивно понятного интерфейса. Было установлено подключение к заранее созданной базе данных посредством OLE DB, созданы SQL запросы на добавление, изменение и удаление записей базы данных, а также осуществлен вывод отчета в Excel с последующей его печатью. Данное программное обеспечение может использоваться в различных предприятиях и организациях для ведения учета заказов, покупателей, товаров и т.п., и как методический пример для студентов.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://technology.snauka.ru/2015/06/7260/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обучение нейронной сети для распознавания цифр посредством построения самоорганизующейся карты и метода Кохонена</title>
		<link>https://technology.snauka.ru/2015/11/8191</link>
		<comments>https://technology.snauka.ru/2015/11/8191#comments</comments>
		<pubDate>Tue, 03 Nov 2015 08:42:22 +0000</pubDate>
		<dc:creator>Щукова Кристина Борисовна</dc:creator>
				<category><![CDATA[Общая рубрика]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[метод Кохонена]]></category>
		<category><![CDATA[нейронная сеть]]></category>
		<category><![CDATA[распознавания цифр]]></category>
		<category><![CDATA[самоорганизующаяся карта]]></category>

		<guid isPermaLink="false">https://technology.snauka.ru/?p=8191</guid>
		<description><![CDATA[Для обучения нейронной сети распознавать цифры от 0 до 9 используется сеть с упорядоченными нейронами или самоорганизующаяся карта. Изначально на вход поступают входные нейроны. Самоорганизующаяся карта накладывает условие, что входной массив нейронов должен быть нормализован и должен лежать в пределах -1 и 1 [1]. В случае с самоорганизующейся картой только один из нейронов принимает значение [...]]]></description>
			<content:encoded><![CDATA[<p>Для обучения нейронной сети распознавать цифры от 0 до 9 используется сеть с упорядоченными нейронами или самоорганизующаяся карта. Изначально на вход поступают входные нейроны. Самоорганизующаяся карта накладывает условие, что входной массив нейронов должен быть нормализован и должен лежать в пределах -1 и 1 [1]. В случае с самоорганизующейся картой только один из нейронов принимает значение true или false.</p>
<p>Структура такой сети приведена на рисунке  1.</p>
<p><a href="https://technology.snauka.ru/2015/11/8191/snimok-4" rel="attachment wp-att-8193"><img class="size-full wp-image-8193 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/Snimok.png" alt="" width="368" height="350" /></a></p>
<p style="text-align: center;">Рисунок 1. Структура самоорганизующейся карты</p>
<p>Самоорганизующаяся карта требует, чтобы входной поток нейронов был нормализован в пределах от -1 до 1. Причем каждый из входных нейронов должен полностью использовать этот диапазон. Если бы один или два нейрона использовали только числа между 0 и 1, то нейронная сеть бы пострадала.</p>
<p>Есть два основных способа нормализации данных:</p>
<p>1)    Мультипликативная нормализация.</p>
<p>2)    Z-нормализация.</p>
<p>На практике следует применять оба метода. Первый способ довольно прост. Но второй способ обеспечивает лучшее распределение значений внутри диапазона.</p>
<p>Для того, чтобы выполнить нормализацию, нужно вычислить длину вектора входных данных. Фактор нормализации рассчитывается по формуле:</p>
<p><a href="https://technology.snauka.ru/2015/11/8191/attachment/999999999999999" rel="attachment wp-att-8194"><img class="size-full wp-image-8194 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/999999999999999.png" alt="" width="91" height="77" /></a></p>
<p>Для второго способа формула выглядит иначе:</p>
<p><a href="https://technology.snauka.ru/2015/11/8191/attachment/00000000000000000000000000000" rel="attachment wp-att-8195"><img class="size-full wp-image-8195 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/00000000000000000000000000000.png" alt="" width="75" height="44" /></a></p>
<p>Равенство показывает, что фактор нормализации зависит только от размера исходных данных. Таким образом, эта величина всегда постоянно и не позволяет учитывать фактические данные. Чтобы это учесть, вводят синтетический показатель, который также рассчитывается по формуле [2]:</p>
<p style="text-align: center;"><a href="https://technology.snauka.ru/2015/11/8191/attachment/88888888888888888888888888" rel="attachment wp-att-8196"><img class="alignnone size-full wp-image-8196" src="https://technology.snauka.ru/wp-content/uploads/2015/11/88888888888888888888888888.png" alt="" width="84" height="26" /></a>,</p>
<p align="center">где n- это размер входных данных, f – фактор нормализации, а l – это длина вектора</p>
<p>Второй метод на практике используют чаще, так как он позволяет сохранять абсолютную величину. Но если обучающие значения будут около нуля, то такой подход не самый лучший, так как синтетический фактор будет преобладать над другими ненулевыми значениями. В этом случае, следует применять первый метод.</p>
<p>Чтобы вычислить выходной нейрон, используется входной вектор и нейронные веса связей. Должно быть вычислено скалярное произведение между вектором входных нейронов и вектором их весов связей. Соответственно, чтобы вычислить такое скалярное произведение, нужно преобразовать каждый элемент в вектор. Данные вычисления применяются для каждого нейрона в отдельности. Получившееся скалярное произведение умножается на фактор нормализации. Полученный результат должен быть нормализован с учетом биополярной системой.</p>
<p>Биополярное число – это альтернативный способ представления бинарных чисел. В биополярной системе бинарный ноль преобразуется в -1, а бинарная единица в 1. Поэтому все значения выходных нейронов преобразуются в эту систему.</p>
<p>Чтобы определить нейрона победителя, нужно для каждого нейрона  в отдельности выполнить вышеуказанные вычисления и нормализовать значения. Далее тот нейрон, у которого выходное значение больше, является победителем.</p>
<p>В целом, процесс обучения такой сети состоит из нескольких шагов или итераций и повторяется до тех пор, пока ошибка сети будет ниже заданного порога. Кроме того, нужно рассчитывать на каждом шаге коэффициент ошибок сети и корректировать веса нейронов.</p>
<p>Сам процесс обучения основан на конкуренции между нейронами. Это означает, что только один нейрон выигрывает. Так как разные нейроны на разных итерациях выигрывают для разных моделей, то их способность распознавания увеличивается. Процесс обучения повторяется до тех пор, пока не выполнится одно из двух условий. Если вычислительная ошибка станет ниже порога, то обучение завершается. И если коэффициент ошибки изменится на очень маленькое число, то цикл будет прерван без каких-либо дополнительных повторений.  Как только цикл прерывается, обучение начинается заново и веса на начальном этапе для нейронов генерируются случайно [1].</p>
<p>Коэффициент обучения или скорость обучения должна быть положительным числом и меньше чем 1. Типично берут значение в диапазоне от 0.4 до 0.5. Если резко увеличивать скорость обучения, то процесс обучения будет быстрый. Но сеть может расходиться на последних итерациях в результате такой высокой скорости. Это может произойти в результате того, что погрешности весов будут слишком велики для процесса распознавания образов.</p>
<p>Поэтому лучше всего установить на начальных итерациях высокую скорость и снижать ее постепенно. Это позволит увеличить первоначальную скорость обучения и сохранить сеть.</p>
<p>В процессе обучения также осуществляется регулирование весов нейронов. Веса регулируются на каждой итерации.  Для расчёта весов используется метод Кохонена:</p>
<p style="text-align: center;"><a href="https://technology.snauka.ru/2015/11/8191/attachment/000000000000000000000" rel="attachment wp-att-8197"><img class="alignnone size-full wp-image-8197" src="https://technology.snauka.ru/wp-content/uploads/2015/11/000000000000000000000.png" alt="" width="196" height="75" /></a>,</p>
<p style="text-align: center;">x- вектор обучения; wt – длина нейрона-победителя; wt+1 – новый вес.</p>
<p>При решении задачи были реализованы основные классы:</p>
<p>1)    класс Matrix и MatrixMath, который содержит методы для работы с матрицей и преобразования векторов;</p>
<p>2)    Normalize – реализует методы нормализации входных нейронов;</p>
<p>3)    SelfOrganizingMap – реализует самоорганизующуюся сеть;</p>
<p>4)    TrainSelfOrganizingMap – реализует процесс обучения сети.</p>
<p>Идея программы заключается  в том, что пользователь рисует какой-то символ, и у него есть несколько сценариев:</p>
<p>1)            обучить сеть нарисованным буквам;</p>
<p>2)            распознать нарисованный символ;</p>
<p>3)            загрузить из файла заранее заданные символы для обучения.</p>
<p>Перед процессом распознавания образов необходимо нарисованное изображение преобразовать к матрице размером 5х7. Кроме того, необходимо обрезать изображение, и удалить все пустые белые пространства.</p>
<p>Результат работы обученной нейронной сети приведен на рисунке 2.</p>
<p><a href="https://technology.snauka.ru/2015/11/8191/attachment/33333333333333333" rel="attachment wp-att-8198"><img class="size-full wp-image-8198 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/33333333333333333.png" alt="" width="700" height="487" /></a></p>
<p style="text-align: center;">Рисунок 2. Результаты обучения нейронной сети</p>
<p>Программа позволяет методом Кохонена вычислять текущую и лучшую ошибку обучения нейронной сети. Следует отметить, что точность результатов зависит от количества сделанных попыток и запомненных распознаваемых образов.</p>
]]></content:encoded>
			<wfw:commentRss>https://technology.snauka.ru/2015/11/8191/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обучение нейронной сети при помощи генетического алгоритма для логических операторов OR, AND и XOR</title>
		<link>https://technology.snauka.ru/2015/11/8179</link>
		<comments>https://technology.snauka.ru/2015/11/8179#comments</comments>
		<pubDate>Fri, 06 Nov 2015 20:40:12 +0000</pubDate>
		<dc:creator>Щукова Кристина Борисовна</dc:creator>
				<category><![CDATA[Общая рубрика]]></category>
		<category><![CDATA[AND]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[OR]]></category>
		<category><![CDATA[XOR]]></category>
		<category><![CDATA[генетический алгоритм]]></category>
		<category><![CDATA[нейронная сеть]]></category>

		<guid isPermaLink="false">https://technology.snauka.ru/?p=8179</guid>
		<description><![CDATA[Общая идея обучения нейронной сети (НС) при помощи генетического алгоритма (ГА) включает следующие шаги: 1. Формирование начальной популяции. 2. Обучение. 3. Оценка популяции. 4. Ранжировка. 5. Селекция. 6. Скрещивание. 7. Мутация [1]. Информация о нейронной сети кодируется в геном для ГА. В начале алгоритма число популяции генерируется случайно. Необходимо нейронную сеть преобразовать в соответствие с [...]]]></description>
			<content:encoded><![CDATA[<p>Общая идея обучения нейронной сети (НС) при помощи генетического алгоритма (ГА) включает следующие шаги:</p>
<p>1. Формирование начальной популяции.</p>
<p>2. Обучение.</p>
<p>3. Оценка популяции.</p>
<p>4. Ранжировка.</p>
<p>5. Селекция.</p>
<p>6. Скрещивание.</p>
<p>7. Мутация [1].</p>
<p>Информация о нейронной сети кодируется в геном для ГА. В начале алгоритма число популяции генерируется случайно. Необходимо нейронную сеть преобразовать в соответствие с информацией о геноме. Далее необходимо оценить результаты после обучения НС. Далее выполняются стандартные шаги ГА: оценка популяции, селекция, скрещивание, мутация. Главная проблема при комбинировании НС и ГА заключается в преобразовании или кодировании НС в геномы для ГА [2].</p>
<p>Для решения поставленной задачи рассмотрим структуру НС для логических операций OR, XOR и AND. Сеть является многослойной прямого распространения. На вход поступает два нейрона (1 и 0), есть два скрытых слоя и один выходной результат (1 или 0). На рисунке 1 приведена структура многослойной сети для интерпретации решаемой задачи.</p>
<p><a href="https://technology.snauka.ru/2015/11/8179/8-22" rel="attachment wp-att-8180"><img class="size-full wp-image-8180 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/81.png" alt="" width="920" height="436" /></a></p>
<p style="text-align: center;">Рисунок 1. Структура многослойной сети</p>
<p>Таким образом, НС имеет два входных нейрона, два скрытых слоя и один выходной нейрон.</p>
<p>Для генетического алгоритма было выбрано вещественное кодирование, так как это позволяет избавиться от операций кодирования/декодирования, используемых в целочисленном кодировании, а также увеличить точность найденного решения. В качестве метода скрещивания – двухточечный кроссинговер. В качестве функции активации выбрана сигмоидальная функция. Метод селекции &#8211; селекция с усечением.</p>
<p>На 2 рисунке предоставлена разработанная диаграмма классов, описывающая нейронную сеть.</p>
<p><a href="https://technology.snauka.ru/2015/11/8179/attachment/909" rel="attachment wp-att-8181"><img class="alignnone size-full wp-image-8181 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/909.png" alt="" width="757" height="718" /></a></p>
<p style="text-align: center;">Рисунок 2. Диаграмма классов нейронной сети</p>
<p align="left">Описания назначения классов представлены в таблице 1.</p>
<p style="text-align: left;" align="left">Таблица 1. Назначение разработанных классов</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="351">
<p align="left"><strong>Название класса</strong></p>
</td>
<td valign="top" width="663">
<p align="left"><strong>Назначение</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>ActivationFunction</strong><strong></strong></p>
</td>
<td valign="top" width="663">
<p align="left">Класс реализует общий вид функции активации.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>ActivationSigmoid</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Класс реализует сигмоид, заданный формулой:</p>
<p align="left"> <span> </span><img class="alignnone size-full wp-image-8182" src="https://technology.snauka.ru/wp-content/uploads/2015/11/55555.png" alt="" width="157" height="70" /></p>
<p align="left">Эта функция необходима, так как нейронная сеть передает выходной сигнал через функцию активации.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>Chromosome</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Класс реализует хромосому и ее параметры.  Каждая хромосома имеет набор генов, значение целевой функции, число генов, метод скрещивания (двухточечный кроссинговер).</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>ErrorCalculation</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Вычисляется ошибка полученного значения выходного нейрона для того, чтобы определить насколько полученное значение отличается от эталонного или идеального значения. Для этого вычисляется среднеквадратичная ошибка. Каждый элемент обучаемого множества сравнивается с эталоном.  Ошибка вычисляется по формуле:</p>
<p align="left"> <img class="alignnone size-full wp-image-8183" src="https://technology.snauka.ru/wp-content/uploads/2015/11/777777.png" alt="" width="305" height="85" /></p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>FeedforwardLayer</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Описывает каждый слой нейронной сети. Содержит свойства, определяющие входной слой, скрытые слои и выходной слой. Также содержит метод <strong>ComputeOutput</strong><strong> </strong>для расчета выходного нейрона. Выходное значение рассчитывается по формуле:</p>
<p align="left"> <img class="alignnone size-full wp-image-8184" src="https://technology.snauka.ru/wp-content/uploads/2015/11/5e4etsn.png" alt="" width="229" height="71" /></p>
<p align="left">Для вычисления выходного сигнала используется скалярное произведение, реализованное в классе MatrixMath. Скалярное произведение рассчитывается между входной матрицей и матрицей весов. Полученный результат скалярного произведения поступает в функцию активации в качестве параметра для окончательного получения выходного сигнала нейрона.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>FeedforwardNetwork</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Описывает нейронную сеть, состоящую из нескольких слоев, описанных в классе <strong>FeedforwardLaye</strong>r.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>GeneticAlgorithm</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Реализует все этапы генетического алгоритма: селекция, скрещивание, мутация, оценивание.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>MateWorker</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Реализует сам процесс скрещивания особей для создания нового поколения (двухточечный кроссинговер).</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>Matrix</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Класс для создания матрицы и их преобразование в вектора. Входные данные подаются в виде матриц. Поэтому весь процесс работы происходит в основном с матрицами. Содержит методы заполнения матрицы случайными числами, добавления новых строк и столбцов, а также отчистки матрицы.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>MatrixCODEC</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Реализует матрицу кодирования и декодирования. Матрица CODEC может кодировать и декодировать матрицу в/из массива типа doubles. Матрица кодирования и декодирования нужна, когда нейронная сеть должна быть  преобразована в массив типа doubles для использования генетического алгоритма.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>MatrixMath</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Класс, содержащий методы математических операций. В нем реализованы методы нахождения скалярного произведения матрицы. Скалярное произведение двух матриц необходимо для вычисления выходного нейрона. Используется в классе <strong>FeedforwardLayer</strong> в методе <strong>ComputeOutputs.</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>NeuralChromosome</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Преобразованная хромосома, связанная с НС.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>NeuralGeneticAlgorithm</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Адаптация генетического алгоритма для нейронной сети.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>Train</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Класс, описывающий основные этапы обучения. В нем вызывается метод Iteration, которые реализован в классе <strong>Genetic</strong><strong> </strong><strong>Algorithm</strong><strong>. </strong>То есть обучение ведется при помощи ГА.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>TrainingSetNeuralChromosome</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Преобразование нейрона в хромосому для использования ГА. Обучение нейронной сети ГА. Содержит метод вычисления значения целевой функции нейрона.</p>
</td>
</tr>
<tr>
<td valign="top" width="351">
<p align="left"><strong>TrainingSetNeuralGeneticAlgorithm</strong></p>
</td>
<td valign="top" width="663">
<p align="left">Обучение нейронной сети ГА. Содержит метод вычисления среднеквадратичной ошибки при определение лучше приспособленной особи. В методе реализуется процесс обучение нейронной сети ГА и вызывается метод <strong>TrainingSetNeuralChromosome.</strong></p>
</td>
</tr>
</tbody>
</table>
<p>Были проведены различные эксперименты для трех логических операторов XOR, AND и OR с различными параметрами генетического алгоритма.</p>
<p>Пример эксперимента для оператора &#8220;ИЛИ&#8221; приведен на рисунке 3.</p>
<p style="text-align: center;"><a href="https://technology.snauka.ru/wp-content/uploads/2015/11/00000.png"><img class="size-full wp-image-8185 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/00000.png" alt="" width="816" height="485" /></a></p>
<p style="text-align: center;">Рисунок 3. Пример обучения нейронной сети</p>
<p style="text-align: left;">Для обучения нейронной сети с помощью генетического алгоритма задаются следующие параметры: число поколений, размер популяции, вероятность мутации, процент скрещивания.</p>
<p style="text-align: left;">Для наглядности результаты работы сведены в таблицы 2-4.</p>
<p style="text-align: left;">Таблица 2. Результаты работы нейронной сети для логического оператора &#8220;ИЛИ&#8221;</p>
<table width="1538" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="41">
<p align="center"><strong>№</strong></p>
</td>
<td valign="top" width="140">
<p align="center"><strong>Число поколений</strong></p>
</td>
<td valign="top" width="170"><strong>Размер популяции</strong></td>
<td valign="top" width="170">
<p align="center"><strong>Вероятность мутации</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Процент скрещивания</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № 1</strong></p>
<p align="center"><strong>(</strong><strong>0 or 0 = 0)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № 2</strong><strong></strong></p>
<p align="center"><strong>(</strong><strong>1 or 0 = 1)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № </strong><strong>3</strong></p>
<p align="center"><strong>(</strong><strong>0 or 1 = 1)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № </strong><strong>4</strong></p>
<p align="center"><strong>(</strong><strong>1 or 1 = 1)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Средняя ошибка</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">1</p>
</td>
<td valign="top" width="140">
<p align="center">100</p>
</td>
<td valign="top" width="170">
<p align="center">200</p>
</td>
<td valign="top" width="170">
<p align="center">0.1</p>
</td>
<td valign="top" width="170">
<p align="center">0.1</p>
</td>
<td valign="top" width="170">
<p align="center">0.691</p>
</td>
<td valign="top" width="170">
<p align="center">0.695</p>
</td>
<td valign="top" width="170">
<p align="center">0.7276</p>
</td>
<td valign="top" width="170">
<p align="center">0.7527</p>
</td>
<td valign="top" width="170">
<p align="center">0.45</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">2</p>
</td>
<td valign="top" width="140">
<p align="center">500</p>
</td>
<td valign="top" width="170">
<p align="center">500</p>
</td>
<td valign="top" width="170">
<p align="center">0.2</p>
</td>
<td valign="top" width="170">
<p align="center">0.3</p>
</td>
<td valign="top" width="170">
<p align="center">2.21E-07</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">0.37</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">3</p>
</td>
<td valign="top" width="140">
<p align="center">1500</p>
</td>
<td valign="top" width="170">
<p align="center">800</p>
</td>
<td valign="top" width="170">
<p align="center">0.4</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">5Е-21</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">4</p>
</td>
<td valign="top" width="140">
<p align="center">100000</p>
</td>
<td valign="top" width="170">
<p align="center">5000</p>
</td>
<td valign="top" width="170">
<p align="center">0.4</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">5Е-21</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">5</p>
</td>
<td valign="top" width="140">
<p align="center">500000000</p>
</td>
<td valign="top" width="170">
<p align="center">400</p>
</td>
<td valign="top" width="170">
<p align="center">0.1</p>
</td>
<td valign="top" width="170">
<p align="center">0.25</p>
</td>
<td valign="top" width="170">
<p align="center">5.421Е-13</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">0.048</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">6</p>
</td>
<td valign="top" width="140">
<p align="center">100000000</p>
</td>
<td valign="top" width="170">
<p align="center">50000</p>
</td>
<td valign="top" width="170">
<p align="center">0.2</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">0.000723</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">0.00036</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: left;">Таблица 3. Результаты работы нейронной сети для логического оператора &#8220;И&#8221;</p>
<table width="1538" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="41">
<p align="center"><strong>№</strong></p>
</td>
<td valign="top" width="140">
<p align="center"><strong>Число поколений</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Размер популяции</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Вероятность мутации</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Процент скрещивания</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № 1</strong></p>
<p align="center"><strong>(</strong><strong>0 or 0 = 0)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № 2</strong><strong></strong></p>
<p align="center"><strong>(</strong><strong>1 or 0 = </strong><strong>0</strong><strong>)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № </strong><strong>3</strong></p>
<p align="center"><strong>(</strong><strong>0 or 1 = </strong><strong>0</strong><strong>)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № </strong><strong>4</strong></p>
<p align="center"><strong>(</strong><strong>1 or 1 = 1)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Средняя ошибка</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">1</p>
</td>
<td valign="top" width="140">
<p align="center">100</p>
</td>
<td valign="top" width="170">
<p align="center">100</p>
</td>
<td valign="top" width="170">
<p align="center">0.1</p>
</td>
<td valign="top" width="170">
<p align="center">0.25</p>
</td>
<td valign="top" width="170">
<p align="center">0.021</p>
</td>
<td valign="top" width="170">
<p align="center">0.156</p>
</td>
<td valign="top" width="170">
<p align="center">0.1552</p>
</td>
<td valign="top" width="170">
<p align="center">0.863</p>
</td>
<td valign="top" width="170">
<p align="center">0.23</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">2</p>
</td>
<td valign="top" width="140">
<p align="center">500</p>
</td>
<td valign="top" width="170">
<p align="center">300</p>
</td>
<td valign="top" width="170">
<p align="center">0.2</p>
</td>
<td valign="top" width="170">
<p align="center">0.25</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">0.006</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">3</p>
</td>
<td valign="top" width="140">
<p align="center">2000</p>
</td>
<td valign="top" width="170">
<p align="center">900</p>
</td>
<td valign="top" width="170">
<p align="center">0.4</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">0.108</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">4</p>
</td>
<td valign="top" width="140">
<p align="center">5000</p>
</td>
<td valign="top" width="170">
<p align="center">2000</p>
</td>
<td valign="top" width="170">
<p align="center">0.2</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">8.66Е-21</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">5</p>
</td>
<td valign="top" width="140">
<p align="center">500000</p>
</td>
<td valign="top" width="170">
<p align="center">20000</p>
</td>
<td valign="top" width="170">
<p align="center">0.3</p>
</td>
<td valign="top" width="170">
<p align="center">0.2</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1.45Е-15</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">7.28Е-16</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">6</p>
</td>
<td valign="top" width="140">
<p align="center">90000</p>
</td>
<td valign="top" width="170">
<p align="center">2000</p>
</td>
<td valign="top" width="170">
<p align="center">0.05</p>
</td>
<td valign="top" width="170">
<p align="center">0.35</p>
</td>
<td valign="top" width="170">
<p align="center">0.00022</p>
</td>
<td valign="top" width="170">
<p align="center">0.00122</p>
</td>
<td valign="top" width="170">
<p align="center">0.00021</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">0.00063</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: left;">Таблица 4. Результаты работы нейронной сети для логического оператора &#8220;Исключающее ИЛИ&#8221;</p>
<table width="1537" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="41">
<p align="center"><strong>№</strong></p>
</td>
<td valign="top" width="140">
<p align="center"><strong>Число поколений</strong></p>
</td>
<td valign="top" width="169">
<p align="center"><strong>Размер популяции</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Вероятность мутации</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Процент скрещивания</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № 1</strong></p>
<p align="center"><strong>(</strong><strong>0 or 0 = 0)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № 2</strong><strong></strong></p>
<p align="center"><strong>(</strong><strong>1 or 0 = </strong><strong>1</strong><strong>)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № </strong><strong>3</strong></p>
<p align="center"><strong>(</strong><strong>0 or 1 = </strong><strong>1</strong><strong>)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Значение № </strong><strong>4</strong></p>
<p align="center"><strong>(</strong><strong>1 or 1 = </strong><strong>0</strong><strong>)</strong></p>
</td>
<td valign="top" width="170">
<p align="center"><strong>Средняя ошибка</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">1</p>
</td>
<td valign="top" width="140">
<p align="center">150</p>
</td>
<td valign="top" width="169">
<p align="center">100</p>
</td>
<td valign="top" width="170">
<p align="center">0.1</p>
</td>
<td valign="top" width="170">
<p align="center">0.2</p>
</td>
<td valign="top" width="170">
<p align="center">8.66Е-08</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">0.5</p>
</td>
<td valign="top" width="170">
<p align="center">0.433</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">2</p>
</td>
<td valign="top" width="140">
<p align="center">500</p>
</td>
<td valign="top" width="169">
<p align="center">300</p>
</td>
<td valign="top" width="170">
<p align="center">0.3</p>
</td>
<td valign="top" width="170">
<p align="center">0.35</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">7.07Е-21</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">3</p>
</td>
<td valign="top" width="140">
<p align="center">1200</p>
</td>
<td valign="top" width="169">
<p align="center">500</p>
</td>
<td valign="top" width="170">
<p align="center">0.009</p>
</td>
<td valign="top" width="170">
<p align="center">0.6</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">7.07Е-21</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">4</p>
</td>
<td valign="top" width="140">
<p align="center">100000</p>
</td>
<td valign="top" width="169">
<p align="center">10000</p>
</td>
<td valign="top" width="170">
<p align="center">0.122</p>
</td>
<td valign="top" width="170">
<p align="center">0.37</p>
</td>
<td valign="top" width="170">
<p align="center">2.677Е-06</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">2.24Е-06</p>
</td>
<td valign="top" width="170">
<p align="center">1.748Е-06</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">5</p>
</td>
<td valign="top" width="140">
<p align="center">500000</p>
</td>
<td valign="top" width="169">
<p align="center">40000</p>
</td>
<td valign="top" width="170">
<p align="center">0.1</p>
</td>
<td valign="top" width="170">
<p align="center">0.9</p>
</td>
<td valign="top" width="170">
<p align="center">1.746Е-09</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">1.481Е-16</p>
</td>
<td valign="top" width="170">
<p align="center">7.1316Е-06</p>
</td>
</tr>
<tr>
<td valign="top" width="41">
<p align="center">6</p>
</td>
<td valign="top" width="140">
<p align="center">48909</p>
</td>
<td valign="top" width="169">
<p align="center">400</p>
</td>
<td valign="top" width="170">
<p align="center">0.39</p>
</td>
<td valign="top" width="170">
<p align="center">0.7</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">0.99</p>
</td>
<td valign="top" width="170">
<p align="center">1</p>
</td>
<td valign="top" width="170">
<p align="center">1Е-20</p>
</td>
<td valign="top" width="170">
<p align="center">1.53Е-11</p>
</td>
</tr>
</tbody>
</table>
<p>Из таблиц видно, что результаты нейронной сети, обученной при помощи генетического алгоритма, зависят от выбранных параметров. Чем больше поколений, и чем меньше вероятность мутации, тем точнее результаты, то есть ближе к идеальным значениям. Соответственно, ошибка вычислений меньше. Процент скрещиваемых особей популяции также влияет на результаты. Чем он больше, тем выше точность. Однако,  в некоторых случаях необязательно задавать большую длительность эволюции для получения наиболее точных результатов. Как показали эксперименты, увеличив процент скрещивания и вероятность мутации, можно получить близкие к идеальным результатам.</p>
<p>Благодаря вещественному кодированию упростился процесс кодирования, так не нужно было реализовывать операции кодирования/декодирования, используемые в целочисленном кодировании, а также увеличилась точность найденного решения, что видно из проведенных экспериментов. На точность также повлиял выбор типа функции активации. Благодаря сигмоиду были усилены слабые сигналы и ослаблены сильные сигналы.</p>
]]></content:encoded>
			<wfw:commentRss>https://technology.snauka.ru/2015/11/8179/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Нахождение максимума функции с помощью генетического алгоритма</title>
		<link>https://technology.snauka.ru/2015/11/8187</link>
		<comments>https://technology.snauka.ru/2015/11/8187#comments</comments>
		<pubDate>Thu, 12 Nov 2015 13:48:22 +0000</pubDate>
		<dc:creator>Щукова Кристина Борисовна</dc:creator>
				<category><![CDATA[Общая рубрика]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[генетический алгоритм]]></category>
		<category><![CDATA[задача оптимизации]]></category>
		<category><![CDATA[максимум функции]]></category>

		<guid isPermaLink="false">https://technology.snauka.ru/?p=8187</guid>
		<description><![CDATA[На сегодняшний день задачи оптимизации возникают в различных областях знаний. В частности, в математического анализе, существует важная задача нахождения максимума функции. Решения такой задачи методами математического анализа не всегда могут дать точные результаты [1]. В данной статье предлагается использовать генетический алгоритм для решения одной из задач оптимизации. Эффективным инструментом для разработки генетического алгоритма является C#. [...]]]></description>
			<content:encoded><![CDATA[<p>На сегодняшний день задачи оптимизации возникают в различных областях знаний. В частности, в математического анализе, существует важная задача нахождения максимума функции.</p>
<p>Решения такой задачи методами математического анализа не всегда могут дать точные результаты [1]. В данной статье предлагается использовать генетический алгоритм для решения одной из задач оптимизации. Эффективным инструментом для разработки генетического алгоритма является C#.</p>
<p>Постановка задачи следующая: найти максимум любой функции от двух переменных, на заданном интервале, используя целочисленное (бинарное) кодирование. Например, найти максимум функции f (x,y) = sin (2*PI*x) + cos (2*PI*y) + 18 на интервале [-2, 2] по x и y.</p>
<p>Поставленная задача была решена посредством метода генетического алгоритма.</p>
<p>Генетический алгоритм включает в себя следующие шаги:</p>
<p>1. формирование начальной популяции.</p>
<p>2. оценивание популяции.</p>
<p>3. селекция.</p>
<p>4. скрещивание.</p>
<p>5. мутация [2].</p>
<p>На рисунке 1 приведена структурная схема генетического алгоритма.</p>
<p style="text-align: center;"><a href="https://technology.snauka.ru/2015/11/8187/attachment/99999" rel="attachment wp-att-8188"><img class="size-full wp-image-8188 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/99999.png" alt="" width="898" height="549" /></a>Рисунок 1. Схема генетического алгоритма</p>
<p>В качестве кодирования генотипов X и Y было выбрано целочисленное или бинарное кодирование. В качестве метода селекции был выбран рулеточный отбор наиболее приспособленных особей в популяции. В качестве метода скрещивания выбранных особей был использован одноточечный кроссинговер. Мутация особей была реализована посредством инверсии битов хромосом по всей длине, то есть многоточечный подход. Длительность эволюции в программе была определена посредством ограниченности числа поколений.</p>
<p>В качестве целевой функции может быть использована любая функция от двух переменных. Таким образом, в программе было задано два генотипа X и Y, то есть два параметра. Каждая хромосома представляет собой битовую строку, разрядность  которой  = 10. Для преобразования каждого генотипа к его фенотипу была использована формула:</p>
<p style="text-align: center;"><a href="https://technology.snauka.ru/2015/11/8187/attachment/9870" rel="attachment wp-att-8189"><img class="size-full wp-image-8189" src="https://technology.snauka.ru/wp-content/uploads/2015/11/9870.png" alt="" width="280" height="71" />  </a></p>
<p>Оценка особи происходит на основании вычисления приспособленности каждой особи на основании целевой функции. Если <em>f</em>(<strong>G</strong><em>i</em>) &gt; <em>f</em>(<strong>G</strong><em>j</em>), то <em>i</em>-я особь считается более приспособленной, чем <em>j</em>-я особь [3].</p>
<p>Основные параметры, которые задаются для генетического алгоритма:</p>
<p>1)    количество поколений;</p>
<p>2)    численность популяции;</p>
<p>3)    вероятность скрещивания;</p>
<p>4)    тип скрещивания – одноточечный кроссинговер;</p>
<p>5)    вероятность мутации;</p>
<p>6)    тип оператора мутации – побитовая инверсия хромосомы (битовая мутация).</p>
<p>Каждая особь в популяции описывается с помощью класса <em>Individ</em><em>ua</em><em>l</em>. Каждая особь имеет два генотипа по X и Y, фенотипа для X и Y, который вычисляется по формуле перехода, значения функции приспособленности для особи, вероятность попадания в родительский массив, границы попадания в родительский массив (левая и правая).</p>
<p>В качестве примера была использована  функция от двух переменных f (x,y) = sin (2*PI*x) + cos (2*PI*y) + 18 на интервале [-2, 2] по x и y.</p>
<p>На рисунке 1 приведены результаты работы генетического алгоритма, а также заданные параметры.</p>
<p><a href="https://technology.snauka.ru/2015/11/8187/attachment/0000000000000000000000000" rel="attachment wp-att-8190"><img class="size-full wp-image-8190 aligncenter" src="https://technology.snauka.ru/wp-content/uploads/2015/11/0000000000000000000000000.png" alt="" width="892" height="562" /></a></p>
<p style="text-align: center;">Рисунок 1. Результаты работы генетического оператора</p>
<p>Если использовать классические метода математического анализа, то при вычислении максимума функции значение будет равно 20. Однако, используя генетический алгоритм может получить более точное значение. В данном случае при 100 поколениях получено значение = 20.57. Разница 0.57 может показаться незначительной. Но при решении задач оптимизации эта разница играет важную роль.</p>
]]></content:encoded>
			<wfw:commentRss>https://technology.snauka.ru/2015/11/8187/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
