
- •Министерство образования и науки Российской Федерации
- •Цель лекции
- •План лекции
- •1 Происхождение вычислительных машин
- •2 Изучение алгоритмов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Биты и их хранение
- •2 Оперативная память
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Устройства внешней памяти
- •3 Хранение и поиск файлов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление числовых значений
- •2 Хранение целых чисел
- •3 Хранение дробей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Представление текста
- •2 Представление изображений
- •Достоинства пиксельной графики
- •Недостатки пиксельной графики
- •Достоинства векторной графики
- •Недостатки векторной графики
- •3 Представление звука
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Сжатие изображений
- •2 Ошибки передачи данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Архитектура эвм
- •2 Связь процессора с другими устройствами
- •3 Другие архитектуры
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Машинный язык
- •2 Пример машинного языка
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Выполнение программы
- •2 Пример выполнения программы
- •3 Программы и данные
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Логические операции
- •2 Операции сдвига
- •3 Арифметические операции
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция операционных систем
- •2 Архитектура операционных систем
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие процесса
- •2 Управление процессами
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Классификация сетей
- •2 Сетевые протоколы*
- •3 Безопасность сетей
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Понятие алгоритма
- •2 Представление алгоритма
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Теория решения задач
- •2 Общие методы решения задач
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритм последовательного поиска
- •2 Управление циклами
- •3 Алгоритм сортировки методом вставки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Алгоритмы поиска и сортировки
- •2 Управление рекурсией
- •3 Разработка рекурсивных процедур
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эффективность алгоритмов
- •2 Верификация программ
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Эволюция и классификация языков программирования
- •2 Концепции традиционного программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Процедурные единицы
- •2 Реализация языка программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Объектно-ориентированное программирование
- •2 Декларативное программирование
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структуры данных
- •Integer Scores (2.9).
- •2 Статические и динамические структуры
- •3 Указатели
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Массивы
- •2 Списки
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Структура и функции стека
- •2 Реализация стека
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Очереди
- •2 Деревья
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Пользовательские типы данных
- •Int Age;
- •2 Классы
- •Int *StackEntries;
- •3 Стандартная библиотека шаблонов
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Роль операционной системы
- •2 Последовательные файлы
- •3 Вопросы программирования
- •0000000010000110
- •001100010011001100110100
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения индексации
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Основные положения хеширования
- •2 Вопросы программирования
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Общие вопросы
- •2 Система управления базой данных
- •3 Поддержка целостности баз данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Модели баз данных
- •2 Реляционная модель баз данных
- •3 Объектно-ориентированные базы данных
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Интеллект и машины
- •2 Распознавание образов
- •3 Мышление
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Искусственные нейронные сети
- •2 Генетические алгоритмы
- •Контрольные вопросы
- •Невычислимые функции Цель лекции
- •План лекции
- •1 Основы машины Тьюринга
- •2 Невычислимая функция
- •3 Сложность задач
- •Листинг 1. Процедура MergeLists для объединения двух упорядоченных списков
- •Листинг 2. Алгоритм сортировки слиянием, реализованный в процедуре MergeSort
- •Контрольные вопросы
- •Цель лекции
- •План лекции
- •1 Шифрование с открытым ключом
- •2 Модульная арифметика
- •Контрольные вопросы
- •Литература
- •Internet-ресурсы
2 Генетические алгоритмы
Исследование генетических алгоритмов (genetic algorithms) заключается в попытках применения нашего понимания естественной эволюции к решению задач. Этот подход подразумевает соединение лучших представителей из набора предложенных решений для получения решений следующего поколения, обладающих преимуществами по сравнению с исходным набором. Повторяя этот процесс снова и снова, можно имитировать процесс эволюции и в итоге получить подходящие решения актуальной проблемы.
В качестве примера предположим, что вы играете в покер с одними и теми же друзьями каждую среду и хотите разработать стратегию увеличения ваших шансов на выигрыш. Эволюционный подход к этой задаче начинается с выявления различных ситуаций, которые могут произойти во время игры в покер, и потенциальных ответов на каждую из них. Это, конечно же, самая объемная часть решения, так как рассмотреть придется множество ситуаций. После завершения анализа мы можем сконструировать стратегию игры в покер, задав определенную реакцию на каждую ситуацию. Любую стратегию можно представить в виде списка в форме S1R1, S2R2, -, SnRn, где буквой S обозначаются потенциальные ситуации, a R — это ответ на данную ситуацию. Представления различных стратегий состоят из одинаковых последовательностей ситуаций, но за этими ситуациями следуют разные реакции. Чтобы применить определенную стратегию, необходимо просто найти подходящую ситуацию в списке и воспроизвести соответствующий ей ответ.
Следующий шаг в нашей задаче — это выбор исходного набора стратегий и применение их во время игры в покер, причем необходимо регистрировать выигрыши, полученные при применении каждой стратегии. Основываясь на этом анализе, мы затем выберем наилучшие из исходных стратегий и сгруппируем выбранные стратегии попарно. Из каждой такой пары мы создадим две новые стратегии; для этого разделим списки, соответствующие двум стратегиям, на две части и присоединим начало одного списка к концу другого (рис. 12). Получившийся набор новых стратегий проверим на следующей неделе. Так, каждую неделю мы будем снова выбирать наилучшие стратегии и из них создавать новое поколение стратегий для проверки на очередной неделе. Таким образом, с ходом времени наш процесс будет имитировать естественный эволюционный процесс, в котором выжившие представители каждого поколения порождают следующее поколение. В действительности мы можем даже имитировать мутации, случайным образом изменяя по одному ответу в каждой стратегии за один раз.
Рисунок 12 – Перекрестное соединение двух стратегий игры в покер: а – две стратегии разделяются в одинаковых местах; б – начало одной стратегии присоединяется к концу другой, создавая таким образом две новые стратегии
К сожалению, наш пример с покером не слишком реалистичен, так как проверить большой набор стратегий за один вечер невозможно. Однако если автоматизировать процесс игры, как это можно сделать со многими другими приложениями, эволюционный подход вполне применим. Например, этот процесс предлагается для исследований генетических алгоритмов. Сначала ищется способ представления возможных решений в виде строк символов. Затем создается и проверяется набор потенциальных решений. Наилучшие экземпляры из этого набора скрещиваются для формирования нового поколения возможных решений, которые, в свою очередь, также проверяются и формируют следующее поколение. Во время процесса скрещивания иногда можно применять случайные мутации.
Эволюционный подход применяется во многих областях с весьма обнадеживающими результатами. Например, проектирование конфигураций искусственных нейронных сетей. Предположим, что мы хотим решить какую-либо задачу при помощи искусственной нейронной сети, состоящей из предопределенного количества блоков обработки данных. Перед тем как мы начнем обучать сеть, необходимо решить, каким образом будут соединены блоки. Пусть конфигурации искусственной нейронной сети обозначаются строками, состоящими из нулей и единиц, расположенных в соответствии с определенной системой. Предполагая, что в системе будет пять блоков обработки данных, пометим их цифрами от 1 до 5 (рис. 13, а). Затем построим квадратную таблицу из пяти строк и пяти столбцов (рис. 13, 6). На пересечении i-й строки и j-ro столбца мы помещаем единицу, если в нашей сети выход i-ro блока соединен с входом j-гo блока обработки данных. Во все остальные ячейки таблицы мы помещаем 0. Затем последовательно записываем строки таблицы в одну большую строку (рис. 13, в).
Рисунок 13 – Кодировка топологии искусственной нейронной сети: а – конфигурация искусственной нейронной сети; б – таблица с указанием связей между блоками в сети; в – закодированная версия искусственной нейронной сети
Теперь, чтобы найти подходящую конфигурацию для нашей проблемы, выберем какой-либо набор конфигураций и запустим процесс тестирования для каждой из них. После небольшого периода проверки выберем те конфигурации, которые показали себя лучше всего, представим их в виде строк из нулей и единиц и скрестим для получения нового поколения потенциальных конфигураций. В свою очередь, после частичного тестирования этого нового поколения, его лучшие представители также будут выбраны для создания следующего поколения.
Такой подход успешно применяется в разработке простых искусственных нейронных сетей.
Техника генетических алгоритмов также применяется при проектировании программ; эта область называется эволюционным программированием (evolutionary programming). Цель лекции исследований — научиться создавать программы, позволяя им самостоятельно эволюционировать, а не просто писать их. Важный шаг в этом исследовании — поиск путей взаимодействия частей программ и создания новых осмысленных программ. Парадигму функционального программирования составляют вложенные функции, где выход одной функции используется как вход для другой. Таким образом, можно поменять местами функции из двух программ, не разрушая структуру этих программ.
Следуя такой логике, исследователи применили техники эволюционного программирования к процессу разработки программ на языках функционального программирования. Для этого необходим набор программ, содержащих большое количество различных функций. Функции этого начального набора формируют «генофонд», из которого конструируются будущие поколения программ. Затем эволюционный процесс запускается и выполняется на многих поколениях в надежде, что каждое следующее поколение создается лучшими представителями предыдущего, и в конечном итоге ход эволюции приведет к появлению решения исходной проблемы.
Область исследования эволюционного программирования находится еще в зачаточном состоянии. Успех достигнут только для простейших случаев. Например, эволюционные техники применялись для создания программ, рассчитывающих свойства простых геометрических фигур, например площади квадрата или длины окружности. Основная проблема заключается в выявлении среди группы программ, ни одна из которых не кажется близкой к желаемому результату, «наилучших представителей». Такая же ситуация и в других областях генетических алгоритмов; смогут ли рассматриваемые техники развиться настолько, чтобы суметь решить важные, значительные проблемы? В любом случае, генетические алгоритмы ярко иллюстрируют, с каким творчеством и воображением подходят к исследованиям информационных технологий сегодняшние ученые.