204
Министерство образования и науки Российской Федерации Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики На правах рукописи Буздалов Максим Викторович Генерация тестов для определения неэффективных решений олимпиадных задач по программированию с использованием эволюционных алгоритмов Специальность 05.13.11 — Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей Диссертация на соискание ученой степени кандидата технических наук Научный руководитель: докт. техн. наук, профессор Шалыто А. А. Санкт-Петербург — 2014

Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

Министерство образования и науки Российской Федерации

Санкт-Петербургский национальный исследовательский университет

информационных технологий, механики и оптики

На правах рукописи

Буздалов Максим Викторович

Генерация тестов для определения неэффективных

решений олимпиадных задач по программированию

с использованием эволюционных алгоритмов

Специальность 05.13.11 — Математическое и программное обеспечение

вычислительных машин, комплексов и компьютерных сетей

Диссертация на соискание ученой степени

кандидата технических наук

Научный руководитель:

докт. техн. наук, профессор

Шалыто А. А.

Санкт-Петербург — 2014

Page 2: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

2

СОДЕРЖАНИЕ

Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1. Олимпиады по программированию, эволюционные алгоритмы и поис-

ковая инженерия программного обеспечения . . . . . . . . . . . . . . . . . . . . . . . . . . 18

1.1. Олимпиады по программированию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

1.1.1. Термины и обозначения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

1.1.2. Руководство по подготовке задач для Google Code Jam . . . . 22

1.1.3. Особенности архивов задач с проверяющей системой . . . . . . 27

1.1.4. Практика генерации тестов для олимпиадных задач по

программированию. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

1.1.5. Вычислительная сложность задачи генерации тестов. . . . . . 28

1.2. Эволюционные алгоритмы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

1.2.1. Термины и обозначения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

1.2.2. (1 + 1)-эволюционный алгоритм. . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

1.2.3. Генетические алгоритмы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

1.2.4. «Классический» генетический алгоритм . . . . . . . . . . . . . . . . . . . 38

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

1.2.6. Эволюционные стратегии. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

1.3. Поисковая инженерия программного обеспечения . . . . . . . . . . . . . . . . 43

1.3.1. Обзор избранных работ по поисковому тестированию про-

граммного обеспечения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

1.3.2. Альтернативные подходы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

1.4. Задачи, решаемые в диссертационной работе . . . . . . . . . . . . . . . . . . . . . 51

Выводы по главе 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

2. Метод генерации тестов для алгоритмов решения NP-трудных задач

на основе генетического алгоритма (на примере задачи о рюкзаке) . . . 54

2.1. Задача о рюкзаке. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

2.2. Алгоритмы решения задачи о рюкзаке . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

2.2.1. Алгоритм SimpleBranch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Page 3: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

3

2.2.2. Алгоритм ExpKnap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

2.2.3. Алгоритм HardKnap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

2.3. Генерация случайных тестов для задачи о рюкзаке . . . . . . . . . . . . . . 60

2.4. Описание генетического алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

2.5. Экспериментальное исследование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

2.5.1. Постановка экспериментального исследования. . . . . . . . . . . . . 65

2.5.2. Результаты экспериментального исследования . . . . . . . . . . . . . 65

2.5.3. Анализ случайных тестов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

2.5.4. Сравнение генерации случайных тестов и генетического

алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

2.5.5. Сравнение частичных и полных решений . . . . . . . . . . . . . . . . . . 70

2.5.6. Анализ сложных тестов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Выводы по главе 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

3. Метод генерации тестов для алгоритмов решения графовых задач на

основе генетического алгоритма (на примере задачи о поиске макси-

мального потока) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

3.1. Задача о поиске максимального потока . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

3.2. Алгоритмы решения задачи о поиске максимального потока. . . . . 75

3.2.1. Алгоритм Форда-Фалкерсона с масштабированием пропуск-

ной способности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

3.2.2. Алгоритм Эдмондса-Карпа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

3.2.3. Алгоритм Эдмондса-Карпа с масштабированием пропуск-

ной способности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

3.2.4. Алгоритм Диница . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

3.2.5. Неоптимальная реализация алгоритма Диница . . . . . . . . . . . . 77

3.2.6. Улучшенный алгоритм поиска кратчайших дополняющих

путей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Page 4: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

4

3.3. Генераторы тестов для задачи о поиске максимального потока . . 78

3.3.1. Генерация случайных графов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

3.3.2. Генерация ациклических графов . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

3.3.3. Генератор транзитных решеток . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

3.3.4. Генератор случайных слоев . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

3.3.5. Генератор Черкасского и Гольдберга . . . . . . . . . . . . . . . . . . . . . . . 81

3.3.6. Генератор «washington» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

3.3.7. Тесты Заде. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

3.4. Описание разработанного генетического алгоритма . . . . . . . . . . . . . . 82

3.5. Экспериментальное исследование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

3.5.1. Выбор критерия для анализа результатов, наиболее точно

отражающего время работы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

3.5.2. Лучшие тесты и генераторы для каждого алгоритма поиска

максимального потока. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

3.5.3. Средняя эффективность генераторов тестов . . . . . . . . . . . . . . . 91

3.5.4. Другие наблюдения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Выводы по главе 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

4. Алгоритм выбора из нескольких функций приспособленности функ-

ции, оптимальной по времени решения задачи оптимизации . . . . . . . . . . 96

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

4.2. Общий вид и верхняя оценка времени работы алгоритма выбора

критериев оптимизации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

4.3. Алгоритм с экспоненциальной стратегией перезапуска и его верх-

няя оценка времени работы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

4.4. Пример входных данных, на которых верхняя оценка времени ра-

боты асимптотически достигается . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

4.5. Оптимальная экспоненциальная стратегия перезапуска . . . . . . . . . . 104

4.6. О необходимости перезапуска алгоритмов . . . . . . . . . . . . . . . . . . . . . . . . 105

Page 5: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

5

Выводы по главе 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

5. Технология генерации тестов для определения неэффективных реше-

ний олимпиадных задач по программированию на основе эволюцион-

ных алгоритмов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

5.1. Выбор неэффективного решения олимпиадной задачи для гене-

рации тестов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

5.2. Предварительный теоретический анализ задачи генерации тестов

для выбранного решения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

5.3. Построение представления теста для олимпиадной задачи в виде

особи эволюционного алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

5.4. Генерация случайных тестов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

5.5. Построение оптимизируемых функций . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

5.6. Построение оператора мутации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

5.7. Генерация тестов с помощью (1 + 1)-эволюционного алгоритма. . 122

5.8. Построение оператора скрещивания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

5.9. Генерация тестов с помощью генетического алгоритма. . . . . . . . . . . 125

5.10.Генерация тестов с помощью эволюционной стратегии . . . . . . . . . . . 126

5.11.Проверка имеющихся решений олимпиадной задачи на сгенери-

рованном тесте . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

5.12.Выбор подмножества сгенерированных тестов. . . . . . . . . . . . . . . . . . . . 128

Выводы по главе 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

6. Внедрение предложенной технологии при генерации тестов для задачи

«Ships. Version 2». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

6.1. Условие задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

6.2. Применение технологии генерации тестов в 2009 году. . . . . . . . . . . . 132

6.2.1. Решение 2 558 302 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

6.2.2. Решение 2 208 365 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

6.2.3. Решение 2 072 705 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Page 6: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

6

6.2.4. Решение 1 700 736 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

6.2.5. Выбор подмножества сгенерированных тестов . . . . . . . . . . . . . 152

6.3. Применение технологии генерации тестов в 2011 году. . . . . . . . . . . . 152

Выводы по главе 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

7. Внедрение предложенной технологии при генерации тестов для задачи

«Work for Robots» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

7.1. Условие задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

7.2. Авторское решение задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

7.3. Неэффективные решения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

7.4. Применение технологии генерации тестов . . . . . . . . . . . . . . . . . . . . . . . . 158

7.4.1. Решение с кешированием младших бит . . . . . . . . . . . . . . . . . . . . 159

7.4.2. Решение, использующее ассоциативный массив . . . . . . . . . . . . 162

7.4.3. Решение с использованием «большого массива» . . . . . . . . . . . 165

7.5. Выбор подмножества сгенерированных тестов. . . . . . . . . . . . . . . . . . . . 167

Выводы по главе 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

Список источников. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

Печатные издания на русском языке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

Печатные издания на английском языке. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

Печатные издания на немецком языке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

Ресурсы сети Интернет. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

Публикации автора по теме диссертации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Статьи в журналах из перечня ВАК. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Публикации в рецензируемых изданиях, индексируемых Web of Science

или Scopus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Другие публикации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

Приложение А. Некоторые решения задачи «Ships. Version 2». . . . . . . . . . . 193

А.1. Решение 2 558 302 (язык C++) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

Page 7: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

7

А.2. Решение 2 208 365 (язык Pascal). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

А.3. Решение 2 072 705 (язык C++) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

А.4. Решение 1 700 736 (язык C++) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

Page 8: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

8

ВВЕДЕНИЕ

Актуальность проблемы. В мире проводится большое число олим-

пиад и соревнований по программированию для школьников [129, 130], сту-

дентов [131—133] и всех желающих [134—138]. Олимпиады помогают выявить

школьников и студентов, одаренных в области информатики и программиро-

вания [7], а IT-компаниям, в свою очередь, сформировать перечень кандида-

тов, среди которых они смогут найти способных и талантливых сотрудников.

Существуют работы, посвященные олимпиадам и соревнованиям по про-

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

нований и для их тренеров [8, 9]. Методические аспекты олимпиад обсужда-

ются на некоторых конференциях, таких как, например, ISSEP (Informatics

in Schools: Situation, Evolution and Perspectives). Журнал Olympiads in

Informatics, публикуемый Институтом математики и информатики Вильнюс-

ского университета, всецело посвящен различным аспектам олимпиад по про-

граммированию. Однако, в литературе было найдено крайне мало публика-

ций на тему того, как следует готовить задачи для олимпиад по програм-

мированию [10]. Информация на эту тему может быть найдена в виде ме-

тодических рекомендаций на сайте олимпиад [139, 140] или разослана непо-

средственно будущим авторам задач, как это делают организаторы системы

соревнований TopCoder [134].

Решение олимпиадной задачи по программированию — это, как правило,

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

выводит ответ. При этом решение должно уложиться в ограничения на время

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

Тест для олимпиадной задачи по программированию — это входные дан-

ные для задачи. В большинстве случаев тест хранится в виде текстового

файла, удовлетворяющего определенному формату. Для одной задачи может

быть один или несколько тестов. Тесты составляются жюри до начала со-

Page 9: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

9

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

каждом тесте проверяется программой, написанной жюри.

В данной работе предполагается, что дано одно или несколько решений

рассматриваемой олимпиадной задачи по программированию, причем каж-

дое из них может реализовывать тот или иной алгоритм. Назовем коррект-

ным решение, которое на любом тесте способно найти и вывести правильный

ответ, а затем завершиться, уложившись в ограничения по времени и памя-

ти. Определим также решение, корректное по тестам, которое может быть

некорректным, но на всех тестах из имеющегося набора, как и корректное

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

Решение называется неэффективным, если существует хотя бы один тест, на

котором оно не укладывается в указанные ограничения (соответственно, лю-

бое корректное решение является эффективным). Можно также определить

неверное решение, которое хотя бы для одного теста генерирует неверный

ответ или некорректно завершается. В данной работе рассматривается по-

строение тестов только против неэффективных решений.

Будем считать, что тест A сложнее теста B для некоторого решения по

критерию времени работы, если это решение работает на тесте A дольше,

чем на тесте B. Аналогично, тест A сложнее теста B для некоторого ре-

шения по критерию используемой памяти, если это решение использует на

тесте A больше памяти, чем на тесте B. Назовем набор тестов слабым, если

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

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

бора, но при этом существуют тесты, удовлетворяющие условию задачи, на

которых указанные решения не работают.

Иметь слабый набор тестов для олимпиадной задачи по программиро-

ванию крайне нежелательно. Действительно, участники олимпиад не знают,

какое решение жюри считает корректным и какие тесты присутствуют в те-

стовом наборе. Например, некорректно указывать в условии, что некоторое

Page 10: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

10

число N не превосходит 10000, а генерировать только такие тесты, в которых

N 6 1000. Это даст меньше шансов опытным участникам, так как они по-

тратят лишнее время на реализацию эффективного решения, и даст преиму-

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

решения, возможно, неэффективные.

Одной из важнейших проблем при разработке олимпиадных задач по

программированию является генерация тестов, на которых неэффективные

решения превышали бы ограничения на время и память. Проблемы, подоб-

ные указанной, успешно решаются для определенных классов программ с ис-

пользованием методов поисковой инженерии программного обеспечения [11],

в частности, различных метаэвристик [1], включая эволюционные алгорит-

мы [12—14]. Однако, существующие методы, основанные на таких алгорит-

мах, имеют следующие недостатки:

— большинство методов [15—24] направлены на максимизацию покрытия

кода тестами, а не на максимизацию времени работы кода;

— методы генерации тестов, направленные на максимизацию времени ра-

боты кода [25—34], разработаны для встраиваемых систем;

— методы, основанные на переборе возможных путей выполнения [35, 36],

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

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

Поэтому проблема генерации тестов для определения неэффективных реше-

ний олимпиадных задач по программированию с использованием эволюци-

онных алгоритмов является актуальной.

Целью работы является разработка методов и технологии генерации

тестов для определения неэффективных решений олимпиадных задач по про-

граммированию с использованием эволюционных алгоритмов.

Основные задачи диссертационной работы состоят в следующем:

1. Показать целесообразность применения эволюционных алгоритмов для

генерации тестов, определяющих неэффективные решения олимпиад-

Page 11: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

11

ных задач по программированию, на примере задач дискретной матема-

тики, алгоритмы решения которых могут работать существенно быст-

рее, чем ожидается согласно верхней оценке на время работы.

2. Разработать алгоритм выбора из нескольких функций приспособленно-

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

3. Разработать и внедрить технологию генерации тестов на основе эволю-

ционных алгоритмов для определения неэффективных решений олим-

пиадных задач по программированию на примере задач дискретной ма-

тематики указанного класса.

Научная новизна. В работе получены следующие новые научные ре-

зультаты, которые выносятся на защиту:

1. Метод генерации тестов для алгоритмов решения NP-трудных задач на

основе генетического алгоритма (на примере задачи о рюкзаке). По-

казано, что разработанный метод с большим уровнем статистической

значимости генерирует более сложные тесты, чем наилучшие методы

случайной генерации тестов из известных на сегодняшний день.

2. Метод генерации тестов для алгоритмов решения графовых задач на

основе генетического алгоритма (на примере задачи о поиске макси-

мального потока). Показано, что разработанный метод генерирует более

сложные тесты, чем метод случайной генерации тестов, а также боль-

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

Для некоторых алгоритмов, например для алгоритма Диница, тесты,

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

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

3. Алгоритм выбора из нескольких функций приспособленности функции,

оптимальной по времени решения задачи оптимизации. Показано, что

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

итерации эволюционного алгоритма, а также организует его перезапуск,

таким образом, что математическое ожидание числа итераций эволю-

Page 12: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

12

ционного алгоритма, необходимых для решения задачи оптимизации,

меньше, чем 4K · minG TG, где K — число функций приспособленно-

сти, а TG — математическое ожидание числа итераций эволюционного

алгоритма при использовании функции приспособленности G.

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

математики, эволюционных вычислений, теории вероятностей и математиче-

ской статистики.

Достоверность научных положений, выводов и практических рекомен-

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

ем постановок задач, точной формулировкой критериев, результатами экс-

периментов по использованию предложенных в диссертации методов и их

статистическим анализом.

Практическое значение работы состоит в том, что предложена тех-

нология, позволяющая генерировать тесты для определения неэффективных

решений олимпиадных задач по программированию рассмотренных классов

в процессе разработки или доработки этих задач. Технология уменьшает вли-

яние человеческого фактора на качество набора тестов в силу того, что чи-

сто эвристический подход к построению тестов заменен использованием стан-

дартной схемы, характерной для решения задач с помощью эволюционных

алгоритмов.

Внедрение результатов работы. Дополнительные тесты, полученные

с помощью методов, предложенных в диссертации, были внедрены в архив за-

дач с проверяющей системой Timus Online Judge (функционирующий на ба-

зе Уральского федерального университета имени первого президента России

Б. Н. Ельцина, г. Екатеринбург), используемый для подготовки к олимпиа-

дам по программированию (задачи «Ships. Version 2» и «Work for Robots»).

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

ры «Компьютерные технологии» Университета ИТМО при руководстве ше-

стью бакалаврскими работами и одной магистерской диссертацией.

Page 13: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

13

Апробация результатов работы. Основные результаты работы до-

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

— Третья Всероссийская конференция «Нечеткие системы и мягкие вы-

числения» (2009, Волгоград);

— Всероссийская научная конференция по проблемам информатики СПИ-

СОК (2011, 2012, 2013, 2014, Матмех СПбГУ);

— Genetic and Evolutionary Computation Conference (2011, Дублин, 2013,

Амстердам);

— International Conference on Machine Learning and Applications (2012,

Бока-Ратон, США, 2013, Майами, 2014, Детройт);

— IEEE Congress on Evolutionary Computation (2013, Канкун, Мексика);

— International Symposium on Search-Based Software Engineering (2013,

Санкт-Петербург);

— International Conference on Soft Computing MENDEL (2014, Брно, Че-

хия);

— International Conference on Bio-Inspired Computing: Theories and

Applications (2014, Вухан, Китай).

Личный вклад автора. Решение задач диссертации, разработанные

методы, алгоритмы, технология и их реализация принадлежат лично автору.

Публикации. Основные результаты по теме диссертации изложены в 17

публикациях [152—168], две из которых изданы в журналах, рекомендован-

ных ВАК [152, 153], девять — в изданиях, индексируемых в международных

базах цитирования Web of Science [156, 160] и Scopus [154, 155, 157—159, 161,

162]. В работах, выполненных в соавторстве, авторство принадлежит соавто-

рам в равных долях.

Свидетельства о регистрации программы для ЭВМ. Автором по

теме диссертации получено три свидетельства о регистрации программы для

ЭВМ:

Page 14: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

14

1. № 2012610893 от 20 января 2012 года «Программное средство генерации

тестовых данных для задачи о поиске максимального потока с исполь-

зованием генетических алгоритмов», автор Буздалов М.В.;

2. № 2012619019 от 05 октября 2012 года «Программное средство исследо-

вания эволюционных алгоритмов для генерации покрывающего набора

тестов», автор Буздалов М.В.;

3. № 2013610657 от 09 января 2013 года «Программное средство для ис-

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

сти», авторы Буздалов М.В., Буздалова А.С.

Участие в научно-исследовательских работах. Результаты дис-

сертации были использованы при выполнении под руководством автора

научно-исследовательской работы «Разработка методов автоматической ге-

нерации тестов на основе эволюционных алгоритмов» по Государственному

контракту № 14.740.11.1430, 2011–2012 гг. Автор работы являлся победите-

лем конкурса грантов Санкт-Петербурга для студентов, аспирантов, молодых

ученых, молодых кандидатов наук 2011 г., тема проекта — «Генерация тестов

для олимпиадных задач по теории графов с использованием эволюционных

алгоритмов».

Объем и структура работы. Диссертация состоит из введения, се-

ми глав, заключения и одного приложения. Объем диссертации составляет

204 страницы с девятью рисунками, 13 таблицами и пятью листингами. Спи-

сок литературы содержит 168 наименований.

В первой главе приводится обзор работ, посвященных олимпиадам по

программированию, эволюционным алгоритмам, поисковой инженерии про-

граммного обеспечения. На основе результатов обзора формулируются зада-

чи, решаемые в диссертации.

Во второй главе для NP-трудных задач на примере задачи о рюкзаке

показывается целесообразность применения эволюционных алгоритмов для

генерации тестов, определяющих неэффективные решения олимпиадных за-

Page 15: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

15

дач по программированию. Задача о рюкзаке выбрана, так как она известна

как «самая простая NP-трудная задача» [37] — многие решения этой задачи

быстро работают на случайных тестах.

Рассматривается пять известных алгоритмов решения этой задачи, об-

ладающих различной эффективностью. Предложен генетический алгоритм,

позволяющий генерировать сложные тесты для таких алгоритмов. Приводят-

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

алгоритм с известными методами генерации тестов, которые показывают, что

генетический алгоритм генерирует более сложные тесты, в отдельных случа-

ях — до 10 раз. При анализе тестов, сгенерированных генетическим алгорит-

мом, обнаружен новый класс тестов, сложных для переборных решений —

тесты с двумя типами предметов.

В третьей главе для графовых задач на примере задачи о поиске макси-

мального потока показывается целесообразность применения эволюционных

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

олимпиадных задач по программированию. Задача о поиске максимального

потока выбрана ввиду того, что она обладает следующим свойством: тесты,

сгенерированные случайным образом, редко бывают сложными, а оценки на

время работы алгоритмов решений этой задачи могут существенно переоце-

нивать их время работы.

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

максимального потока [38—42]. Предложен генетический алгоритм, позволя-

ющий генерировать сложные тесты для указанных алгоритмов. Он сравни-

вается с семью известными генераторами тестов для алгоритмов решения

задачи о максимальном потоке. По результатам экспериментальных иссле-

дований было установлено, что генерация тестов для различных алгоритмов

поиска максимального потока наиболее эффективна при применении одной и

той же конфигурации генетического алгоритма. Для некоторых алгоритмов,

Page 16: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

16

таких как алгоритм Диница [40], генетический алгоритм генерирует пример-

но в четыре раза более сложные тесты, чем остальные методы.

В четвертой главе описывается разработанный автором алгоритм вы-

бора оптимальной функции приспособленности, который назван SaRA (от

англ. Switch-and-Restart Algorithm). Данный алгоритм направлен на решение

проблемы выбора такой функции приспособленности из нескольких функций,

которая приводит к нахождению хорошего теста за минимальное ожидаемое

число итераций алгоритма оптимизации.

Пусть дана задача оптимизации, эволюционный алгоритм и K функ-

ций приспособленности, такие что математическое ожидание числа итера-

ций эволюционного алгоритма, необходимых для решения указанной задачи

оптимизации при использовании функции приспособленности G, составля-

ет TG. Разработанный алгоритм выбирает функцию приспособленности на

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

этого алгоритма таким образом, что общее число итераций эволюционного

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

меньше 4K ·minG TG. При этом требуемый объем памяти равен соответству-

ющей величине для используемого эволюционного алгоритма с добавлением

лишь небольшой константы, что существенно меньше, чем при использовании

параллельного запуска K эволюционных алгоритмов.

В пятой главе описывается технология генерации тестов для определе-

ния неэффективных решений олимпиадных задач по программированию на

основе эволюционных алгоритмов. Предложенная технология состоит из 12

этапов. Она уменьшает влияние человеческого фактора на качество набора

тестов в силу того, что чисто эвристический подход к построению тестов за-

менен использованием стандартной схемы, характерной для решения задач с

помощью эволюционных алгоритмов.

В шестой главе описывается внедрение предложенной технологии при

генерации тестов для задачи «Ships. Version 2» [141], расположенной в ар-

Page 17: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

17

хиве задач с проверяющей системой Timus Online Judge [142], предназна-

ченном для подготовки к олимпиадам по программированию. Данная задача

является частным случаем задачи о мультирюкзаке, в котором сумма весов

всех предметов равна сумме вместимостей всех рюкзаков. Указанный част-

ный случай является NP-трудной задачей, что в совокупности с ограничени-

ями, указанными в условии задачи, делают ее крайне трудной для решения.

Однако в 2009 году по данной задаче на основании имевшихся на тот момент

тестов 260 решений были признаны корректными по тестам. Применение тех-

нологии позволило признать все указанные решения неэффективными.

В седьмой главе описывается внедрение предложенной технологии при

генерации тестов для задачи «Work for Robots» [143], расположенной в том

же архиве задач, что и предыдущая задача. Данная задача состоит в подсчете

числа клик в графе, и потому является #P-полной, но в отличие от преды-

дущей задачи, у нее имеется корректное решение, основанное на динамиче-

ском программировании по подмножествам и идее «разделяй-и-властвуй».

По состоянию на 2009 год администрацией сайта 86 решений было призна-

но корректными по тестам. Однако кроме указанного корректного решения

среди них было множество решений, основанных, главным образом, на идее

перебора с возвратом. В результате применения технологии 45 из 86 решений

были признаны неэффективными на новых тестах, которые были добавлены

в архив.

В заключении сформулированы результаты, полученные в диссерта-

ции.

Page 18: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

18

ГЛАВА 1. ОЛИМПИАДЫ ПО ПРОГРАММИРОВАНИЮ,

ЭВОЛЮЦИОННЫЕ АЛГОРИТМЫ И ПОИСКОВАЯ

ИНЖЕНЕРИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

В данной главе приводятся основные сведения об олимпиадах по про-

граммированию (раздел 1.1), в частности, о подготовке задач для олимпиад

по программированию, об эволюционных алгоритмах (раздел 1.2), о поиско-

вой инженерии программного обеспечения (раздел 1.3). В завершение главы

(раздел 1.4) представлены и обоснованы задачи, решаемые в диссертацион-

ной работе.

1.1. Олимпиады по программированию

В мире проводится большое число олимпиад и соревнований по про-

граммированию для студентов [131, 132], для школьников [129, 130] и для

всех желающих [133—138, 144]. Олимпиады помогают выявить школьников

и студентов, одаренных в области информатики и программирования [7], а

IT-компаниям, в свою очередь, сформировать перечень кандидатов, среди

которых они смогут найти способных и талантливых сотрудников.

На указанных олимпиадах участникам предлагается решить одну или

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

на одном из широко используемых языков программирования — например,

на финале чемпионата мира по программированию разрешено использование

языков C, C++ и Java [131], однако в некоторых соревнованиях требуется

выслать лишь ответы, выдаваемые такой программой, на определенных те-

стовых данных [136], в некоторых случаях требуется также приложить саму

программу [135].

Также распространены интернет-сервисы, предлагающие решать зада-

чи с олимпиад по программированию в любое удобное время [137, 138, 142,

145—147], в том числе и в режиме эмуляции соревнования с виртуальным при-

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

Page 19: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

19

определенного соревнования, при этом он может наблюдать положение ре-

альных участников этого соревнования в тот момент, который соответствует

времени, пройденному с начала «виртуального» соревнования.

Существуют работы, посвященные олимпиадам и соревнованиям по про-

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

нований и для их тренеров [8, 9]. Методические аспекты олимпиад обсужда-

ются на некоторых конференциях, таких как ISSEP (Informatics in Schools:

Situation, Evolution and Perspectives). Журнал Olympiads in Informatics, пуб-

ликуемый Институтом математики и информатики Вильнюсского универси-

тета, всецело посвящен различным аспектам олимпиад по программирова-

нию. В работе С. Оршанского [2], чемпиона мира по программированию 2004

года, с точки зрения участника описано, как решаются олимпиадные задачи,

а в статье И. Акишева [3], золотого медалиста чемпионата мира по програм-

мированию 2006 года, описан подход к эффективной командной работе на

олимпиаде.

Однако, в литературе было найдено крайне мало публикаций на тему

того, как следует подготавливать задачи для олимпиад по программирова-

нию [10]. Информация на эту тему может быть найдена в виде методических

рекомендаций на сайтах олимпиад [139, 140] или разослана будущим авторам

задач, как это делают организаторы системы соревнований TopCoder [134].

Наиболее старая публикация такого вида, известная автору диссертации, да-

тирована 1988 годом [148]. По указанным причинам, информация о процессе

подготовки задач будет приведена частично на основании опыта автора дис-

сертации, являвшегося в 2006–2009 годах членом жюри интернет-олимпиад

по информатике, проводимых Университетом ИТМО [130], в 2009 году став-

шего чемпионом мира по программированию, а с 2010 года являющегося

членом жюри Северо-Восточного полуфинала чемпионата мира по програм-

мированию [132] и одного из его четвертьфиналов, проходящих в Санкт-

Петербурге.

Page 20: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

20

1.1.1. Термины и обозначения

Решение олимпиадной задачи по программированию — это, как правило,

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

выводит ответ. При этом решение должно уложиться в ограничения на время

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

Тест для олимпиадной задачи по программированию — это набор вход-

ных данных, удовлетворяющий условию задачи (в частности, ограничениям,

указанным в условии). В большинстве случаев тест хранится в виде тексто-

вого файла определенного формата. Решение олимпиадной задачи должно

прочитать данные, содержащиеся в тесте, решить поставленную задачу для

этих данных и вывести ответ. Правильность ответа проверяется программой,

написанной жюри. Если для рассматриваемой задачи на каждый тест суще-

ствует единственный правильный ответ, то программа проверяет совпадение

ответа, выданного решением, и правильного ответа (например, сгенериро-

ванного решением жюри). Если правильных ответов несколько, то в условии

задачи оговаривается критерий, на основании которого определяется пра-

вильность ответа, и проверяющая программа использует этот критерий (и,

возможно, какой-либо правильный ответ, сгенерированный жюри).

На соревнованиях по программированию «классического» ви-

да (International Collegiate Programming Contest (ICPC ), проводимый

Association for Computing Machinery (ACM ) [131], International Olympiad in

Informatics [129] до 2010 года) тесты, как правило, неизвестны участникам.

Участники посылают на проверку в тестирующую систему решение задачи —

программу, которая читает входные данные и выводит выходные данные.

В тестирующей системе программа выполняется в специальном окружении

(«песочнице»), которое, как правило, пресекает попытки решения выполнить

запрещенные действия (открытие файлов, кроме тех, которые указаны в

условии, создание окон, выход в сеть, использование принтеров и т. п.), а

Page 21: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

21

также прерывает выполнение программы при превышении ей ограничения на

время работы или на объем используемой памяти (эти ограничения указаны

в условии задачи). В соревнованиях последних лет типичным ограничением

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

пользуемую память в последнее время выросли с 16–64 мегабайт до 256–512

мегабайт. В финале чемпионата мира по программированию используемая

память как минимум с 2009 года ограничена только ресурсами компьютера.

Назовем корректным решение, которое на любом тесте, удовлетворяю-

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

правильный ответ, а затем завершиться, уложившись в ограничения по вре-

мени и памяти. Определим также решение, корректное по тестам, которое

может быть некорректным, но на всех тестах из имеющегося набора, как и

корректное решение, находит правильный ответ, укладываясь в указанные

ограничения. Решение называется неэффективным, если существует хотя бы

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

мяти (соответственно, любое корректное решение является эффективным).

Можно также определить неверное решение, которое хотя бы для одного те-

ста генерирует неверный ответ или некорректно завершается.

Отметим, что в некоторых соревнованиях по программированию (напри-

мер, Google Code Jam [135]) проверяющая система проверяет только отве-

ты, сгенерированные решениями участников, при этом решения работают на

компьютерах участников, а ответы пересылаются через Интернет. По при-

чине того, что компьютеры участников могут иметь различные характери-

стики, при составлении задач приходится несколько изменить определение

эффективного и неэффективного решения. В случае Google Code Jam, со-

гласно руководству [139], эффективным решением является такое решение,

которое на всех входных данных, удовлетворяющих условию задачи, находит

корректный ответ не более чем за две минуты на компьютере с процессором

тактовой частотой 2 ГГц, используя не более 256 мегабайт оперативной па-

Page 22: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

22

мяти. Неэффективным же решением является такое, которое работает хотя

бы на одном тесте дольше 10 минут на компьютере с процессором тактовой

частотой 4 ГГц и возможностью использовать до двух гигабайт оперативной

памяти. При подготовке задач в Google Code Jam стараются поступать так,

чтобы все корректные решения жюри удовлетворяли определению эффектив-

ного решения, и в то же время так, чтобы каждое решение, не являющееся

эффективным, удовлетворяло бы определению неэффективного решения. В

настоящей диссертации, однако, такие модифицированные определения эф-

фективных и неэффективных решений использоваться не будут.

Будем считать, что тест A сложнее или лучше теста B для некоторого

решения по критерию времени работы, если данное решение находит ответ на

тесте A за большее время, чем на тесте B. Аналогично, тест A сложнее или

лучше теста B для некоторого решения по критерию объема используемой

памяти, если данное решение находит ответ на тесте A с использованием

большего объема памяти, чем на тесте B. Если в тексте диссертации критерий

(время или память) понятен из контекста, его указание может быть опущено.

Назовем тест хорошим для некоторого решения, если данное решение, будучи

запущенным на этом тесте, превышает ограничение на время работы или на

используемую память.

Назовем набор тестов слабым, если существует достаточно много реше-

ний, которые выдают правильные ответы, укладываясь в ограничения по

времени и памяти, на всех тестах этого набора, но при этом существуют те-

сты, удовлетворяющие условию задачи, на которых указанные решения не

работают. Иметь слабый набор тестов для олимпиадной задачи по програм-

мированию, как будет показано далее, крайне нежелательно.

1.1.2. Руководство по подготовке задач для Google Code Jam

Вероятно, самым полным документом о процессе подготовки задач для

олимпиад по программированию является Руководство по подготовке задач

Page 23: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

23

(Problem Preparation Guide) для соревнования Google Code Jam [139]. Несмот-

ря на то, что Google Code Jam не является представителем самого типичного

вида олимпиад по программированию — в частности, участники не посыла-

ют на проверку программу, которая запускается на неизвестном участникам

наборе тестов, как это происходит на соревнованиях формата ACM ICPC,

а скачивают входные данные и за отведенное время должны успеть сгене-

рировать и отправить на проверяющий сервер соответствующие выходные

данные — советы, изложенные в упомянутом документе, являются достаточ-

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

по программированию.

В разделах 1.1.2.1–1.1.2.5 приведен вольный перевод основных разделов

указанного руководства. Некоторые разделы, не относящиеся напрямую к

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

1.1.2.1. Для кого предназначено данное руководство

Руководство применимо для помощи в подготовке соревнований, на

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

чение ограниченного периода времени. Задачей участника на таком со-

ревновании является реализация корректных (в том числе эффективных)

решений предлагаемых на соревновании задач. Примерами таких сорев-

нований являются Google Code Jam [135], ACM ICPC [131], TopCoder

Algorithm Competitions [134], Russian Code Cup [133], Яндекс.Алгоритм [144]

и IPSC [136].

1.1.2.2. Основы подготовки задач

Предлагаемые на соревнованиях задачи должны быть алгоритмичными

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

ритмы дискретной математики, такие как алгоритм Дейкстры, построение

минимального остовного дерева, нахождение наибольшего общего делителя,

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

Page 24: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

24

в просьбе реализовать стандартный алгоритм. Лучшие задачи интересны и

не являются очень общими в формулировках, они требуют не только знаний,

но и определенной креативности. Формулировки вида «Напишите программу,

решающую данную головоломку» лучше, чем вида «Вычислите собственные

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

вычисление собственных чисел матрицы.

Задачи в общем случае не должны требовать специальных или специфи-

ческих знаний (например, правил игры в бейсбол). Одной из причин этого

является то, что многие крупные соревнования по программированию явля-

ются международными.

Каждая задача, предлагаемая на соревновании по программированию,

должна содержать следующие компоненты:

— условие задачи;

— генератор тестов и правильных ответов;

— валидатор тестов на соответствие условию;

— примеры решений (решения жюри);

— (опционально) примеры некорректных решений.

1.1.2.3. Генератор тестов и правильных ответов

Для того, чтобы повысить качество проверки решений, целесообразно ге-

нерировать тесты как минимум в полуавтоматическом режиме. В Google Code

Jam присутствует два вида тестов для скачивания — «маленькие» (Small) и

«большие» (Large) тесты, причем генерировать ответы для маленьких тестов

возможно несколько раз в случае ошибочных попыток. Поэтому в этом сорев-

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

тестов.

Хороший генератор тестов и правильных ответов на них является одним

из важнейших компонентов задачи. Генератор — это программа, которая сама

по себе может сгенерировать все требуемые тесты — даже если это единствен-

Page 25: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

25

ный файл, как в случае некоторых соревнований формата ACM ICPC — и

соответствующих им правильных ответов.

При генерации тестов обязательна генерация наиболее сложных, для воз-

можных решений участников, тестов, удовлетворяющих условию задачи, по-

скольку такие тесты являются наиболее вероятной причиной того, что реше-

ния не принимаются как корректные. Нужно всегда стремиться рассматри-

вать самые худшие, самые сложные сценарии. Если автору задачи или те-

стов требуется ограничить множество возможных тестов, это следует делать

в первую очередь в условии задачи.

Это требование очень важно для участников соревнований, потому что

ограничения на тесты описывают то, насколько эффективным должен быть

алгоритм для решения задачи. Участники не знают, какое решение жюри

считает правильным и какие тесты присутствуют в тестовом наборе. По этой

причине, например, некорректно указывать в условии, что N 6 10000, но

генерировать только такие тесты, в которых N 6 1000 — это даст меньше

шансов опытным участникам, которые потратят лишнее время на реализа-

цию эффективного решения, и даст преимущество неопытным участникам,

которые будут пытаться наудачу послать неэффективные решения (напри-

мер, основанные на алгоритмах перебора вариантов). Иначе говоря, исходя

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

лить, достаточно ли тот или иной алгоритм эффективен для решения этой

задачи.

Организаторы Google Code Jam советуют генерировать правильные отве-

ты той же самой программой, которой генерируются тесты. С одной стороны,

во многих случаях проще генерировать и тесты, и ответы на них одновремен-

но. С другой стороны, такой генератор может служить еще одним решением

жюри, что увеличивает шансы реализовать как можно больше возможных

решений и рассмотреть задачу с разных сторон.

Page 26: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

26

1.1.2.4. Валидатор тестов на соответствие условию

В последнее время все в большем числе соревнованиий по программи-

рованию (Google Code Jam, Codeforces, NEERC [132]) при подготовке задач

требуется написание отдельной программы, проверяющей тесты на соответ-

ствие условию. Это повышает шансы того, что понимание формата входных

данных и ограничений участниками, которые читают условие задачи, будет

совпадать с пониманием формата и ограничений авторами задачи, которые

имеют о задаче свое представление и могут не полностью отразить его в усло-

вии.

1.1.2.5. Корректные и некорректные решения жюри

Для повышения качества соревнований для каждой подготавливаемой

задачи должно быть написано больше одного корректного решения жюри —

программы, которая читает тест и генерирует правильный ответ на него.

Решения жюри должны писаться разными людьми независимо без предва-

рительного совещания, только на основании условия задачи. Это снижает

шансы того, что несколько членов жюри сделают одну и ту же ошибку в

разработке или реализации корректного решения.

Для проверки того, что разработанный набор тестов «отлавливает» как

минимум известные некорректные решения (либо неверные — генерирующие

неправильные ответы, либо неэффективные — генерирующие ответы слиш-

ком долго или с использованием слишком большого объема памяти), эти

некорректные решения, в свою очередь, тоже должны быть реализованы.

При этом неэффективные (в алгоритмическом плане) решения должны быть

хорошо оптимизированы (в плане реализации алгоритмов), в то время как

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

лизации, не самым оптимальным образом.

Page 27: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

27

1.1.3. Особенности архивов задач с проверяющей системой

Некоторые интернет-сервисы [137, 138, 142, 145—147], в частности, ар-

хивы задач с проверяющей системой, предоставляют участникам возмож-

ность решать задачи в течение неограниченного времени, используя неогра-

ниченное число попыток. Это позволяет участникам, помимо использования

интернет-ресурсов для изучения возможных решений задачи, реализовывать

и проверять путем посылки в проверяющую систему гораздо больше различ-

ных вариантов решения, очень часто неверных или неэффективных, чем это

было бы возможно в рамках соревнования. По указанной причине, слабые

места в наборах тестов гораздо с большей вероятностью будут обнаружены в

архиве задач, чем на соревновании. Следовательно, наборам тестов для задач,

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

Отчасти это компенсируется тем, что, в отличие от соревнований по про-

граммированию, в архиве задач предусмотрена возможность добавить тесты

в набор, если это окажется необходимым, и произвести перетестирование име-

ющихся решений, корректных по тестам. В этом случае авторам таких реше-

ний придут оповещения о том, что их решения теперь признано некоррект-

ными (неверными или неэффективными). В некоторых объемных архивах

задач, таких как Timus Online Judge [142], такие события происходят доста-

точно часто, что можно отследить в новостях ресурса.

1.1.4. Практика генерации тестов для олимпиадных задач по

программированию

Генерация тестов для олимпиадных задач по программированию, в об-

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

предметной области — самой задачи, связанных с ней знаний дискретной

математики, возможных решений этой задачи, включая неверные и неэф-

фективные. Данный раздел написан с учетом опыта автора в составлении

задач для интернет-олимпиад школьников по программированию [130], про-

Page 28: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

28

водимых Университетом ИТМО, а также для Северо-Западного полуфинала

чемпионата мира по программированию [132].

Часть тестов составляется вручную. Такие тесты проверяют решения

на корректность разбора случаев, встречающихся в задаче. К таким тестам

относятся и так называемые «минимальные» тесты, которые проверяют кор-

ректность работы решений около нижних границ ограничений.

Тесты большого размера, как правило, генерируются согласно некоторо-

му шаблону. Так, например, если в условии задачи фигурирует некоторый

граф, то можно сгенерировать двоичное дерево, полный двудольный граф

и другие виды графов [4]. Для покрытия тех ошибок, которые могут быть

не найдены с помощью описанных выше тестов, создаются «случайные» те-

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

членами жюри.

Для некоторых задач может быть написано некорректное решение, ко-

торое не было предусмотрено жюри. В этом случае в наборе тестов может

и не оказаться такого теста, на котором это решение не работает. Авторы

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

ют эвристические решения и генерируют тесты с целью продемонстрировать

их некорректность. Однако не все идеи эвристических решений могут быть

найдены или реализованы, а в отдельных случаях поиск тестов, демонстри-

рующих их некорректность, может затянуться на неопределенное время.

1.1.5. Вычислительная сложность задачи генерации тестов

Согласно теореме Райса [43], невозможно написать компьютерную про-

грамму, которая бы проверяла какое-либо нетривиальное свойство компью-

терной программы, данной на вход. Из этого могло бы следовать то, что

задача генерации тестов для определения неэффективных решений олимпи-

адных задач по программированию алгоритмически неразрешима.

Page 29: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

29

Тест в общем виде является последовательностью байт. Рассмотрим

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

верки того, что данная последовательность байт является корректным те-

стом для рассматриваемой задачи, является алгоритмически неразрешимой.

В этом случае поставленная выше задача генерации тестов также алгорит-

мически неразрешима в общем случае, потому что каждый тест, на котором

требуется проверить решение задачи, сначала требуется проверить на кор-

ректность.

Пусть задача проверки того, что данная последовательность байт явля-

ется корректным тестом для рассматриваемой задачи, разрешима алгорит-

мически. С учетом наличия ограничения на время работы решения олимпи-

адной задачи и объем используемой им памяти, поставленная выше задача

генерации тестов также будет алгоритмически разрешимой. Докажем этот

факт, предоставив алгоритм, решающий задачу генерации тестов. Сначала

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

программа, не превышая ограничения на время работы и на объем использу-

емой памяти. Затем переберем все возможные последовательности байт, раз-

мер которых не превышает указанный максимальный размер. Для каждой

такой последовательности проверим, является ли она корректным тестом, и

если является, то запустим на этом тесте решение с учетом ограничений на

время работы и используемую память. Если какое-либо ограничение превы-

шено, то тест найден и рассматриваемое решение признается неэффектив-

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

оно является эффективным.

Описанный алгоритм доказывает и тот факт, что если задача проверки

корректности теста принадлежит классу NP, то и задача генерации тестов

для определения неэффективных решений также принадлежит классу NP.

По причине того, что на олимпиадах по программированию не используют

задачи, проверка корректности теста для которых не принадлежит классу

Page 30: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

30

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

тестов принадлежит классу NP.

1.2. Эволюционные алгоритмы

Метаэвристики — это алгоритмы оптимизации, которые предназначены

для нахождения «достаточно хороших» решений сложных оптимизационных

задач за приемлемое время [1]. Целью метаэвристики является эффективное

исследование пространства поиска с целью нахождения оптимальных или

субоптимальных решений. В настоящее время известно множество алгорит-

мов, причисляемых к метаэвристикам. В соответствии с обзорной моногра-

фией [1], известные метаэвристики можно разделить на следующие классы:

1. Непопуляционные — в каждый момент времени рассматривают одно

потенциальное решение задачи. Данные метаэвристики подразделяются

на классы:

— натуральные метаэвристики — используют идеи, заимствованные

из процессов, происходящих в природе:

– обезьяний поиск (monkey search [44]);

– имитация отжига (simulated annealing [45]);

– экстремальная оптимизация (extremal optimization [46]);

– гармонический поиск (harmony search [47]);

– галактический поисковый алгоритм (galaxy-based search

algorithm [48]).

— ненатуральные метаэвристики — используют идеи, не основанные

на природных процессах:

– итеративный локальный поиск (iterated local search [49]);

– поиск с переменной окрестностью (variable neighborhood

search [50]);

– жадный рандомизированный адаптивный поиск (greedy

randomized adaptive search [51]);

Page 31: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

31

– управляемый локальный поиск (guided local search [52]);

– поиск с запретами (tabu search [53]);

– реактивный поиск с запретами (reactive tabu search [54]);

– метаэвристика частичной оптимизации при специальных усло-

виях усиления (partial optimization metaheuristic under special

intensification conditions [55]);

2. Популяционные — могут одновременно рассматривать множество по-

тенциальных решений задачи. Данные метаэвристики подразделяются

на классы:

— детерминированные эволюционные метаэвристики — основаны на

идеях эволюционного отбора, не строят вероятностных распреде-

лений:

– генетический алгоритм (genetic algorithm [12]);

– генетическое программирование (genetic programming [13]);

– меметический алгоритм (memetic algorithm [56]);

– эволюционная стратегия (evolution strategy [126, 127]);

– эволюционное программирование (evolution programming [57]);

– дифференциальная эволюция (differential evolution [58]);

– культуральный алгоритм (cultural algorithm [59]);

— вероятностные эволюционные метаэвристики (алгоритмы оценки

распределения, estimation of distribution algorithms) — основаны на

идеях эволюционного отбора, строят вероятностные распределения

для потенциально хороших решений задачи:

– популяционное пошаговое обучение (population-based

incremental learning [60]);

– бинарный моделируемый кроссовер (bit-based simulated

crossover [61]);

– алгоритм одномерного предельного распределения (univariate

marginal distribution algorithm [62]);

Page 32: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

32

– алгоритм двумерного предельного распределения (bivariate

marginal distribution algorithm [63]);

– компактный генетический алгоритм (compact genetic

algorithm [64]);

– расширенный компактный генетический алгоритм (extended

compact genetic algorithm [65]);

– максимизация совместной информации для кластеров вход-

ного пространства (mutual information maximizing input

clustering [66]);

– комбинирование оптимизаторов с деревьями совместной ин-

формации (combining optimizers with mutual information

trees [67]);

– алгоритм байесовской оптимизации (bayesian optimization

algorithm [68]);

– алгоритм марковской оптимизации (Markov optimization

algorithm [69]);

— роевые биологические метаэвристики — основаны на моделях по-

ведения групп живых существ:

– оптимизация роем частиц (particle swarm optimization [70]);

– алгоритм роя искусственных рыб (fish swarm algorithm [71]);

– кукушкин поиск (cuckoo search [72]);

– алгоритм летучих мышей (bat algorithm [73]);

– алгоритм социального поведения кошек (cat swarm

optimization [74]);

– алгоритм перемешанных прыгающих лягушек (shuffled frog-

leaping algorithm [75]);

– муравьиные алгоритмы (ant colony optimization [76, 77]);

– светлячковый алгоритм (firefly algorithm [78]);

Page 33: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

33

– оптимизация роем жуков-светлячков (glowworm swarm

optimization [79]);

– пчелиные алгоритмы (artificial bee colony [80]);

– оптимизация осиной колонией (wasp colony optimization [81]);

– оптимизация добывающими пищу бактериями (bacterial

foraging optimization algorithm [82]);

– оптимизация разрастающимися сорняками (invasive weed

optimization [83]).

— роевые физические метаэвристики — основаны на моделях взаи-

модействия ансамблей частиц:

– интеллектуальные капли воды (intelligent water drops [84]);

– динамика речной системы (river formation dynamics [85]);

– гравитационный поисковый алгоритм (gravitational search

algorithm [86]);

– механизм, подобный электромагнетизму (electromagnetism-like

mechanism [87]);

– поиск заряженной системой (charged system search [88]);

– стохастический диффузионный поиск (stochastic diffusion

search [89]);

– алгоритм большого взрыва-большого сжатия (big bang-big

crunch algorithm [90]).

— иммунные метаэвристики — основаны на моделях функциониро-

вания иммунных систем живых существ:

– алгоритм клонального отбора (clonal selection algorithm [91]);

– алгоритм отрицательного отбора (negative selection

algorithm [92]);

– искусственная иммунная сеть (artificial immune network [93]);

– алгоритм B-клеток (B-cell algorithm [94]);

Page 34: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

34

– гибридный иммунный алгоритм (hybrid immune

algorithm [95]);

– модель T-клеток (T-cell model [96]).

— ненатуральные метаэвристики — не основанные на природных про-

цессах:

– поиск с разбросом (scatter search [97]).

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

(главным образом, по историческим причинам) являются эволюционные ал-

горитмы, такие как генетические алгоритмы, генетическое программирова-

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

далее в настоящей диссертации, они будут рассмотрены подробнее.

1.2.1. Термины и обозначения

Эволюционные алгоритмы, как следует из их названия, основаны на идее

эволюции живого в природе. По этой причине многие сущности, используе-

мые в эволюционных алгоритмах, имеют устоявшиеся названия, использую-

щие метафору эволюции, несмотря на то, что в теории оптимизации им даны

свои, не менее устоявшиеся названия.

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

(максимизируемая или минимизируемая) функция f : D → C, описание ко-

торой включает область определения D и область значений C. Точка из обла-

сти определения, которую также часто называют потенциальным решением,

кандидатом в решения задачи оптимизации, в эволюционных алгоритмах на-

зывают особью (individual). Значение, возвращаемое функцией f на точках

из пространства D, называется приспособленностью (fitness) или значением

приспособленности особи, а саму функцию — функцией приспособленности,

или фитнесс-функцией (fitness function).

Вследствие использования метафоры «приспособленности» часто подра-

зумевается, что функцию приспособленности требуется максимизировать, хо-

Page 35: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

35

тя в различных применениях эволюционных алгоритмов может требоваться

как максимизация, так и минимизация функции приспособленности (кото-

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

дальнейшем для простоты описаний предполагается, что функция приспо-

собленности должна быть максимизирована.

Отметим, что во многих реальных задачах, для решения которых приме-

няются эволюционные алгоритмы, может быть не одна функция приспособ-

ленности, а несколько, возможно, конфликтующих, и все они должны быть

по возможности максимизированы. Для решения таких задач существуют

многокритериальные эволюционные алгоритмы, самым цитируемым на на-

стоящий момент многокритериальным эволюционным алгоритмом является

генетический алгоритм NSGA-II [98]. Так как в настоящей работе многокри-

териальные эволюционные алгоритмы не используются, они не будут рас-

смотрены ниже.

1.2.2. (1 + 1)-эволюционный алгоритм

Наиболее простым эволюционным алгоритмом является (1 + 1)-

эволюционный алгоритм [99]. В каждый момент в данном алгоритме под-

держивается наилучшая (обладающая максимальным значением приспособ-

ленности) из известных особей, причем в начальный момент эта особь ге-

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

каждой итерации генерируется измененная копия лучшей особи (в терминах

эволюционных алгоритмов, эта операция называется мутацией, по аналогии

с мутациями генома живых существ, а функция, сопоставляющая особи ее

мутировавшую копию, называется оператором мутации) и вычисляется ее

значение приспособленности. Если оно не меньше, чем значение приспособ-

ленности лучшей особи, то лучшая особь заменяется на текущую. Если те-

кущая особь удовлетворяет постановке задачи оптимизации (будем говорить,

что такая особь является хорошим решением задачи оптимизации), то алго-

Page 36: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

36

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

Псевдокод (1 + 1)-эволюционного алгоритма приведен на листинге 1.

Листинг 1 – Псевдокод (1 + 1)-эволюционного алгоритма

function OnePlusOneEA(F, M, Q, R, N)

F — функция приспособленности

M — оператор мутации

Q — критерий оценки качества особи

R — генератор случайных особей

N — ограничение на число итераций

A← R()

for i← 1 . . .N do

if Q(A) then

return {A} — хорошая особь найдена

else

B ←M(A)

if F (B) > F (A) then

A← B

end if

end if

end for

return {} — хорошая особь не найдена

end function

От алгоритмов локального поиска (1 + 1)-эволюционный алгоритм от-

личается тем, что оператор мутации является глобальным: позволяет полу-

чить любую возможную особь из любой возможной с ненулевой, пусть даже

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

задачи число возможных особей конечно, то существует такое число p > 0,

что на каждой итерации вероятность сгенерировать хорошую особь не мень-

Page 37: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

37

ше p. Из этого следует, что математическое ожидание числа итераций для

нахождения хорошей особи не превосходит 1/p.

Описанный алгоритм является достаточно простым, так как требует опи-

сания всего четырех компонентов — генератора случайных особей, оператора

мутации, функции приспособленности и критерия оценки качества особи. Во

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

ко, такой алгоритм обладает недостатками, главный из которых — склонность

к застреванию в локальных оптимумах. Одним из решений этой проблемы

является периодический перезапуск алгоритма. Другим решением является

увеличение числа рассматриваемых особей и усложнение стратегий отбора

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

выделяют генетические алгоритмы и эволюционные стратегии.

1.2.3. Генетические алгоритмы

Генетические алгоритмы были впервые предложены в 1975 году

Дж. Холландом (J. P. Holland) в книге «Адаптация в естественных и искус-

ственных системах» [12]. Генетические алгоритмы представляют собой более

сложную модель эволюции, чем (1+1)-эволюционный алгоритм — в них вме-

сто одной особи рассматривается множество особей, имеются эквиваленты

битвы между особями за право размножения, спаривания особей, естествен-

ного отбора на выживание.

Генетический алгоритм, также как и (1 + 1)-эволюционный алгоритм,

является итеративным алгоритмом. Множество особей, имеющихся на мо-

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

каждой особи известно ее значение приспособленности. Сначала некоторые

особи из популяции проходят отбор для размножения. Затем отобранные

особи обмениваются генетическим материалом — в большинстве реализаций

из особей составляются парами и в парах происходит так называемое скре-

щивание, по аналогии с процессом кроссинговера, происходящим при фор-

Page 38: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

38

мировании половых клеток в живых организмах. Получившиеся в процессе

скрещивания особи с некоторой вероятностью подвергаются операции мута-

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

из новых особей и особей текущего поколения оператором отбора для вы-

живания формируется новое поколение, с которого начинается следующая

итерация.

Таким образом, существенным отличием от (1+ 1)-эволюционного алго-

ритма является наличие многих особей в поколении, оператора скрещивания,

а также операторов отбора для размножения и для выживания. Схема генети-

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

для размножения может выбираться примерно столько же особей, сколько

имеется в поколении, или, наоборот, минимальное число особей (две особи),

оператор мутации может выполняться как перед скрещиванием, так и после

него или вместо него. Таким образом, название «генетический алгоритм» на

самом деле описывает большое семейство метаэвристик, объединенных одной

метафорой.

1.2.4. «Классический» генетический алгоритм

По историческим причинам, вслед за Холландом [12], в качестве особей

генетического алгоритма чаще всего рассматриваются битовые строки фик-

сированной длины, каким-либо образом кодирующие решение задачи. Причи-

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

решения задачи битовой строкой имеет определенное сходство с кодировани-

ем свойств живого организма в его ДНК, являющейся строкой над алфавитом

мощностью четыре. Еще одной причиной является простота реализации опе-

раторов мутации и скрещивания над такими строкам, причем эти операторы

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

мом.

Page 39: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

39

В качестве оператора мутации над битовыми строками чаще всего [14]

используют инвертирование одного случайно выбранного бита или инверти-

рование каждого бита независимо с определенной небольшой вероятностью

(чаще всего 1/N , где N — длина битовой строки). В качестве оператора скре-

щивания часто используют следующие операторы [14]:

— одноточечный оператор скрещивания — пусть имеются две битовые

строки A и B длиной N , тогда случайным образом из интервала [1;N ]

выбирается индекс K, и в строках A и B производится обмен суффик-

сами длиной K;

— двухточечный оператор скрещивания — между строками производится

обмен подстроками, находящимися между двумя случайно выбранными

индексами K1 < K2;

— однородный оператор скрещивания — для каждого индекса значения

битов между строками обмениваются местами с некоторй вероятностью

p (часто p = 0,5).

В качестве операторов отбора для размножения часто используют сле-

дующие операторы:

— случайный отбор — особи для размножения выбираются случайным об-

разом;

— пропорциональный отбор, или «принцип рулетки» (roulette wheel

selection) — особь выбирается с вероятностью, пропорциональной зна-

чению ее приспособленности;

— нормированный пропорциональный отбор — перед осуществлением про-

порционального отбора приспособленность каждой особи пересчитыва-

ется по правилу Fi = (Fi−Fmin)/(Fmax−Fmin), где Fmax — максимальное

значение приспособленности в текущем поколении, а Fmin — минималь-

ное;

Page 40: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

40

— ранговый отбор — особь выбирается с вероятностью, зависящей от ее

места в списке особей, отсортированных по значению приспособленно-

сти;

— турнирный отбор — для отбора одной особи случайным образом вы-

бирается несколько особей, затем по определенным правилам из них

выбирается «победитель» таким образом, чтобы особь с большим зна-

чением приспособленности получает больше шансов на то, чтобы быть

выбранной.

В качестве операторов отбора для выживания часто используют следу-

ющие операторы:

— игнорирование родительских особей — в новое поколение попадают все

новые особи и только они;

— элитизм — в новое поколение попадает E % особей из предыдущего

поколения с самым большим значением приспособленности, где E —

положительная константа, не превосходящая 100, остальное место в но-

вом поколении занимают новые особи;

— выбор лучших из новых особей (называемый по-английски comma

selection от названия соответствующего оператора в эволюционных

стратегиях);

— выбор лучших из старых и новых особей (называемый по-английски

plus selection от названия соответствующего оператора в эволюционных

стратегиях).

Достоинством классического генетического алгоритма является просто-

та реализации операторов и их независимость от задачи. Недостатком явля-

ется то, что особь — это битовая строка, для вычисления приспособленности

которой необходимо проделать нетривиальное преобразование битовой стро-

ки в зависящее от задачи представление (например, вектор вещественных

чисел, строку над некоторым алфавитом, программу). Наличие данного пре-

образования может приводить к тому, что определенная доля особей не соот-

Page 41: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

41

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

деленные проблемы представляет также требование стандартных операторов

к длине битовой строки, фиксированной на всем протяжении работы генети-

ческого алгоритма. Многие из этих проблем решаются путем перехода от

представления особи в виде битовой строки к проблемно-ориентированному

представлению, например, к вектору вещественных чисел или к представле-

нию в виде программы. Последний вариант получил название «генетическое

программирование».

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

Особый вид генетических алгоритмов — генетическое программирова-

ние — использует в качестве хромосомы некоторое представление програм-

мы, например, синтаксическое дерево разбора программы [15] или конечный

автомат [5]. Основы генетического программирования заложил Дж. Коза

(Koza J. R.) в 1992 году [13]. Структура хромосомы несет в себе специфи-

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

операторы скрещивания и мутации, что позволяет сократить область поиска

и ускорить нахождение оптимума.

1.2.6. Эволюционные стратегии

Еще одним семейством алгоритмов оптимизации, использующим идеи

биологической эволюции, являются эволюционные стратегии [126—128, 100,

101]. Эволюционные стратегии были впервые описаны в работе [126]. Вна-

чале они использовались для сложных задач оптимизации с непрерывными

параметрами, таких как оптимизация формы крыла самолета [128], а затем

область их применения была расширена и на дискретные задачи оптимиза-

ции [127].

Одно из отличий эволюционных стратегий от генетических алгоритмов

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

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

Page 42: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

42

эволюционных стратегий к подстройке собственных параметров с целью бо-

лее эффективного поиска (параметры генетических алгоритмов, такие как,

например, вероятность применения оператора мутации, чаще всего остаются

неизменными в течение работы алгоритма). Так, для некоторых задач доста-

точно эффективным является поддержание «правила одной пятой» [126]:

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

1/5, то степень мутации необходимо повысить;

— если эта доля меньше 1/5, то степень мутации необходимо понизить;

— иначе, степень мутации изменять не требуется.

Наиболее простыми вариантами эволюционных стратегий является

(1+1)-эволюционные стратегии (расшифровка обозначения (1 + 1): поколе-

ние состоит из одной особи, на каждой итерации генерируется один потомок,

следующее поколение формируется из лучшей особи среди предков и потом-

ков), (µ + λ)-эволюционные стратегии (поколение состоит из µ особей, на

каждой итерации генерируется λ потомков, в следующее поколение проходят

µ лучших особей из предков и потомков), (µ, λ)-эволюционные стратегии (по-

коление состоит из µ особей, на каждой итерации генерируется λ потомков, в

следующее поколение проходят µ лучших особей из потомков, но не предков).

Идеи по настройке параметров эволюционных алгоритмов находят

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

ковариационной матрицы (covariance matrix adaptation evolution strategy,

CMA-ES [102—104]). Такие эволюционные стратегии предназначены для ра-

боты с особями, представляемыми в виде вектора вещественных чисел, и су-

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

приспособленности в окрестности текущей точки в виде матрицы ковариации

и использования этой информации для направления процесса поиска по на-

правлению к оптимуму в пространстве особей.

Page 43: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

43

1.3. Поисковая инженерия программного обеспечения

В программной инженерии (software engineering) часто возникают зада-

чи, для решения которых требуется найти компромисс между достижениями

нескольких целей, часто конфликтующих или противоречащих друг другу.

Множество вариантов, которые требуется рассмотреть для этого, в большин-

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

но. Приведем несколько примеров таких задач:

— Каков наименьший набор тестов, покрывающий все ветви исполнения

данной программы?

— Какая архитектура является наилучшей для данной программы?

— Каков набор требований заказчика, который требуется реализовать,

чтобы найти компромисс между стоимостью проекта и удовлетворен-

ностью заказчика?

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

разработки программного обеспечения?

— Какие шаги по переработке (рефакторингу) кода и в каком порядке

лучше всего произвести для улучшения кода данной системы?

На первый взгляд, ответы на поставленные задачи следует искать в

совершенно различной литературе — соответственно по тестированию про-

грамм, проектированию программ, инженерии требований, управлению про-

ектами, переработке кода. Однако, все эти задачи являются задачами опти-

мизации и могут решаться алгоритмами оптимизации. В связи со сложной

структурой задач наиболее подходящими алгоритмами оптимизации оказы-

ваются метаэвристики, которые были рассмотрены в разделе 1.2. Методы

решения задач программной инженерии с помощью метаэвристик, или по-

исковых алгоритмов оптимизации, формируют поисковую инженерию про-

граммного обеспечения (search-based software engineering, SBSE) [11].

Page 44: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

44

1980 1990 2000 2010

0

50

100

150

Рисунок 1 – Число публикаций в области поисковой инженерии

программного обеспечения по годам. Источник данных —

http://crestweb.cs.ucl.ac.uk/resources/sbse_repository

Поисковая инженерия программного обеспечения является молодой и

быстроразвивающейся областью науки. По состоянию на конец 2013 года бы-

ло издано 1238 публикаций на эту тему. На рисунке 1 приведено число пуб-

ликаций за каждый год, начиная с 1976.

Согласно обзорной работе [11], по состоянию на начало 2009 года наи-

более часто в поисковой инженерии программного обеспечения применяются

эволюционные алгоритмы (более 450 работ), на втором месте — алгоритм

имитации отжига (порядка 60 работ), на третьем — локальный поиск (чуть

менее 50 работ). Также в этой области находят применение муравьиные ал-

горитмы, градиентный спуск, метод роя частиц, алгоритмы оценки распре-

делений, поиск с запретами и некоторые другие метаэвристики.

Порядка 59 % работ посвящено области тестирования и отладки про-

грамм (данная область имеет название «поисковое тестирование программ-

ного обеспечения», search-based software testing), 11 % работ относятся к об-

Page 45: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

45

ласти поддержки и улучшения программ, 10 % работ описывают инструмен-

ты и технологии проектирования программ, 9 % работ посвящены вопросам

управления разработкой программного обеспечения, 4 % — вопросам вери-

фикации программ. Таким образом, в рассматриваемой области в настоящее

время имеется сравнительно небольшое число работ.

1.3.1. Обзор избранных работ по поисковому тестированию

программного обеспечения

По причине того, что настоящая диссертация посвящена процессу тести-

рования программ определенного класса (решений олимпиадных задач по

программированию), в данном разделе приводится обзор избранных работ

по поисковому тестированию программного обеспечения.

1.3.1.1. Genetic Algorithm Based Software Testing

В данной статье [25] излагается методика применения генетического ал-

горитма для генерации теста с наибольшим временем отклика. Данная ме-

тодика была применена для тестирования небольшой последовательной про-

граммы для встраиваемого устройства, состоящей из нескольких случайно

сгенерированных циклов задержки. Входными данными этой программы был

вектор из 32 бит, а функцией приспособленности — непосредственно время

работы программы.

В результате работы генетического алгоритма был протестирован каж-

дый 289-ый входной вектор из 232 возможных. Было обнаружено, что измере-

ние такой функции приспособленности, как время работы, подвержено флук-

туациям, например, для наиболее сложного теста время работы составило

1292± 5 миллисекунд. Данный эффект проявляется в существенно большей

степени при тестировании программ, запускаемых на компьютерах с много-

задачными операционными системами, что ограничивает применимость под-

хода, основанного на максимизации времени работы [26—34].

Page 46: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

46

1.3.1.2. Evolutionary Testing of Classes

В работе [15] исследуется генерация модульных тестов, тестирующих ме-

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

боте тесты представляют собой особи генетического алгоритма, в которых

кодируется последовательность действий, необходимых для подготовки вход-

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

буемое состояние, вызова непосредственно тестируемого метода и проверки

результатов его выполнения на соответствие спецификации.

Апробация данной методики производилось с использованием классов

из стандартной библиотеки языка Java, как оригинальных, так и с наме-

ренно внесенными ошибками. В результате апробации было достигнуто по-

крытие кода в районе 95–100 % для таких классов стандартной библиотеки,

как StringTokenizer, BitSet, HashMap, LinkedList, Stack, TreeSet. Макси-

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

BitSet и составило 4930 секунд. В процессе генерации тестов было найдено

несоответствие между спецификацией и реализацией метода addAll класса

LinkedList, оказавшееся ошибкой спецификации.

Указанная работа посвящена проверке методов класса на соответствие

спецификации, причем используемая спецификация не затрагивает вопросов

времени работы кода на различных входных данных. Следовательно, подход,

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

временем работы.

1.3.1.3. Genetically Improving 50000 Lines of C++

Еще одним направлением использования эволюционных алгоритмов в

производстве программного обеспечения является эволюционное улучшение

программ. В работе [105] описывается эволюционный алгоритм для повыше-

ния скорости работы программы Bowtie2, используемой при сборке геномных

последовательностей. Отличительной особенностью именно этой работы яв-

Page 47: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

47

ляется то, что объем и сложность улучшаемой программы превосходят ана-

логичные показатели предыдущих исследований на один-два порядка — так,

объем исходного кода составил 50 тысяч строк на языке C++.

Особями этого эволюционного алгоритма служат изменения в исходном

коде программы, так называемые патчи (patches). Вычисление приспособ-

ленности таких особей происходит следующим образом: патчи применяются

к исходному коду программы (таким образом, получается новая версия про-

граммы), полученный код компилируется, а успешно скомпилированный код

запускается на наборе тестов, который поставляется с программой. В свя-

зи с тем, что набор тестов довольно велик, исследователи разделили тесты

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

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

Функцией приспособленности служит комбинация из следующих значений:

число тестов, на которых программа успешно завершилась; средний показа-

тель качества ответов, полученных на тестовых данных; общее время работы

программы на тестовых данных.

Для уменьшения области поиска и повышения вероятности построения

корректной программы авторами работы предложен следующий подход. Ис-

ходный код программы представляется в виде контекстно-свободной грамма-

тики. Каждая строка программы представлена нетерминалом. Кроме того,

условия операторов if, while, do-while и for, а также части инициализа-

ции и инкремента оператора for были вынесены в отдельные заменяемые

нетерминалы соответствующего типа. Патчи являются списками элементар-

ных изменений, каждое из которых может иметь один из трех видов:

— замена: один из заменяемых нетерминалов заменяется на другой суще-

ствующий нетерминал того же типа;

— удаление: заданный нетерминал удаляется;

— дублирование: после заданного нетерминала вставляется копия другого

заданного нетерминала.

Page 48: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

48

Для получения минимального набора изменений, приводящего к улуч-

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

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

происходит тестирование новой программы, и если она оказалась не хуже

старой, изменение удаляется из списка совсем. Так происходит до тех пор,

пока для каждого изменения, оставшегося в списке, его удаление приводит к

ухудшению работы программы.

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

Bowtie2 на данных человеческого генома в 77 раз. Качество измененной про-

граммы изменилось следующим образом: в 89 % случаев результаты ориги-

нальной и измененной программы были идентичны, в 9 % случаев измененная

программа дала лучшие, чем исходная, результаты, в остальных случаях ре-

зультаты измененной программы были хуже, но лишь в четвертой значащей

цифре.

Указанная работа посвящена производительности программ, в частно-

сти, времени работы. Однако время работы рассматриваемой в работе про-

граммы анализировалось лишь на фиксированном наборе тестов. При провер-

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

Решение задачи о генерации теста, на котором тестируемая программа рабо-

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

подходом могло бы исправить указанный недостаток.

1.3.2. Альтернативные подходы

В данном разделе для полноты обзора приведено описание некоторых

работ, реализующих подходы к генерации тестов, не связанные с поисковой

инженерией программного обеспечения. Одним из самых эффективных под-

ходов в настоящее является динамическое символьное выполнение (dynamic

symbolic execution, DSE) — входные данные подбираются таким образом, что-

бы выполнение программы происходило по заданной траектории. Для этого

Page 49: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

49

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

щью специальных решателей.

1.3.2.1. Генерация тестов по спецификации UML

В работах [16, 17] предложен метод автоматической генерации тестов по

диаграммам состояний UML. При этом генерировались тесты, покрывающие

все совокупности предикатов, все переходы и все утверждения диаграммы

состояний. Авторами была разработана утилита UMLTEST, которая инте-

грировалась в среду разработки Rational Rose. На примере тестирования си-

стемы круиз-контроля, в которую было внесено 24 ошибки, было показано,

что тесты совокупности предикатов нашли все внесенные ошибки, тесты пере-

ходов нашли 18 ошибок, тесты утверждений — 16. Совокупный набор тестов

покрыл 89 % блоков кода, в том числе 95 % управляющих конструкций.

В работе [18], кроме диаграммы состояний, для генерации тестов ис-

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

и на уровне интеграции компонентов. На примере приложения для сотово-

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

тестов по диаграммам состояний дает лучшие результаты, а на интеграцион-

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

диаграмме связей.

Различные методы генерации тестов по другим диаграммам UML рас-

сматриваются в работах [19, 20]. Помимо диаграмм состояний, для генерации

тестов используются диаграммы связей, диаграммы последовательностей и

некоторые другие диаграммы.

Указанная работа относится к тестированию программ на соответствие

спецификации, при этом производительность программы не рассматривает-

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

построения теста с большим временем работы.

Page 50: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

50

1.3.2.2. Генерация с помощью параметризованных тестов

Инструментальное средство Pex [22] позволяет частично автоматизиро-

вать работу по генерации модульных тестов с использованием методики па-

раметризированных модульных тестов (ПМТ). ПМТ является процедурой с

одним или несколькими параметрами, запускающей процедуры и функции

тестируемой программы и проверяющей результаты выполнения. Схема ра-

боты средства Pex такова:

1. Генерируются различные значения параметров теста.

2. Запускается весь ПМТ или некоторые его части.

3. Полученные пути выполнения анализируются, определяются новые це-

ли, генерируется набор ограничений на параметры теста, необходимых

для достижения цели.

4. По полученным ограничениям, если они удовлетворимы, конструиру-

ются новые значения параметров, и процесс продолжается с шага 1.

Несмотря на то, что подход с использованием решения задачи удовлетво-

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

недостатки — в частности, используемый решатель задачи удовлетворения

ограничений невозможно использовать для определенных систем ограниче-

ний на вещественные числа. В работе [106] был предложен подход, позво-

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

программного обеспечения. Указанный подход справился с задачей покры-

тия кода тестами на нескольких сложных модельных задачах. В дальнейшем

подход на основе поисковых алгоритмов был внедрен и для некоторых других

случаев [107].

Указанная работа по используемой методологии относится к работам на

тему покрытия кода тестами. Однако, даже полное покрытие инструкций

или ветвлений кода тестами может не дать тест с большим временем работы.

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

Page 51: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

51

построения пути выполнения, соответствующего большому времени работы,

неизбежно займет на несколько порядков больше времени, чем планируемое

время работы. Следовательно, подход, предлагаемый в ней, не может решить

задачу построения теста с большим временем работы. То же самое верно и

для других работ и программных средств (таких как CREST и CUTE ), ис-

пользующих динамическое символьное вычисление для покрытия кода теста-

ми [23, 24].

1.3.2.3. Генерация возможных путей выполнения

Утилита PathCrawler, описанная в работе [35], предназначена для по-

строения тестов, покрывающих все возможные пути выполнения в програм-

ме. Среди таких путей обязательно будет путь, соответствующий наиболь-

шему времени выполнения. В работе [36] описан подход на основе упоря-

дочивания путей выполнения по времени выполнения, с помощью которо-

го можно существенно сократить время нахождения пути, соответствующие

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

программного обеспечения встраиваемых систем. В частности, подход, опи-

санный в работе [36], проверялся только для программ без циклов и рекурсии.

По этой причине его затруднительно или даже невозможно применять для

программ общего вида, содержащих циклы и/или рекурсию, к которым от-

носятся и решения олимпиадных задач по программированию.

1.4. Задачи, решаемые в диссертационной работе

При подготовке тестов для олимпиадных задач по программированию

одной из сложных задач является генерация тестов, на которых неэффектив-

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

память. Как было показано выше, данная задача в общем случае является

алгоритмически неразрешимой, однако для любой практически используе-

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

сложности NP. В доступной литературе отсутствует какая-либо методоло-

Page 52: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

52

гия, позволяющая формализовать процесс генерации тестов для определения

неэффективных решений олимпиадных задач по программированию.

Задачи, подобные указанной, успешно решаются для определенных клас-

сов программ с использованием методов поисковой инженерии программного

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

Однако, существующие методы имеют следующие недостатки:

— большинство методов направлены на максимизацию покрытия кода те-

стами, а не на максимизацию времени работы кода;

— методы, добивающиеся длительного времени работы кода, разработаны

для встраиваемых систем;

— методы, основанные на переборе возможных путей выполнения, при-

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

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

В дополнение к этому, следующие свойства решений олимпиадных за-

дач по программированию могут привести к тому, что специализированные

методы будут достигать лучших результатов:

— в решениях олимпиадных задач проверка корректности тестов, как пра-

вило, не производится, поскольку тесты гарантированно являются кор-

ректными, что упрощает структуру программы;

— решения олимпиадных задач не работают с сетевым стеком, графиче-

ской подсистемой, принтерами и другими периферийными устройства-

ми.

— тесты имеют жестко фиксированную структуру, четко определенную в

условии задачи.

На основании проведенного обзора сформулируем цель диссертацион-

ной работы — разработка методов и технологии генерации тестов для опре-

деления неэффективных решений олимпиадных задач по программированию

с использованием эволюционных алгоритмов.

Page 53: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

53

Задачи, решаемые в диссертационной работе:

1. Показать целесообразность применения эволюционных алгоритмов для

генерации тестов, определяющих неэффективные решения олимпиад-

ных задач по программированию, на примере задач дискретной матема-

тики, алгоритмы решения которых могут работать существенно быст-

рее, чем ожидается согласно верхней оценке на время работы.

2. Разработать алгоритм выбора из нескольких функций приспособленно-

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

3. Разработать и внедрить технологию генерации тестов на основе эволю-

ционных алгоритмов для определения неэффективных решений олим-

пиадных задач по программированию на примере задач дискретной ма-

тематики указанного класса.

Выводы по главе 1

1. Проведен обзор работ по темам «Олимпиадные задачи по программи-

рованию», «Эволюционные алгоритмы», «Поисковая инженерия про-

граммного обеспечения».

2. Введены необходимые термины и определения.

3. Установлено, что существующие методы поисковой инженерии про-

граммного обеспечения неприменимы для решения проблемы генерации

тестов для определения неэффективных решений олимпиадных задач

по программированию.

4. Сформулирована цель и задачи диссертационной работы.

Page 54: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

54

ГЛАВА 2. МЕТОД ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АЛГОРИТМОВ

РЕШЕНИЯ NP-ТРУДНЫХ ЗАДАЧ НА ОСНОВЕ

ГЕНЕТИЧЕСКОГО АЛГОРИТМА (НА ПРИМЕРЕ ЗАДАЧИ О

РЮКЗАКЕ)

В теории вычислительной сложности выделяют класс задач NP [108] —

задачи разрешимости, решаемые за полиномиальное время на недетерми-

нированной машине Тьюринга (в отличие от класса P, где используется де-

терминированная машина Тьюринга). Иными словами, это задачи, ответ на

которые можно проверить за полиномиальное время.

NP-трудными задачами называются задачи, к которым за полиномиаль-

ное время можно свести любую задачу класса NP. Если такая задача сама

принадлежит классу NP, она называется NP-полной. В качестве примеров

NP-полных задач можно привести задачу о выполнимости булевых формул,

задачу коммивояжера, задачу о рюкзаке.

Более 30 лет задача о том, совпадают или нет классы P или NP, является

открытой. Иными словами, существуют задачи, ответ на которые можно про-

верить быстро, но быстрый алгоритм решения такой задачи неизвестен. Это

верно в том числе и для NP-трудных задач. Для подавляющего большинства

NP-трудных задач решения основаны на двух идеях:

1. Перебор с отсечениями. Суть перебора с отсечениями состоит в том,

чтобы определенным образом перебирать потенциальные ответы на за-

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

этом для некоторых задач этот перебор можно оптимизировать, отсеи-

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

2. Динамическое программирование. Некоторые задачи можно разбить на

подзадачи, решить их независимо друг от друга, а затем каким-либо об-

разом объединить ответы на них. В случае NP-полных задач, как пра-

вило, для каждой подзадачи требуется находить не один, а множество

ответов, причем число таких ответов оказывается суперполиномиаль-

Page 55: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

55

ным — таким, которое нельзя ограничить полиномиальной функцией

от размера входных данных.

Для некоторых NP-трудных задач были получены решения, которые мо-

гут работать очень быстро для большого числа входных данных (тестов). Их

сущность проявляется в том, что для всех известных в настоящее время реше-

ний таких задач существуют тесты, на которых они все-таки работают долго,

однако эти тесты бывает очень трудно найти. В качестве примера такой за-

дачи в настоящей работе рассматривается задача о рюкзаке.

2.1. Задача о рюкзаке

Задача о рюкзаке — одна из известнейших задач комбинаторной опти-

мизации. В дальнейшем под задачей о рюкзаке будет пониматься ее наиболее

часто используемая версия, также называемая «рюкзак 0–1» (0–1 knapsack

problem).

Входными данными задачи являются N предметов, каждый из кото-

рых обладает весом wi и стоимостью pi. Также дан рюкзак вместимостью

W . Требуется найти такое подмножество данных предметов, которое может

быть помещено в рюкзак и при этом обладает максимальной стоимостью.

Более формально, требуется определить такие xi ∈ {0, 1} (отсюда название

«рюкзак 0–1»), чтобы∑N

i=1wixi 6 W и при этом величина∑N

i=1 pixi была

максимально возможной. Некоторые другие разновидности задачи о рюкза-

ке, такие как «ограниченный рюкзак», в которой предмет с номером i можно

взять не более чем ci раз, тривиально сводятся к задаче «рюкзак 0–1».

Задача о рюкзаке NP-полна и, в частности, является NP-трудной в сла-

бом смысле [108], так как для ее решения существует широко известный ал-

горитм динамического программирования, предложенный Беллманом [109],

решающий задачу с использованием O(NW ) времени и памяти. Данную за-

дачу также называют «самой легкой NP-полной задачей», поскольку для ее

Page 56: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

56

решения предложены алгоритмы, решающие многие задачи большого разме-

ра за полиномиальное время, в частности, за линейное время [37].

В работе Васека Хватала [110] предложен способ построения сложных

входных данных для большого класса алгоритмов решения задачи о рюкзаке.

Веса и стоимости предметов, предлагаемые данным способом, равны:

pj = wj = 2K+N+1 + 2K+j + 1,

где N — требуемое число предметов, а K = ⌊log2N⌋, 1 6 j 6 N . Однако,

данный способ дает значения весов и стоимостей, экспоненциально завися-

щие от числа предметов, и даже для небольшого числа предметов N = 20

эти значения превышают 107. При этом во многих реальных приложениях ве-

са и стоимости относительно небольшие. Таким образом, проверить данным

тестом ожидаемую производительность какого-либо алгоритма на данных,

приближенных к реальным, невозможно.

В данной главе предлагается подход к генерации входных данных для

задачи о рюкзаке (далее — тестов) при условии ограничений на максималь-

ный вес и стоимость предмета. Данный подход основан на разработке и при-

менении генетического алгоритма. Экспериментальное исследование данного

подхода производится на основе алгоритмов, описанных в разделе 2.2. Прово-

дится сравнение с известными способами построения случайных тестов, опи-

санными в работе [37], краткое описание которых приведено в разделе 2.3.

Генетический алгоритм описан в разделе 2.4. Результаты экспериментально-

го исследования указаны в разделе 2.5.

2.2. Алгоритмы решения задачи о рюкзаке

В данном разделе описываются алгоритмы решения задаче о рюкзаке,

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

первого алгоритма было решено выбрать простой алгоритм перебора с воз-

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

Page 57: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

57

для краткости будет именоваться SimpleBranch. Второй из рассматрива-

емых алгоритмов, ExpKnap, предложен Дэвидом Писингером [37]. Третий

алгоритм — частичная реализация второго, в которой отсутствуют некото-

рые эвристики, не влияющие на корректность ответа, но уменьшающие вре-

мя работы. Четвертый алгоритм — HardKnap, также из работы [37]. Пятый

алгоритм — частичная реализация четвертого.

Далее описывается алгоритм SimpleBranch, приводится краткое опи-

сание алгоритмов ExpKnap и HardKnap, а также их частичных реализа-

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

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

2.2.1. Алгоритм SimpleBranch

В данном разделе описан алгоритм SimpleBranch. Алгоритм реализо-

ван автором диссертации, однако он построен на широко известных идеях и,

скорее всего, переизобретался в прошлом много раз независимо различными

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

простейшем алгоритме перебора с возвратом можно использовать несложные

эвристики, существенно улучшающие время работы на случайных данных.

Идеи алгоритма во многом основаны на здравом смысле и состоят в

следующем:

— Отсортируем предметы по невозрастанию отношения стоимости к весу,

как предложено, например, в работе [37]. Это делается с целью как мож-

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

шить верхние оценки на возможную стоимость рюкзака, тем самым

делая отсечение ветвей перебора более эффективным.

— Будем хранить лучшее из полученных решений в отдельной перемен-

ной.

— Перебор организуется следующим образом. Предметы перебираются в

порядке, полученном сортировкой. Для каждого предмета сначала ана-

Page 58: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

58

лизируется ветвь перебора, соответствующая добавлению предмета в

рюкзак, затем — ветвь перебора, соответствующая тому, что предмет в

рюкзак не добавляется.

— Если сумма текущей суммарной стоимости предметов в рюкзаке и стои-

мости всех еще не рассмотренных предметов не превосходит стоимости

лучшего из известных решений, текущая ветвь перебора больше не рас-

сматривается.

— Если сумма текущего суммарного веса предметов в рюкзаке и весов всех

еще не рассмотренных предметов не превышает вместимости рюкзака,

то все оставшиеся предметы добавляются в рюкзак.

Алгоритм может быть реализован как единственная рекурсивная функ-

ция, осуществляющая перебор, и небольшое число вспомогательных функ-

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

функции, является фиксированным, однако число вызовов функции может

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

выбирается число вызовов указанной функции.

2.2.2. Алгоритм ExpKnap

Алгоритм ExpKnap предложен и детально описан в работе [37]. На-

звание алгоритма происходит от реализуемой им идеи расширяющегося яд-

ра (expanding core). Предположим, что предметы отсортированы в порядке

неубывания отношения стоимости к весу. Пусть жадное решение G постро-

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

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

называется разделяющим предметом (break item).

Алгоритм ExpKnap рассматривает решения задачи о рюкзаке в виде

отличий от решения G (набора предметов, которые присутствуют в G, но от-

сутствуют в рассматриваемом решении, и наоборот). Идея алгоритма осно-

вана на том факте, что для большого числа тестов предметы, отличающиеся

Page 59: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

59

от G, сконцентрированы в некоторой небольшой окрестности разделяющего

предмета. Эта окрестность и называется ядром [37]. Проверка всех возмож-

ных решений для небольшого размера ядра может быть осуществлена весьма

быстро. В то же время, определение корректного размера ядра — достаточно

трудная задача. Алгоритм ExpKnap решает ее путем расширения ядра по

мере необходимости.

Частичная реализация алгоритма ExpKnap, использующаяся в данной

работе наряду с полной реализацией, использует простую процедуру расши-

рения ядра — просто добавляет к ядру соседние с ним предметы. Полная

реализация использует более сложную процедуру, которая может менять по-

рядок рассматриваемых предметов при необходимости для ускорения работы

алгоритма. Можно ожидать, что на некоторых тестах частичная реализация

будет работать дольше, чем полная.

Подобно алгоритму SimpleBranch, реализации алгоритма ExpKnap

содержат рекурсивную функцию, в которой производятся практически все

вычисления. Как для полной, так и для частичной реализации алгоритма

ExpKnap значением приспособленности теста является число вызовов ука-

занной функции на этом тесте.

2.2.3. Алгоритм HardKnap

Алгоритм HardKnap предложен и детально описан в работе [37]. Дан-

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

рюкзаке сводится к решению подзадач следующего вида: найти все множе-

ства предметов с индексами от L до R, которые не доминируются никакими

другимим множествами предметов с индексами от L до R. Множество A до-

минирует множество B, если общая стоимость множества A не меньше, чем

общая стоимость множества B, а общий вес множества A не больше, чем

общий вес множества B. Подзадача на интервале [L;R] может быть решена

путем решения подзадач на интервалах [L;M ] и [M + 1;R] и последующего

Page 60: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

60

слияния соответствующих множеств. Для подзадачи верхнего уровня [1;N ]

не требуется находить все множества — достаточно найти множество с мак-

симальной общей стоимостью и общим весом, не превосходящим вместимость

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

множеств в ответах на подзадачи.

Полная реализация алгоритма HardKnap строит верхние оценки на ре-

шения, содержащие каждое из получаемых множеств предметов, и удаляет те

множества, для которых верхняя оценка слишком мала, тем самым уменьшая

число рассматриваемых множеств и снижая время работы. Частичная реа-

лизация алгоритма HardKnap, рассматриваемая в данной работе наряду с

полной, не производит удаление таких множеств. Фактически, она совпадает

с алгоритмом Немхаузера-Ульмана [111].

Значением приспособленности теста для обеих реализаций алгоритма

HardKnap является число слияний множеств при работе на этом тесте (каж-

дое такое слияние выполняется за константное время). Всякий раз, когда по-

строение верхней оценки для множеств и последующая их фильтрация вли-

яют на ход работы алгоритма, число слияний множеств уменьшается. Сле-

довательно, на основании значений приспособленности можно сделать вывод

об эффективности работы этой компоненты полной реализации алгоритма.

2.3. Генерация случайных тестов для задачи о рюкзаке

Существует множество стратегий генерации случайных тестов для за-

дачи о рюкзаке. В данной работе, как и в работе [37], рассмотрены три из

них:

— Некоррелированные тесты. В этих тестах не предусматривается за-

висимости между весами и стоимостями предметов. При генерации те-

стов такого вида предметы генерируются независимо следующим обра-

зом: вес предмета w принимает случайное целое значение в диапазоне от

единицы до максимального веса Wmax, стоимость предмета p принима-

Page 61: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

61

ет случайное целое значение в диапазоне от единицы до максимальной

стоимости Pmax.

— Сильно скоррелированные тесты. Разница между стоимостью и

весом каждого предмета равна небольшому числу d. При генерации

тестов такого вида предметы генерируются независимо следующим об-

разом: вес предмета w принимает случайное целое значение в диапа-

зоне от max(1, 1−d) до min(Wmax, Pmax−d), стоимость предмета равна

p = w + d.

— Сумма подмножеств. В тестах данного вида вес каждого предмета

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

задаче о сумме подмножеств. При генерации тестов такого вида пред-

меты генерируются независимо следующим образом: вес предмета w

принимает случайное целое значение в диапазоне от единицы до значе-

ния min(Wmax, Pmax), стоимость предмета принимает значение p = w.

Следует отметить, что некоррелированные тесты соответствуют общему

случаю — отсутствию каких-либо ограничений на веса и стоимости предметов

(кроме минимальных и максимальных значений). Как и в работе [37], вме-

стимость рюкзака выбирается равной половине суммарной стоимости весов

всех предметов.

2.4. Описание генетического алгоритма

В данном разделе описан способ представления теста для алгоритма ре-

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

эволюционные операторы и некоторые другие настройки генетического алго-

ритма. Используемая функция приспособленности зависит от тестируемого

алгоритма. Функции приспособленности для используемых алгоритмов при-

ведены в соответствующих подразделах раздела 2.2.

Отметим, что в случае эволюционных алгоритмов, в частности генетиче-

ских, выбор некоторых параметров можно обосновать или доказать. Однако

Page 62: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

62

большинство из них подбирается эмпирическим путем: методом проб и

ошибок или на основании опыта и интуиции. В данной и последующих

главах диссертации многие из параметров эволюционных алгоритмов подо-

браны при проведении предварительных экспериментов, целью которых

было определение таких параметров, которые приводят к максимально быст-

рому построению хороших тестов.

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

трех вариациях, соответствующих типам тестов (некоррелированные, сильно

коррелированные, сумма подмножеств), приведенным в разделе 2.3. Процеду-

ра создания новой особи и оператор мутации различаются соответствующим

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

алгоритма остаются неизменными.

Задача о рюкзаке подразумевает существование трех параметров: числа

предметов N , максимального веса предмета Wmax, максимальной стоимости

предмета Pmax. Для сильно коррелированных тестов также используется па-

раметр d. Все эти параметры фиксированы в течение времени работы гене-

тического алгоритма.

Особь генетического алгоритма представляет собой список предметов,

в котором каждый предмет задается своей стоимостью и весом. Как указано

в разделе 2.3, вместимость рюкзака вычисляется как половина суммы весов

всех предметов.

Процедура создания новой особи создает список из N предметов, при-

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

ритму, описанному в разделе 2.3 для соответствующего типа тестов.

Оператор мутации работает следующим образом. Сначала случайным

образом выбирается предмет и производится его мутация в соответствии с

процедурой, изложенной ниже. После этого с вероятностью 1/2 оператор пре-

кращает работу, иначе процесс повторяется. Такой оператор способен вносить

изменения любого размера, но с большой вероятностью выполняет неболь-

Page 63: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

63

шую мутацию. Процедура мутации одного предмета, в зависимости от типа

теста, выполняет следующие действия:

— некоррелированные тесты — прибавляет dw ∼ ⌊N(0, 1) ·Wmax/3⌋ к весу

предмета, прибавляет dp ∼ ⌊N(0, 1) · Pmax/3⌋ к стоимости предмета,

затем приводит получившийся вес к интервалу [1;Wmax] и стоимость к

интервалу [1;Pmax].

— сильно коррелированные тесты — прибавляет dw ∼⌊N(0, 1) ·min(Wmax, Pmax)/3⌋ к весу предмета w, затем приводит

получившийся вес к интервалу [max(1, 1 − d); min(Wmax, Pmax + d)] и

устанавливает стоимость равную w + d.

— тесты вида «сумма подмножеств» — прибавляет dw ∼⌊N(0, 1) ·min(Wmax, Pmax)/3⌋ к весу предмета, затем приводит по-

лучившийся вес к интервалу [1; min(Wmax, Pmax)] и устанавливает

стоимость равную весу.

Оператор мутации применяется с вероятностью 0,1 после применения опера-

тора скрещивания.

Оператор скрещивания является двухточечным оператором скрещива-

ния со сдвигом. Оператор принимает на вход две особи и возвращает также

две особи. Сначала выбирается длина обмена L равновероятно из интервала

[1;N−1]. Затем независимо и равновероятно из интервала [1;N−L] выбира-

ются значения смещения O1 и O2 для первой и второй особи соответственно.

После этого, непрерывные подпоследовательности особей длиной L, начинаю-

щиеся у первой особи с предмета под номером O1 и у второй особи с предмета

под номером O2, меняются местами. Данный оператор проиллюстрирован на

рисунке 2. Оператор скрещивания применяется с вероятностью 1,0.

Стоит отметить, что в случае тестов вида «сумма подмножеств» и сильно

коррелированных тестов операторы скрещивания и мутации всегда порожда-

ют тесты того же типа, что и аргументы этих операторов. Например, резуль-

Page 64: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

64

(7;8) (1;2) (2;3) (5;6) (4;5) (8;9) (9;7) (3;4) (6;7)

(1;2) (3;4) (9;7) (4;5) (2;3) (9;7) (6;7) (8;9) (7;8)

(7;8) (1;2) (2;3) (9;7) (6;7) (8;9) (9;7) (3;4) (6;7)

(1;2) (3;4) (9;7) (4;5) (2;3) (5;6) (4;5) (8;9) (7;8)

Рисунок 2 – Двухточечный оператор скрещивания со сдвигом. Красным

цветом выделены фрагменты особи, подлежащие перестановке, зеленым —

те же фрагменты после перестановки

татом варианта оператора мутации для сильно коррелированного теста, при-

мененного к сильно коррелированному тесту, будет сильно коррелированный

тест. Это означает, что генетический алгоритм, предназначенный, например,

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

порождать сильно коррелированные тесты. Однако, в процессе эволюции мо-

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

лучший из тестов в алгоритме, запущенном на некоррелированных тестах,

может оказаться сильно коррелированным).

Оператор отбора для размножения является вариантом турнирно-

го отбора. Для того, чтобы выбрать одну особь, из популяции выбирается

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

каждой паре производится турнир: с вероятностью 0,9 в турнире побежда-

ет особь с лучшим значением приспособленности. Победившие особи вновь

группируются в пары и процесс продолжается до тех пор, пока не останет-

ся одна особь. Оператор отбора для выживания — элитизм, при котором

выживает 20 % лучших родительских особей.

2.5. Экспериментальное исследование

В данном разделе описывается постановка и результаты эксперименталь-

ного исследования предложенного метода генерации тестов на основе пред-

ложенного генетического алгоритма. Экспериметы проводились на примере

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

Произведено сравнение с методом генерации случайных тестов, при этом вы-

числительный бюджет (число сгенерированных тестов) было одинаковым у

Page 65: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

65

обоих методов. Проведен статистический анализ результатов. Проанализиро-

ваны некоторые сложные тесты, выделен класс потенциально сложных те-

стов, и для этого класса произведен отдельный эксперимент, продемонстри-

ровавший сложность тестов указанного класса.

2.5.1. Постановка экспериментального исследования

В данном экспериментальном исследовании рассматривались три типа

тестов, описанных в разделе 2.3. Для каждого типа тестов и каждого алго-

ритма для решения задачи о рюкзаке, описанного в разделе 2.2, генетический

алгоритм (ГА), описанный в разделе 2.4, сравнивается с методом генерации

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

запуск завершался, когда число вычислений функции приспособленности до-

стигало 500 000. Таким образом, вычислительный бюджет был одинаков как

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

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

запуска.

Размер поколения генетического алгоритма равнялся 50. Параметры за-

дачи о рюкзаке были равны N = 20, Wmax = Pmax = 10000, параметр разницы

для сильно коррелированных тестов равнялся d = 5. Столь малые значения

параметров задач были выбраны для того, чтобы даже самый неэффектив-

ный алгоритм решения задачи о рюкзаке нашел решение на самом сложном

тесте за приемлемое время.

Исходный код для воспроизведения эксперимента доступен на GitHub1.

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

Минимальные, максимальные и средние значения приспособленности

лучших особей, а также их медианы, представлены в таблицах 1–3 для всех

рассмотренных конфигураций.

1https://github.com/mbuzdalov/papers/tree/master/2014-bicta-knapsacks

Page 66: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

66

Для измерения статистической значимости различий результатов для

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

на одинаковых конфигурациях, используется критерий суммы рангов Уил-

коксона, реализованный в системе R [149]. Альтернативная гипотеза устанав-

ливается в значение «greater» в случаях, когда среднее значение результатов

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

второй конфигурации, и в значение «less» в противном случае. Нулевая гипо-

теза отклоняется в случае, когда значение p-value, возвращаемое критерием,

меньше, чем 0,001.

Таблица 1 – Результаты экспериментов — SimpleBranch

Оптимизатор Тип теста min max median mean dev

случайные

некорр. 90882 211530 108851,0 112820,74 17516,91

сильно корр. 773333 881402 804713,0 809474,83 23793,61

сум. подмн. 671104 784717 708195,5 714033,65 27280,72

ГА

некорр. 520685 1048576 1048576,0 984013,90 157357,85

сильно корр. 1048576 1048613 1048576,0 1048584,09 8,77

сум. подмн. 1048576 1048604 1048576,0 1048580,81 6,92

Из результатов, представленных в таблице 1, можно сделать следующие

выводы в отношении алгоритма SimpleBranch:

— Даже простейшие эвристики уменьшают среднее время работы ука-

занного алгоритма. Среднее значение функции приспособленности на

некоррелированных тестах оказывается примерно в 10 раз меньше, чем

в худшем случае.

— Для всех типов тестов генетический алгоритм находит лучшие тесты,

чем генерация случайных тестов. В частности, для сильно коррелиро-

ванных тестов и тестов вида «сумма подмножеств» значения функции

приспособленности близки к максимально возможным.

Page 67: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

67

Таблица 2 – Результаты экспериментов — семейство алгоритмов ExpKnap

Оптимизатор Тип теста min max median mean dev

ExpKnap

случайные

некорр. 393 1269 539,0 583,51 165,13

сильно корр. 62627 156475 76391,5 84656,27 21268,04

сум. подмн. 176555 447333 348194,5 337375,98 64381,87

ГА

некорр. 428298 688129 447746,0 496336,91 81824,28

сильно корр. 428298 512278 429182,0 459105,40 32676,90

сум. подмн. 696321 699041 698881,0 698603,88 419,75

Частичная реализация ExpKnap

случайные

некорр. 492 2223 683,0 724,38 199,72

сильно корр. 63915 164171 80573,5 86059,53 21265,52

сум. подмн. 154812 445699 322171,0 312934,88 77359,58

ГА

некорр. 369226 688129 447746,0 487032,44 72677,54

сильно корр. 428298 541348 485316,0 465577,64 32425,55

сум. подмн. 698369 699009 698881,0 698726,52 260,21

Из результатов, представленных в таблице 2, можно сделать следующие

выводы в отношении алгоритмов семейства ExpKnap:

— Генетический алгоритм строит как минимум вдвое лучшие тесты, чем

случайная генерация тестов.

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

случае.

Из результатов, представленных в таблице 3, можно сделать следующие

выводы в отношении алгоритмов семейства HardKnap:

— Генетический алгоритм строит существенно лучшие тесты, чем случай-

ная генерация тестов, для всех случаев, кроме тестов вида «сумма под-

множеств».

Page 68: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

68

Таблица 3 – Результаты экспериментов — алгоритмы семейства HardKnap

Оптимизатор Тип теста min max median mean dev

HardKnap

случайные

некорр. 771 1252 941,0 963,03 104,89

сильно корр. 13700 14401 13789,0 13811,16 103,32

сум. подмн. 13068 15113 15022,5 14645,37 756,27

ГА

некорр. 3686 11457 8075,5 7892,86 1885,56

сильно корр. 13682 15113 14062,5 14205,19 449,63

сум. подмн. 15113 15113 15113,0 15113,00 0,00

Частичная реализация HardKnap

случайные

некорр. 5660 6970 6230,5 6278,98 333,20

сильно корр. 15054 15074 15054,0 15054,35 2,29

сум. подмн. 15114 15119 15119,0 15118,80 0,94

ГА

некорр. 9859 13790 12318,5 12219,61 699,25

сильно корр. 15060 15114 15114,0 15113,46 5,37

сум. подмн. 15119 15119 15119,0 15119,00 0,00

— Небольшое различие для тестов вида «сумма подмножеств» объясня-

ется тем, что в обоих случаях тесты близки к максимально сложным

для рассматриваемых алгоритмов. В частности, генетический алгоритм

с использованием тестов вида «сумма подмножеств», по-видимому, все-

гда находит самый сложный тест.

2.5.3. Анализ случайных тестов

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

некоррелированные тесты, сгенерированные случайным образом, действи-

тельно очень просты для всех рассмотренных алгоритмов, что подтвержда-

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

Page 69: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

69

случайные тесты, принадлежащие двум другим типам, уже достаточно слож-

ны. Интересно отметить, что для алгоритма SimpleBranch сильно корре-

лированные тесты ощутимо (p-value меньше 2,2 ·10−16, согласно результатам,

полученным R) сложнее, чем тесты типа «сумма подмножеств», в то время

как для остальных алгоритмов сильно коррелированные тесты проще (p-value

меньше 2,2 ·10−16 для ExpKnap, частичной реализации ExpKnap и частич-

ной реализации HardKnap; p-value равно 1,785 · 10−14 для HardKnap).

2.5.4. Сравнение генерации случайных тестов и генетического

алгоритма

Для всех конфигураций (алгоритм решения задачи о рюкзаке и тип те-

ста) проведена оценка статистической значимости различия между резуль-

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

алгоритма. Для всех конфигураций, кроме двух, значение p-value оказалось

меньше 2,2 · 10−16. Для алгоритма HardKnap и сильно коррелированных

тестов, это значение равнялось 1,717 · 10−15. Для частичной реализации ал-

горитма HardKnap и тестов типа «сумма подмножеств», это значение рав-

нялось 0,01209. После применения коррекции Бонферрони [112] все значения

p-value, кроме последнего, не превосходят 10−14, в то время как последнее

значение стало равно 0,37.

Из этого можно сделать вывод, что разработанной генетический алго-

ритм постоянно получает результаты, лучшие, чем генерация случайных те-

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

может быть объяснена тем, что и генетический алгоритм, и генерация случай-

ных тестов с большой вероятностью (а генетический алгоритм — всегда) по-

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

веса и стоимости предметов) значением приспособленности, равным 15 119.

Page 70: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

70

2.5.5. Сравнение частичных и полных решений

В связи с тем, что различным семействам алгоритмов решения задачи

о рюкзаке были назначены различные меры производительности (функции

приспособленности), сравнивать наихудшую производительность алгоритмов

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

частичные и полные реализации алгоритмов сравнить возможно. В данном

разделе, в отличие от остальных разделов данной главы, при проверке стати-

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

Для реализаций алгоритма ExpKnap критерий суммы рангов Уилкок-

сона показал, что частичная и полная реализации статистически разли-

чимы только на случайных некоррелированных тестах (p-value равняется

1,83 · 10−12). Для тестов вида «сумма подмножеств» значения p-value рав-

нялись 0,02643 и 0,01595 для случайных тестов и генетического алгоритма

соответственно. Для сильно коррелированных тестов, сгенерированных гене-

тическим алгоритмом это значение равнялось 0,1346, а для всех остальных

конфигураций значение p-value превышало 0,5. На основании этих резуль-

татов можно сделать вывод, что эвристика, присутствуюшая в полной реа-

лизации и отсутствующая в частичной, улучшает среднее время работы, но

не влияет на наихудшее. В то же время, полная и частичная реализация

алгоритма HardKnap во всех случаях оказались статистически различимы

(значение p-value не превышает 2,2 · 10−16, после коррекции Бонферрони не

превышает 1,32 · 10−15).

2.5.6. Анализ сложных тестов

По причине того, что предложенный генетический алгоритм генерирует

для реализаций алгоритма ExpKnap существенно более сложные тесты, чем

метод случайной генерации тестов, был проведен анализ наиболее сложных

тестов из сгенерированных генетическим алгоритмом.

Page 71: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

71

Наиболее сложным тестом для алгоритма ExpKnap со значением при-

способленности 699041 оказался тест типа «сумма подмножеств». Он состоит

из пяти предметов веса (и стоимости), равного единице, трех предметов веса

34, одного предмета веса 83, двух предметов веса 265, одного предмета веса

335, двух предметов веса 614, одного предмета веса 1696, двух предметов веса

3842, одного предмета веса 5887 и двух предметов максимально возможно-

го веса 10 000. Множество сложных тестов из этой группы содержат много

предметов веса 1 и 10 000, однако никакой конкретной структуры не просле-

живается.

Самый сложный тест для алгоритма ExpKnap среди сильно коррели-

рованных тестов (значение приспособленности 512278) состоял из предметов

всего двух типов: один предмет веса 9596 и стоимости 9601, а также 19 пред-

метов веса 3030 и стоимости 3035. Был проведен небольшой эксперимент для

проверки того, верно ли, что тесты такого вида достаточно сложны. Для каж-

дого алгоритма решения задачи о рюкзаке было проведено по 10 запусков,

состоящих в генерации 100 000 случайных тестов указанного вида. Лучшее

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

алгоритмов: для алгоритма SimpleBranch оно равнялось 1048576, для пол-

ной и частичной реализации алгоритма ExpKnap оно равнялось 541348, для

полной реализации HardKnap — 799 и для частичной — 803. Из указанных

результатов следует, что тесты этого вида весьма сложны, но не являются

самыми сложными, для алгоритмов SimpleBranch и ExpKnap, но очень

просты для алгоритма HardKnap.

Выводы по главе 2

1. Разработан генетический алгоритм, генерирующий сложные тесты для

алгоритмов решения задачи о рюкзаке, являющейся представителем

класса NP-трудных задач.

Page 72: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

72

2. Проведены экспериментальные исследования разработанного генетиче-

ского алгоритма на примере пяти алгоритмов решения задачи о рюк-

заке, три из которых относятся к переборным алгоритмам, а два — к

алгоритмам динамического программирования.

3. Сравнение с существующими методами генерации случайных тестов

(некоррелированные, сильно коррелированные, сумма подмножеств)

показало, что разработанный генетический алгоритм почти во

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

большим уровнем статистической значимости.

4. Случаи, когда генетический алгоритм слабо отличим статистически от

других методов генерации тестов, соответствуют ситуации, когда в обо-

их случаях генерируются тесты, близкие к наиболее сложным.

5. В результате анализа тестов, сгенерированных генетическим алгорит-

мом, обнаружен новый класс тестов, являющийся сложным для рас-

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

6. Результаты, описанные в данной главе, опубликованы в трудах всерос-

сийской научной конференции «Нечеткие системы и мягкие вычисле-

ния» [163] и международной конференции International Conference on

Bio-inspired Computing: Theories and Applications [160].

Page 73: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

73

ГЛАВА 3. МЕТОД ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АЛГОРИТМОВ

РЕШЕНИЯ ГРАФОВЫХ ЗАДАЧ НА ОСНОВЕ

ГЕНЕТИЧЕСКОГО АЛГОРИТМА (НА ПРИМЕРЕ ЗАДАЧИ О

ПОИСКЕ МАКСИМАЛЬНОГО ПОТОКА)

Одним из важнейших классов задач, предлагаемых на олимпиадных за-

дачах по программированию, являются графовые задачи. Для многих графо-

вых задач известны алгоритмы их решения, работающие за полиномиальное

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

графов, например, поиск в ширину или поиск в глубину. Следовательно, для

всех них можно определить одни и те же величины, определяющие их время

работы:

— число посещенных ребер;

— число посещенных вершин;

— число совершенных обходов.

Время работы некоторых алгоритмов решения графовых задач зависит

только от размеров задачи и практически не зависит от структуры входных

данных. К таким алгоритмам принадлежит, например, алгоритм поиска ком-

понент сильной связности. По этой причине генерация тестов, определяющих

неэффективные решения, не составляет труда для указанных алгоритмов.

Для других задач, напротив, существуют алгоритмы, время работы ко-

торых существенно зависит от структуры входных данных. Характерным

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

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

3.1. Задача о поиске максимального потока

Задача о поиске максимального потока в сети является классической

задачей теории графов [6]. Она формулируется следующим образом:

— дан ориентированный граф с V вершинами и E ребрами;

— среди вершин графа выделены исток s и сток t;

Page 74: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

74

— ребру с номером i приписана пропускная способность ci;

— требуется найти максимальный поток — такой набор чисел fi (1 6 i 6

E), что:

– для каждого ребра fi 6 ci;

– для каждой вершины, кроме истока и стока, суммарный поток по

входящим ребрам равен суммарному потоку по исходящим ребрам;

– суммарный поток, выходящий из истока, максимален.

Существует множество решений этой задачи. Перечислим некоторые из

них [6]:

— алгоритм Форда-Фалкерсона [38], время работы — O(V · E · Cmax), где

Cmax — максимальная пропускная способность ребра в сети;

— алгоритм Эдмондса-Карпа [39] — O(V · E2);

— алгоритм Диница [40] — O(V 2·E), O(E√V ) для единичных пропускных

способностей;

— улучшенный алгоритм поиска кратчайших дополняющих путей [41] —

O(V 2 · E);

— алгоритм проталкивания предпотока [113] — O(V 2 ·E);

— алгоритм проталкивания предпотока с правилом «поднять-в-начало» —

O(V 3).

Также часто применяются модификации существующих алгоритмов мето-

дом масштабирования потока, также называемым «поразрядное сокращение

невязок» [41, 42].

При генерации тестов для олимпиадных задач, основанных на задаче о

поиске максимального потока, главную трудность представляет то, что те-

сты, генерируемые случайным образом или согласно шаблонам, редко быва-

ют сложными. Так, для алгоритма Эдмондса-Карпа не составляет особого

труда найти ответ на случайно сгенерированном тесте с 500 вершинами и

10 000 ребрами за доли секунды, хотя из верхней оценки времени работы

Page 75: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

75

следует, что с таким числом вершин и ребер должен существовать тест, на

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

В данной главе показано, что генетический алгоритм способен сгенериро-

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

генераторов тестов, а в некоторых случаях тесты, сгенерированные генети-

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

3.2. Алгоритмы решения задачи о поиске максимального потока

В данном разделе описаны алгоритмы решения задачи о поиске макси-

мального потока, рассматриваемые в настоящей работе.

3.2.1. Алгоритм Форда-Фалкерсона с масштабированием

пропускной способности

Алгоритм Форда-Фалкерсона основан на концепциях остаточной сети

и дополняющего пути. Остаточная сеть — это сеть, построенная на вершинах

исходного графа, в которой каждому ребру eu,v из вершины u в вершину v

исходного графа соответствует два ребра, e+u,v и e−u,v, ведущие соответственно

из вершины u в вершину v и из вершины v в вершину u. Пусть в графе

уже существует поток F , так что через ребро eu,v, обладающее пропускной

способностью cu,v, идет поток fu,v. Тогда в остаточной сети ребро e+u,v имеет

пропускную способность cu,v − fu,v, а ребро e−u,v — пропускную способность

fu,v.

Дополняющий путь — это путь в остаточной сети по ребрам с ненуле-

вой пропускной способностью из вершины-истока в вершину-сток. Теорема

Форда-Фалкерсона [38] гласит, что если для некоторого потока F в остаточ-

ной сети существует дополняющий путь, тогда (и только тогда) поток F не

является максимальным (его можно увеличить вдоль этого дополняющего

пути). Алгоритм Форда-Фалкерсона поддерживает остаточную сеть и на каж-

дой итерации ищет дополняющий путь алгоритмом поиска в глубину. Если

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

Page 76: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

76

поток и остаточная сеть перестраивается соответствующим образом. Если же

такого пути нет, то алгоритм останавливается, так как максимальный поток

построен.

Алгоритм Форда-Фалкерсона в худшем случае работает за псевдополи-

номиальное время для целочисленных пропускных способностей — O(V ·E ·Cmax), где V — число вершин в графе, E — число ребер, Cmax — максималь-

ная пропускная способность ребра, а для вещественнозначных пропускных

способностей может и не завершить работу [114]. Однако, можно использо-

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

некоторой степени двойки 2k и запустить алгоритм Форда-Фалкерсона на

получившемся графе, затем уменьшить k на единицу и продолжить работу

алгоритма, и так далее, пока k > 0. Такая модификация называется «алго-

ритм Форда-Фалкерсона с масштабированием пропускной способности», или

просто «алгоритм Форда-Фалкерсона с масштабированием». Ее время работы

оценивается как O(E2 · log2Cmax).

3.2.2. Алгоритм Эдмондса-Карпа

Алгоритм Форда-Фалкерсона можно модифицировать и другим обра-

зом — вместо произвольных дополняющих путей (получаемых алгоритмом

поиска в глубину) можно конструировать кратчайшие дополняющие пути

(алгоритмом поиска в ширину). Такая модификация называется алгоритмом

Эдмондса-Карпа [39], и оценка на ее время работы составляет O(V · E2).

3.2.3. Алгоритм Эдмондса-Карпа с масштабированием

пропускной способности

Алгоритм Эдмондса-Карпа можно модифицировать аналогично алго-

ритму Форда-Фалкерсона с масштабированием пропускной способности. Ал-

горитм Эдмондса-Карпа с масштабированием пропускной способности (или

просто «с масштабированием») имеет оценку на время работы O(V · E ·log2Cmax).

Page 77: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

77

3.2.4. Алгоритм Диница

Алгоритмы Форда-Фалкерсона и Эдмондса-Карпа находят в остаточной

сети по одному дополняющему пути и затем перестраивают остаточную сеть.

Однако, можно организовать построение сразу нескольких дополняющих пу-

тей одинаковой длины и только потом перестраивать остаточную сеть. Имен-

но так устроен алгоритм Диница [40].

Данный алгоритм выполняется в несколько фаз — на каждой фазе стро-

ится граф кратчайших путей в остаточной сети, затем с помощью нескольких

запусков алгоритма поиска в глубину в этом графе строятся дополняющие

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

ребра с новой пропускной способностью, равной нулю, а также вершины, из

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

Полученный алгоритм имеет оценку на время работы O(V 2 · E).

3.2.5. Неоптимальная реализация алгоритма Диница

Напомним, что данная диссертация посвященая олимпиадным задачам

по программированию. В процессе реализации решений олимпиадных задач,

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

неоптимально реализовать тот или иной алгоритм. Исходя из этого, в данной

главе имеет смысл рассмотреть очевидные варианты неоптимальных реали-

заций того или иного алгоритма поиска максимального потока.

В частности, алгоритм Диница может быть реализован без удаления ре-

бер с нулевой пропускной способностью. Такая реализация имеет оценку на

время работы O(V · E2), такую же, как и у алгоритма Эдмондса-Карпа.

3.2.6. Улучшенный алгоритм поиска кратчайших дополняющих

путей

Улучшенный алгоритм поиска кратчайших дополняющих путей, один

из предложенных в книге Р. Ахуджи и Дж. Орлина [41], подробно описан

Page 78: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

78

А. Караваевым на сайте TopCoder 1, где, помимо описания и доказательства

оценки на время работы (равной O(V 2·E)), дана и практически эффективная

реализация данного алгоритма.

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

нижней оценки расстояния до стока d(i), где i — номер вершины, строить

дополняющие пути инкрементально и увеличивать их только по ребрам, при-

надлежащим кратчайшим путям. Функция нижней оценки расстояния также

пересчитывается инкрементально: при невозможности продолжить дополня-

ющий путь из текущей вершины, нижняя оценка расстояния увеличивается

и происходит возврат на предыдущую вершину.

3.3. Генераторы тестов для задачи о поиске максимального потока

Так как задача о поиске максимального потока является хорошо изучен-

ной задачей, широко используемой на практике, задача о построении теста,

на котором какой-либо алгоритм или семейство алгоритмов работает макси-

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

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

при увеличении числа вершин V и ребер E. В настоящем разделе приведе-

ны некоторые способы построения таких тестов, известные из литературы.

Рассматриваются только способы генерации тестов с целочисленными про-

пускными способностями.

3.3.1. Генерация случайных графов

Если дано максимальное число вершин V , максимальное число ребер E

и максимальная пропускная способность C, возможно построение теста с E

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

интервала [1; V ], конечная вершина из того же интервала, а также целочис-

ленная пропускная способность из интервала [1;C].

1http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlowRevisited

Page 79: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

79

В задаче о поиске максимального потока (в отличие, например, от зада-

чи поиска максимального потока минимальной стоимости, где для каждого

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

ра, ведущие из вершины a в вершину b — «параллельные» ребра — могут

быть объединены, и пропускная способность нового ребра будет равна сумме

пропускных способностей имевшихся ребер. При генерации случайных те-

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

ребер. По этой причине в данной работе отдельно будут рассматриваться те-

сты, в которых множественные параллельные ребра не допускаются. Также

будут рассмотрены тесты, где, помимо указанных, не допускаются и ребра,

соединяющие одну и ту же пару вершин, но направленные в разные стороны.

Время работы алгоритмов на таких тестах, как правило, невелико. В на-

стоящей работе такие тесты рассматриваются исключительно в целях срав-

нения с другими методами генерации тестов.

3.3.2. Генерация ациклических графов

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

стоит в том, чтобы генерировать ациклические графы — добиваться того,

чтобы в ориентированном графе, образующем сеть, отсутствовали циклы.

Одним из способов является фиксирование в качестве истока вершины с но-

мером 1, в качестве стока вершины с номером V и генерация ребер таким

образом, чтобы начальная вершина любого ребра имела строго меньший но-

мер, чем конечная вершина.

Генератор тестов такого вида размещен на сайте [150] под идентифика-

тором ac, авторы кода G. Waissi и J. Setubal. Программа генерирует полные

ациклические графы: граф с V вершинами будет иметь V (V − 1)/2 ребро.

Может быть сгенерировано два вида описаний графа, в которых описания

ребер, выходящих из одной вершины, могут идти в возрастающем или в убы-

вающем порядке относительно номера конечной вершины этих ребер. Данные

Page 80: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

80

описания задают один и тот же граф, но по различным причинам, связанным

с особенностями реализации того или иного алгоритма поиска максимально-

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

алгоритмов.

3.3.3. Генератор транзитных решеток

Генератор транзитных решеток размещен на сайте [150] под идентифи-

катором tg, авторы кода G. Waissi и J. Setubal. Данный генератор создает

прямоугольную сетку размера a× b, где a и b — параметры, в узлах которой

находятся вершины графа. Вершины, соседние в этой сетке по вертикали или

горизонтали, связываются двумя противоположно направленными ребрами

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

исток, которые соединяются парами противоположно направленных ребер со

всеми вершинами, находящимися соответственно на левой и правой границах

сетки.

Пусть даны максимальное число вершин V . В данной работе случайные

тесты данного вида будут генерироваться следующим образом: сначала из

интервала [1; V − 2] случайным образом выбирается целое число a, затем

число b выбирается равным ⌊V/a⌋, затем генерируется тест с параметрами a

и b.

3.3.4. Генератор случайных слоев

Генератор случайных слоев описан в статье Гольдфарба (D. Goldfarb) и

Григориадиса (M. Grigoriadis) [115]. Исходный код генератора доступен на

сайте [150] под идентификатором genrmf.

Данный генератор создает трехмерную структуру из b слоев, каждая из

которых имеет размер a×a вершин, где a и b — параметры. Структура каж-

дого слоя схожа со структурой, создаваемых генератором из раздела 3.3.3.

Пропускные способности всех ребер в пределах одного слоя равна c2 × a2,

где c2 — параметр. Смежные слои соединяются между собой однонаправлен-

Page 81: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

81

ными ребрами — i-ая вершина слоя t соединяется с Pt(i)-ой вершиной слоя

t + 1, где Pt — перестановка чисел от 1 до a2, сгенерированная случайным

образом. Пропускные способности ребер, соединяющих смежные слои, выби-

раются случайно из интервала [c1; c2], где c1 — параметр, такой что c1 6 c2.

Истоком служит левая верхняя вершина первого слоя, стоком — правая ниж-

няя вершина последнего слоя.

Пусть даны максимальное число вершин V , максимальное число ребер

E и максимальная пропускная способность C. В данной работе случайные

тесты данного вида будут генерироваться следующим образом:

— выбирается b случайным образом из интервала [1; min(V, E)];

— выбирается такое максимальное целочисленное значение a, что a2b 6 V

и 3a2b− a(a+ 2b) 6 E;

— если a < 1, то значения a и b выбираются заново;

— c2 = ⌊C/a2⌋, c1 = 1;

— если c2 < 1, то все значения выбираются заново;

— генерируется тест с параметрами a, b, c1, c2.

3.3.5. Генератор Черкасского и Гольдберга

Генератор Черкасского (B. Cherkassky) и Гольдберга (A. Goldberg) досту-

пен на сайте [150] под идентификатором ak. Данный генератор создает тест,

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

стов, генерируемых данным генератором, состоит в том, что число ребер ли-

нейно зависит от числа вершин, таким образом, генерируются разреженные

графы.

3.3.6. Генератор «washington»

Генератор «washington», содержащий несколько генераторов тестов, на-

писанных студентами университета Вашингтона под руководством Андерсо-

на (R. Anderson), доступен на сайте [150] под идентификатором wash. Данный

генератор способен строить 11 видов тестов. Из них в контексте данного ис-

Page 82: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

82

следования представляют интерес тесты с номерами 9 (сложный тест для

алгоритма Диница) и 10 (сложный тест для алгоритма Гольдберга).

Тест 9 представляет собой цепочку из V вершин, в которой первая вер-

шина является истоком, а последняя — стоком. Соседние вершины соединены

ребром с пропускной способностью V . В дополнение к этому, каждая верши-

на, кроме двух последних, соединяется со стоком ребром с единичной про-

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

максимально возможное число фаз работы, равное V .

3.3.7. Тесты Заде

В работе Н. Заде (N. Zadeh) [116] приведен алгоритм построения слож-

ных тестов против алгоритма Эдмондса-Карпа. Тесты данного вида имеют

6N вершин, из которых 4N вершин образуют полный двудольный граф, а

оставшиеся вершины образуют цепочку из истока в сток, которая промежу-

точными ребрами присоединяется к вершинам первой группы. Пример теста

с 18 вершинами (N = 3) показан на рисунке 3.

3.4. Описание разработанного генетического алгоритма

В данном разделе описан способ представления теста для алгоритма за-

дачи о поиске максимального потока в виде особи генетического алгоритма,

используемые эволюционные операторы, функции приспособленности, а так-

же некоторые другие настройки генетического алгоритма.

Предполагается, что задано максимальное число вершин V , максималь-

ное число ребер E и максимальная пропускная способность C. Истоком счи-

тается вершина с номером 1, а стоком — вершина с номером V .

Генетический алгоритм поддерживает генерацию двух видов графов —

произвольные и ациклические, по аналогии со случайными и случайными

ациклическими графами из разделов 3.3.1 и 3.3.2. В первом виде графов для

каждого создаваемого случайным образом ребра вершины, используемые в

Page 83: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

83

Рисунок 3 – Иллюстрация Н. Заде к предлагаемому им виду сложных

тестов. Тест состоит из 6N вершин (на рисунке N = 3). Центральная

группа сформирована двумя столбцами вершин, состоящими из 2N вершин

каждый. Каждая вершина левого столбца соединена с каждой вершиной

правого столбца парой противоположно направленных ребер. Левая группа

из N вершин соединяет исток (самую левую вершину) с центральной

группой, правая группа соединяет с ней сток (самую правую вершину)

качестве начальной и конечной, выбираются случайным образом из интерва-

ла [1; V ]. Во втором виде графов индекс начальной вершины всегда меньше

индекса конечной вершины. В обоих случаях пропускная способность явля-

ется целочисленной и выбирается случайным образом из интервала [1;C].

Особь генетического алгоритма представляет собой список ребер дли-

ной E. Создание новой особи происходит путем создания списка ребер

длиной E, в котором каждое ребро создается случайным образом, как опи-

сано выше.

Page 84: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

84

В данной работе рассматривается два оператора скрещивания: обыч-

ный одноточечный оператор скрещивания (особи обмениваются концами

списков одинаковой длины, выбираемой случайно) и оператор двухточечного

скрещивания со сдвигом, предложенный при генерации тестов для алгорит-

мов решения задачи о рюкзаке в главе 2. Оператор скрещивания выбирается

один раз для каждого запуска.

Оператор мутации заменяет каждое ребро с вероятностью 1/E на слу-

чайно сгенерированное, подобно тому, как это обычно делается в (1 + 1)-

эволюционном алгоритме [99]. Данный оператор применяетя ко всем особям,

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

эксперименты показали, что этот оператор мутации обеспечивает большие

значения функции приспособленности после 100–500 поколений, чем одно-

точечный оператор мутации, а также оператор, заменяющий t > 0 ребер с

вероятностью 2−t.

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

вариант турнирного отбора, что и в главе 2. В качестве оператора отбора

для выживания используется элитизм, при котором выживает 10 % лучших

родительских особей.

В отличие от алгоритмов решения задачи о рюкзаке, рассматриваемые

алгоритмы поиска максимального потока более схожи между собой — они

все представляют собой комбинацию обходов в ширину и в глубину. Так, для

каждого алгоритма можно вычислять следующие величины:

— число посещенных ребер (каждое ребро учитывается столько раз, сколь-

ко раз оно было посещено);

— число посещенных вершин (каждая вершина учитывается столько раз,

сколько раз она была посещена);

— процессорное время (вычисляется время, проведенное текущим потоком

выполнения в пользовательском режиме);

Page 85: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

85

— астрономическое время (вычисляется время, прошедшее по системным

часам).

Кроме того, для алгоритмов Диница и Форда-Фалкерсона с масштабиро-

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

Эдмондса-Карпа, в том числе и с масштабированием — число запусков поис-

ка в ширину. Для улучшенного алгоритма поиска кратчайших дополняющих

путей можно вычислить эквивалентное предыдущим величинам число «воз-

вратов», а для реализаций алгоритма Диница можно дополнительно учиты-

вать число фаз алгоритма.

3.5. Экспериментальное исследование

В данном разделе описывается постановка и результаты эксперименталь-

ного исследования предложенного метода генерации тестов на основе гене-

тического алгоритма. Эксперименты с использованием разработанного гене-

тического алгоритма проводились для шести рассмотренных алгоритмов по-

иска максимального потока. Для каждого из этих алгоритмов рассматрива-

лись все варианты функции приспособленности (шесть для обеих реализаций

алгоритма Диница, пять для всех остальных). В дополнении к этому, рас-

сматривались два варианта оператора скрещивания (одноточечный и двух-

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

ациклический). Итого число различных конфигураций задачи оптимизации

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

Максимальное число вершин V было выбрано равным 100, максимальное

число ребер E = 5 000, максимальная пропускная способность C = 10 000.

Вычислительный бюджет для генетического алгоритма составлял 500 000 вы-

числений функции приспособленности. Размер поколения генетического ал-

горитма был выбран равным 100. Для каждой конфигурации генетического

алгоритма было произведено 25 запусков.

Page 86: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

86

Среди ранее предложенных методов генерации тестов для алгоритмов

решения задачи о поиске максимального потока, генераторы Черкасского и

Гольдберга, Заде и «washington» не используют генераторы случайных чисел,

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

в зависимости от состояния генератора случайных чисел. Для таких генера-

торов, по аналогии с генетическим алгоритмом, производилось 25 запусков

для каждого из алгоритмов поиска максимального потока и для каждого

варианта функции приспособленности. В каждом таком запуске генерирова-

лось 500 000 тестов соответствующего вида с максимальным числом вершин

V = 100, максимальным числом ребер E = 5 000 и максимальной пропускной

способностью C = 10 000, и среди всех таких тестов выбирался тест с мак-

симальным значением выбранной функции приспособленности выбранного

алгоритма. Таким образом, генераторы тестов с элементами случайности бы-

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

В процессе генерации тестов, как с помощью разработанного генетиче-

ского алгоритма, так и с помощью ранее известных генераторов тестов, было

получено 8004 теста. При этом 8000 тестов были построены путем запус-

ка каждой конфигурации разработанного генетического алгоритма, а также

каждого из известных генераторов тестов, использующих случайные числа

в процессе генерации. Общее число таких генераторов, включая различные

конфигурации генетического алгоритма, равнялось 320, и каждый такой гене-

ратор запускался 25 раз. Оставшиеся четыре теста были получены с помощью

четырех генераторов, которые не используют случайные числа в процессе ге-

нерации.

Эксперименты проводились на компьютере с четырьмя процессорами

AMD OpteronTM 6378, каждый из которых обладает 16 ядрами. Для исполь-

зования возможности многоядерного компьютера было проведено распарал-

леливание по задачам — в каждый момент времени на каждом ядре прово-

Page 87: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

87

дились расчеты, приводящие к получению одного из 8 000 тестов. Продолжи-

тельность эксперимента составила порядка недели.

3.5.1. Выбор критерия для анализа результатов, наиболее точно

отражающего время работы

Результаты экспериментов показали, что измерение процессорного вре-

мени работы не дает представления о реальном времени работы, так как зна-

чения процессорного времени, возвращаемого системой, оказались равными

0, 10 или 20 миллисекундам. Указанные значения обусловлены тем, что яд-

ро ОС Linux, используемое на компьютере, где проводились эксперименты,

имело частоту переключения процессов, равную 100 Гц, что соответствует

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

Измерение астрономического времени позволяет получить больше раз-

личных значений, однако по различным причинам, включающим многоза-

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

зическими ядрами процессора и между процессорами, получаемые значения

оказались сильно зашумленными. Возникает необходимость выбрать среди

остальных критериев (значения которых получаются на основе данных о ра-

боте алгоритмов, не подвержены зашумлению и имеют большой диапазон

возможных значений) такой критерий, который максимально коррелирует

со значением астрономического времени. При этом коэффициент пропорцио-

нальности не обязан быть одинаковым для всех рассматриваемых алгоритмов

поиска максимального потока.

Для осуществления указанного выбора были рассчитаны коэффициен-

ты корреляции Пирсона между астрономическим временем работы и всеми

остальными критериями для каждого рассматриваемого алгоритма поиска

максимального потока. Указанные значения приведены в таблице 4.

Исходя из приведенных в таблице 4 данных, наибольшую корреляцию с

астрономическим временем для всех алгоритмов имеет число посещенных ре-

Page 88: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

88

Таблица 4 – Коэффициенты корреляции Пирсона между астрономическим

временем и другими критериями. Условные обозначения: D — алгоритм Ди-

ница, DS — неоптимальная реализация алгоритма Диница, EC — алгоритм

Эдмондса-Карпа, ECS — алгоритм Эдмондса-Карпа с масштабированием,

FFS — алгоритм Форда-Фалкерсона с масштабированием, ISP — улучшенный

алгоритм поиска кратчайших дополняющих путей, procTime — процессорное

время, edgeCount — общее число посещенных ребер, vertexCount — общее чис-

ло посещенных вершин, dfsCount — число запусков алгоритма поиска в глу-

бину, bfsCount — число запусков алгоритма поиска в ширину, retreatCount —

число возвратов (алгоритм ISP), phaseCount — число фаз (алгоритм Диница).

D DS EC ECS FFS ISP

procTime 0,21297 0,23298 0,54402 0,47434 0,89681 0,18645

edgeCount 0,94119 0,96107 0,97425 0,97688 0,98778 0,91901

vertexCount 0,84388 0,86782 0,87892 0,86379 0,91403 0,70379

dfsCount 0,71523 0,76746 — — 0,90319 —

bfsCount — — 0,86080 0,81960 — —

retreatCount — — — — — 0,72674

phaseCount 0,74970 0,72177 — — — —

бер (0,91901–0,98778), а наименьшую — процессорное время (0,18645–0,54402

и лишь для алгоритма Форда-Фалкерсона с масштабированием — 0,89681).

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

порционально числу посещенных ребер. Следовательно, именно число посе-

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

критерия, наиболее точно отражающего время работы алгоритмов поиска

максимального потока.

Page 89: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

89

3.5.2. Лучшие тесты и генераторы для каждого алгоритма поиска

максимального потока

Для каждой конфигурации разработанного генетического алгоритма, а

также для каждой конфигурации каждого генератора тестов с элементами

случайности, было вычислено максимальное и медианное значение числа по-

сещенных ребер среди 25 запусков конфигурации. Для каждого генератора

тестов без элементов случайности использовалось единственное значение чис-

ла посещенных ребер.

Лучшим тестом (максимальным по числу посещенных ребер) для раз-

личных алгоритмов поиска максимального потока оказались:

— для алгоритма Диница — тест, полученный генетическим алгоритмом,

максимизирующим число посещенных ребер, генерирующим тесты про-

тив неоптимальной реализации алгорима Диница с использованием од-

ноточечного оператора скрещивания и ациклических графов (число по-

сещенных ребер — 594 662);

— для неоптимальной реализации алгоритма Диница — тест, полученный

генетическим алгоритмом, максимизирующим число посещенных ре-

бер, генерирующим тесты против неоптимальной реализации алгори-

ма Диница с использованием одноточечного оператора скрещивания и

ациклических графов (число посещенных ребер — 671 867);

— для алгоритма Эдмондса-Карпа — тест, полученный генетическим ал-

горитмом, максимизирующим число посещенных ребер, генерирующим

тесты против алгоритма Эдмондса-Карпа с использованием одноточеч-

ного оператора скрещивания и ациклических графов (число посещен-

ных ребер — 4 613 284);

— для алгоритма Эдмондса-Карпа с масштабированием — тест Заде (чис-

ло посещенных ребер — 4 524 126);

— для алгоритма Форда-Фалкерсона с масштабированием — случайный

ациклический тест (число посещенных ребер — 4 691 777);

Page 90: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

90

— для улучшенного алгоритма поиска кратчайших дополняющих путей —

тест, полученный генетическим алгоритмом, максимизирующим число

посещенных ребер, генерирующим тесты против улучшенного алгорит-

ма поиска кратчайших дополняющих путей с использованием одното-

чечного оператора скрещивания и ациклических графов (число посе-

щенных ребер — 820 538).

Лучшим генератором тестов (максимальным по медианному числу по-

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

оказались:

— для алгоритма Диница — генетический алгоритм, максимизирующий

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

реализации алгорима Диница с использованием одноточечного операто-

ра скрещивания и ациклических графов (медианное число посещенных

ребер — 476 035);

— для неоптимальной реализации алгоритма Диница — генетический ал-

горитм, максимизирующий число посещенных ребер, генерирующий те-

сты против неоптимальной реализации алгорима Диница с использо-

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

(медианное число посещенных ребер — 584 427);

— для алгоритма Эдмондса-Карпа — тест Заде (число посещенных ре-

бер — 4 609 566);

— для алгоритма Эдмондса-Карпа с масштабированием — тест Заде (чис-

ло посещенных ребер — 4 524 126);

— для алгоритма Форда-Фалкерсона с масштабированием — генератор

случайных ациклических тестов с максимизацией числа посещенных

ребер для алгоритма Форда-Фалкерсона с масштабированием (медиан-

ное число посещенных ребер — 4 511 830);

— для улучшенного алгоритма поиска кратчайших дополняющих путей —

генетический алгоритм, максимизирующий число посещенных ребер,

Page 91: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

91

генерирующий тесты против улучшенного алгоритма поиска кратчай-

ших дополняющих путей с использованием одноточечного оператора

скрещивания и ациклических графов (медианное число посещенных ре-

бер — 591 438).

3.5.3. Средняя эффективность генераторов тестов

Для определения эффективности генераторов тестов, усредненной по

рассмотренным алгоритмам поиска максимального потока, предложен сле-

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

рядочиваются по невозрастанию числа посещенных ребер, и тестам присва-

иваются ранги — места, полученные тестами при указанной сортировке (от

единицы до 8 004). Тестам с одинаковым числом посещенных ребер присваи-

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

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

генераторам тестов.

Лучшие десять генераторов тестов приведены ниже со значениями сред-

них рангов (чем меньше средний ранг, тем выше эффективность):

1. 247,9 — генетический алгоритм, максимизирующий число посещенных

ребер, генерирующий тесты против неоптимальной реализации алго-

ритма Диница с использованием одноточечного оператора скрещивания

и ациклических графов;

2. 283,387 — генетический алгоритм, максимизирующий число посещен-

ных ребер, генерирующий тесты против алгоритма Эдмондса-Карпа с

использованием одноточечного оператора скрещивания и ациклических

графов;

3. 347,753 — генетический алгоритм, максимизирующий число посещен-

ных ребер, генерирующий тесты против улучшенного алгоритма поис-

ка кратчайших дополняющих путей с использованием одноточечного

оператора скрещивания и ациклических графов;

Page 92: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

92

4. 405,747 — генетический алгоритм, максимизирующий число посещен-

ных ребер, генерирующий тесты против алгоритма Диница с использо-

ванием одноточечного оператора скрещивания и ациклических графов;

5. 640,05 — генератор случайных ациклических графов, максимизирую-

щий число посещенных вершин при работе улучшенного алгоритма по-

иска кратчайших дополняющих путей;

6. 648,65 — генератор случайных ациклических графов, максимизирую-

щий число посещенных ребер при работе неоптимальной реализации

алгоритма Диница;

7. 692,55 — генетический алгоритм, максимизирующий число посещен-

ных ребер, генерирующий тесты против улучшенного алгоритма поиска

кратчайших дополняющих путей с использованием одноточечного опе-

ратора скрещивания и графов общего вида;

8. 716,27 — генератор случайных ациклических графов, максимизирую-

щий число фаз при работе неоптимальной реализации алгоритма Ди-

ница;

9. 718,36 — генератор случайных ациклических графов, максимизирую-

щий число посещенных ребер при работе алгоритма Диница;

10. 729,247 — генератор случайных ациклических графов, максимизирую-

щий число посещенных вершин при работе алгоритма Диница.

Генератор тестов, не использующие элементы случайности, имеют сле-

дующие ранги:

— генератор Заде — 1 987,3;

— генератор «washington» №9 — 6 237,17;

— генератор Черкасского и Гольдберга — 6 975,33;

— генератор «washington» №10 — 7 003,83.

Лучшие генераторы случайных неациклических графов имеют следую-

щие ранги:

— без дублирования ребер — 2 239,413;

Page 93: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

93

— без дублирования пар вершин — 2 403,597;

— произвольного вида — 4 280,69.

Из изложенного можно сделать вывод, что генетические алгоритмы, мак-

симизирующие число посещенных ребер с использованием одноточечного опе-

ратора скрещивания и ациклических графов дают, в среднем, наилучшие ре-

зультаты по сравнению с другими рассмотренными алгоритмами.

3.5.4. Другие наблюдения

Из анализа результатов экспериментов, помимо вышеизложенного, уда-

лось извлечь следующие данные:

1. Для алгоритма Диница лучший из тестов, сгенерированных не генети-

ческим алгоритмом, имеет число посещенных ребер, равное 180 589, в то

время как лучший из тестов, сгенерированных генетическим алгорит-

мом — 594 662, что более чем в три раза больше. При этом отметим, что

чем больше число посещенных ребер, тем выше эффективность теста.

2. Похожая картина наблюдается и для улучшенного алгоритма поиска

кратчайших дополняющих путей, где соответствующие числа посещен-

ных ребер равны 820 538 и 441 289.

3. Для неоптимальной реализации алгоритма Диница лучший из тестов,

сгенерированных генетическим алгоритмом, имеет число посещенных

ребер, равное 671 867, тест Заде — 558 337, а наилучший тест, не отно-

сящийся к двум указанным классам — 201 038.

4. Наилучшим тестом против алгоритма Эдмондса-Карпа является тест,

сгенерированный генетическим алгоритмом (число посещенных ребер

равно 4 613 284), вторым по эффективности тестом является тест Заде,

разработанный специально против этого алгоритма (число посещенных

ребер равно 4 609 566). Наилучший тест, не относящийся к двум указан-

ным классам, имеет число посещенных ребер, равное 2 269 179.

Page 94: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

94

5. Для алгоритма Эдмондса-Карпа с масштабированием тест Заде почти

в два раза лучше, чем наилучший из остальных тестов (4 524 126 против

2 302 245).

6. Для алгоритма Форда-Фалкерсона с масштабированием лучше всего

себя показали случайные ациклические графы. Лучший из них име-

ет число посещенных ребер, равное 4 691 777. Генетические алгоритмы,

однако, отстают не намного (наибольшее число посещенных ребер —

4 276 511).

Кроме того, отдельно следует отметить неэффективность оптимизации

по времени работы:

— для алгоритма Диница — наилучший тест при оптимизации по астро-

номическому времени дал число посещенных ребер 235 601, по процес-

сорному — 189 839 при абсолютном максимуме 594 662;

— те же величины для неоптимальной реализации алгоритма Диница —

280 710, 210 524 и 671 867;

— те же величины для алгоритма Эдмондса-Карпа — 2 086 433, 1 967 031 и

4 613 284;

— те же величины для алгоритма Эдмондса-Карпа с масштабированием —

1 744 677, 1 787 049 и 4 524 126;

— те же величины для алгоритма Форда-Фалкерсона с масштабировани-

ем — 4 108 867, 3 971 258 и 4 691 777;

— те же величины для улучшенного алгоритма поиска кратчайших допол-

няющих путей — 352 309, 262 657 и 820 538.

Таким образом, для всех алгоритмов поиска максимального потока, кроме

алгоритма Форда-Фалкерсона с масштабированием, оптимизация по време-

ни работы (процессорному или астрономическому) дает более чем в два раза

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

этом, как правило, оптимизация по астрономическому времени приводит к

Page 95: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

95

лучшим результатам по сравнению с оптимизацией по процессорному време-

ни.

Выводы по главе 3

1. Разработан генетический алгоритм, генерирующий сложные тесты для

алгоритмов решения задачи о поиске максимального потока, являющей-

ся представителем класса графовых задач.

2. Проведены экспериментальные исследования разработанного генетиче-

ского алгоритма на примере шести алгоритмов решения задачи о поис-

ке максимального потока, что потребовало около недели на 64-ядерном

компьютере.

3. Сравнение с существующими методами генерации тестов показало, что

для всех алгоритмов поиска максимального потока, кроме основанных

на идее масштабирования пропускной способности, разработанный

генетический алгоритм генерирует в несколько раз лучшие те-

сты, чем указанные методы.

4. Определено, что для различных алгоритмов поиска максимального

потока генерация тестов с помощью разработанного генетического алго-

ритма наиболее эффективна при использовании одной и той же кон-

фигурации (ациклические графы, одноточечное скрещивание, число

посещенных ребер в качестве функции приспособленности).

5. Результаты, описанные в данной главе, опубликованы в трудах меж-

дународной конференции International Conference on Machine Learning

and Applications [159].

Page 96: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

96

ГЛАВА 4. АЛГОРИТМ ВЫБОРА ИЗ НЕСКОЛЬКИХ

ФУНКЦИЙ ПРИСПОСОБЛЕННОСТИ ФУНКЦИИ,

ОПТИМАЛЬНОЙ ПО ВРЕМЕНИ РЕШЕНИЯ ЗАДАЧИ

ОПТИМИЗАЦИИ

При использовании эволюционных алгоритмов для генерации тестов,

определяющих неэффективные решения олимпиадных задач по программи-

рованию, может возникнуть следующая ситуация. Помимо целевой функции

приспособленности, задающей то, что требуется максимизировать (время ра-

боты или объем используемой памяти), существует еще несколько дополни-

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

следует оптимизировать с помощью эволюционного алгоритма, чтобы быст-

рее добиться желаемого результата.

Ярким примером описанной ситуации может служить задача генерации

тестов для алгоритмов поиска максимального потока, описанная в главе 3.

Целевой функцией приспособленности является время работы алгоритма на

тесте, а дополнительными — такие величины, как число посещенных ребер

или число запусков алгоритма поиска в ширину. Экспериментальным путем

автором было выяснено, что из указанных функций наилучшей, с точки зре-

ния качества получаемых тестов, является число посещенных ребер, но это

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

С точки зрения решения задачи оптимизации, использование одного эво-

люционного алгоритма и нескольких функций приспособленности можно рас-

сматривать как использование нескольких алгоритмов оптимизации для ре-

шения одной и той же задачи оптимизации. Проблема выбора алгоритма оп-

тимизации из нескольких алгоритмов не является новой [117], но до недав-

него времени она решалась лишь для алгоритмов комбинаторной оптимиза-

ции [118]. Подход портфолио алгоритмов [119] лишь недавно был применен

для эволюционных алгоритмов [120] и непрерывной оптимизации [121]. К со-

жалению, для указанных подходов не исследовались наихудшие случаи. Бо-

Page 97: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

97

лее того, алгоритмы оптимизации, используемые в портфолио алгоритмов,

оптимизируют одну и ту же функцию, в то время как в задаче, стоящей в

диссертации, эти функции могут быть различными.

Одним из подходов, обеспечивающих гарантированное поведение в худ-

шем случае, является параллельный или квазипараллельный запуск рассмат-

риваемых итеративных алгоритмов оптимизации. Под квазипараллельным

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

итерации каждого из алгоритмов оптимизации по очереди. Работа всех алго-

ритмов прекращается, как только хотя бы один из алгоритмов нашел опти-

мальное (или достаточно хорошее) решение задачи.

Пусть имеется K итеративных алгоритмов оптимизации. Обозначим чис-

ло итераций, требуемых алгоритму G для нахождение оптимального (или

достаточно хорошего) решения задачи, как TG. Тогда общее число итераций

всех алгоритмов T не превысит K ·minG TG. Для рандомизированных алго-

ритмов можно также доказать следующий результат: E(T ) 6 K ·minGE(TG),

где E(X) — математическое ожидание случайной величины X.

Описанный способ имеет один недостаток — он требует, чтобы все K ал-

горитмов оптимизации были одновременно загружены в память. Для боль-

ших K, а также когда каждый из алгоритмов требует больших объемов па-

мяти, указанный способ может оказаться нежизнеспособным. В данной главе

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

оптимизации таким образом, что в любой момент времени в памяти находится

лишь один из них. При этом математическое ожидание времени работы этого

алгоритма не более чем в четыре раза больше, чем при квазипараллельном

запуске.

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

Дано K итеративных алгоритмов оптимизации. Пусть при использова-

нии алгоритма G задача оптимизации решается за XG итераций, где XG —

Page 98: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

98

случайная величина, причем матожидание E(XG) = TG (в случае, когда ма-

тожидания не существует, полагаем TG =∞).

Требуется разработать алгоритм, который может производить последо-

вательно операции только следующего вида: «запустить алгоритм оптимиза-

ции G на j итераций или пока не будет найдено оптимальное решение». При

этом матожидание суммарного числа итераций всех алгоритмов до момента

нахождения решения задачи оптимизации не должно превышать C ·minG TG,

где C — некоторая константа.

4.2. Общий вид и верхняя оценка времени работы алгоритма

выбора критериев оптимизации

Для простоты реализации, анализа и описания разработанный алгоритм

представим в следующем виде. Алгоритм состоит из мета-итераций. В тече-

ние i-ой мета-итерации каждый из алгоритмов оптимизации запускается на

Ai итераций, где Ai — размер мета-итерации.

В дальнейшем будем называть описываемый алгоритм SaRA, от англий-

ского switch-and-restart algorithm. Псевдокод алгоритма приведен на листин-

ге 2.

Положим, что время работы алгоритма SaRA определяется общим чис-

лом итераций используемых им алгоритмов оптимизации. Данное предполо-

жение оправдано в случае, когда итерации используемых алгоритмов опти-

мизации осуществляются за приблизительно одинаковое время.

Докажем следующую теорему.

Теорема 1. Пусть K — число используемых алгоритмов оптимизации, а

G — какой-либо из этих алгоритмов. Пусть PG(x) — вероятность того,

что алгоритм G найдет решение задачи оптимизации на итерации с номе-

ром x. Пусть также Ai — размер i-ой мета-итерации алгоритма SaRA,

а T — матожидание общего числа итераций используемых алгоритмов оп-

тимизации, требуемых для нахождения решения задачи оптимизации. То-

Page 99: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

99

Листинг 2 – Псевдокод общего вида алгоритма выбора критериев оптимиза-

ции

1: function SaRA(X, K)

2: K — число итеративных алгоритмов оптимизации

3: A — список размеров мета-итераций

4: j ← 1 — номер мета-итерации

5: loop

6: for i← 1 . . .K do

7: G← i-ый алгоритм оптимизации

8: Инициализировать алгоритм G

9: for t← 1 . . .Aj do

10: Сделать итерацию алгоритма G

11: if задача оптимизации решена алгоритмом G then

12: return решение задачи

13: end if

14: end for

15: end for

16: j ← j + 1

17: end loop

18: end function

гда верно следующее неравенство:

T 6 K∞∑

y=1

(

Ay

y−1∏

i=1

(

1−Ai∑

j=1

PG(j)

))

.

Доказательство. Для удобства, определим суммы префиксов:

Si =∑

j=1

iAi.

Пусть решение задачи оптимизации найдено на итерации x алгоритма G

в течение мета-итерации с номером y. Тогда общее число итераций всех алго-

Page 100: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

100

ритмов оптимизации, используемых SaRA, предшествующих этой итерации

и включая ее, не превосходит:

D(x, y) 6 Sy−1K +Ay(K − 1) + x 6 SyK.

Вероятность того, что это случится, равна:

EG(x, y) = PG(x)

y−1∏

i=1

(

1−Ai∑

j=1

PG(j)

)

.

Тогда верхняя оценка на T равна

T =∞∑

y=1

Ay∑

x=1

(D(x, y)EG(x, y)) 6

6 K

∞∑

y=1

Sy

Ay∑

x=1

EG(x, y)

=

= K∞∑

y=1

Sy

Ay∑

x=1

PG(x, y)

y−1∏

i=1

(

1−Ai∑

j=1

PG(j)

)

=

= K

∞∑

y=1

Sy

(

y−1∏

i=1

(

1−Ai∑

j=1

PG(j)

))

Ay∑

x=1

PG(x, y)

.

Определим ZG(x) = 1 −Ax∑

i=1

PG(i). Тогда верхняя оценка может быть

переписана следующим образом:

T 6 K∞∑

y=1

(

Sy

(

y−1∏

i=1

ZG(i)

)

(1− ZG(y))

)

=

= K∞∑

y=1

(

Sy

(

y−1∏

i=1

ZG(i)−y∏

i=1

ZG(i)

))

=

= K∞∑

y=1

(

Ay

y−1∏

i=1

ZG(i)

)

=

= K∞∑

y=1

(

Ay

y−1∏

i=1

(

1−Ai∑

j=1

PG(j)

))

,

что и требовалось доказать.

Page 101: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

101

4.3. Алгоритм с экспоненциальной стратегией перезапуска и его

верхняя оценка времени работы

Формулировка теоремы 1 рассматривает наиболее общий вид алгорит-

ма SaRA. Поэтому результатами указанной теоремы трудно пользоваться

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

на практике, требуется ограничить возможные значения Ai. В данном разде-

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

Ai.

Другими словами, будем требовать, чтобы отношение Ai+1/Ai стреми-

лось к некоторой константе α > 1 с ростом i. Для простоты анализа пред-

положим, что Ai = ⌊αi−1⌋. В этом случае A1 = 1 и отношение соседних Ai

стремится к α. Анализ, однако, будет нетрудно обобщить и на выражения

для Ai, имеющие более сложную форму, такие как числа Фибоначчи, для

которых α = (1 +√5)/2.

Докажем следующую теорему.

Теорема 2. Пусть K — число используемых алгоритмов оптимизации.

Пусть G — какой-либо из этих алгоритмов, тогда пусть TG(x) — ма-

тожидание числа итераций алгоритма G до момента нахождения реше-

ния задачи оптимизации. Пусть также Ai = ⌊αi−1⌋ — размер i-ой мета-

итерации алгоритма SaRA, а T — матожидание числа общего числа ите-

раций алгоритмов оптимизации, используемых SaRA, требуемых для на-

хождения решения задачи оптимизации. Тогда верно следующее неравен-

ство:

T 6 Kα2

α− 1TG.

Доказательство. Используя результат теоремы 1 и определение значений

Ai, можно получить следующую верхнюю оценку:

T 6 K∞∑

y=1

⌊αy−1⌋y−1∏

i=1

1−⌊αi−1⌋∑

j=1

PG(j)

.

Page 102: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

102

При игнорировании всех множителей в произведении, кроме последнего,

правая часть не уменьшается:

T 6 K∞∑

y=1

⌊αy−1⌋

1−⌊αy−2⌋∑

j=1

PG(j)

.

Отметим, что даже при y = 1 выражение, содержащее ⌊αy−2⌋, остается

корректным. Для окончания доказательства произведем некоторые преобра-

зования над выражением для верхней оценки:

T 6 K∞∑

y=1

⌊αy−1⌋

1−⌊αy−2⌋∑

j=1

PG(j)

=

= K∞∑

y=1

⌊αy−1⌋∞∑

j=⌊αy−2⌋+1

PG(j)

=

= K

∞∑

y=1

⌊αy−1⌋∞∑

t=y−1

⌊αt⌋∑

j=⌊αt−1⌋+1

PG(j)

=

= K∞∑

y=0

⌊αy⌋∞∑

t=y

⌊αt⌋∑

j=⌊αt−1⌋+1

PG(j)

=

= K

∞∑

t=0

t∑

y=0

⌊αy⌋⌊αt⌋∑

j=⌊αt−1⌋+1

PG(j)

=

= K∞∑

t=0

⌊αt⌋∑

j=⌊αt−1⌋+1

PG(j)

(

t∑

y=0

⌊αy⌋)

6

6 K∞∑

t=0

⌊αt⌋∑

j=⌊αt−1⌋+1

PG(j)

αt+1 − 1

α− 1

<

< Kα2

α− 1

∞∑

t=0

⌊αt⌋∑

j=⌊αt−1⌋+1

PG(j)

αt−1

<

< Kα2

α− 1

∞∑

t=0

⌊αt⌋∑

j=⌊αt−1⌋+1

PG(j)j

=

= Kα2

α− 1

∞∑

j=1

PG(j)j = Kα2

α− 1TG,

Page 103: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

103

что и требовалось доказать.

4.4. Пример входных данных, на которых верхняя оценка времени

работы асимптотически достигается

Теорема 2 дает верхнюю оценку на матожидание времени работы ал-

горитма SaRA. В данном разделе показывается, что эта верхняя оценка в

некотором смысле достижима.

Теорема 3. Для каждого значения α > 1 и произвольного ε > 0 существу-

ет такое K, такая задача оптимизации и такой набор из K алгоритмов

оптимизации, чтоT

T0> K

α2

α− 1(1− ε),

где T — матожидание числа итераций алгоритма SaRA, а T0 — наимень-

шее из матожиданий числа итераций указанных алгоритмов оптимиза-

ции, требуемых для нахождения решений задачи оптимизации.

Доказательство. Рассмотрим некоторые целочисленные K и N . Построим

такую задачу оптимизации, что K-тый алгоритм оптимизации находит реше-

ние этой задачи ровно за T0 = ⌊αN⌋+1, а остальные алгоритмы оптимизации

никогда не находят решения. В этом случае число итераций алгоритма SaRA

равно:

T =

N+1∑

i=1

(

K⌊αi−1⌋)

+ (K − 1)⌊αN+1⌋+ ⌊αN⌋+ 1 =

=

N+2∑

i=1

(

K⌊αi−1⌋)

− ⌊αN+1⌋+ ⌊αN⌋+ 1.

Нижняя оценка на отношение T/T0 может быть получена из нижней

оценки на T и верхней оценки на T0. Последняя может быть получена доста-

точно просто: T0 = ⌊αN⌋ + 1 6 αN + 1. Верхняя оценка на T может быть

получена следующим образом:

T = K

N+2∑

i=1

⌊αi−1⌋ − ⌊αN+1⌋+ ⌊αN⌋+ 1 >

Page 104: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

104

> KN+2∑

i=1

(

αi−1 − 1)

− ⌊αN+1⌋+ ⌊αN⌋+ 1 =

= KαN+2 − 1

α− 1−K(N + 2)− ⌊αN+1⌋+ ⌊αN⌋+ 1 >

> KαN+2 − 1

α− 1−K(N + 2)− αN+1 + αN =

=KαN+2 −K −K(N + 2)(α− 1)− αN(α− 1)2

α− 1>

> KαN+2

α− 1

(

1− 1

K

(

1− 1

α

)2

− K(N + 3)

αN+1

)

.

Используя эти оценки, можно получить следующее:

T

T0> K

α2

α− 1

(

1− 1K

(

1− 1α

)2 − K(N+3)αN+1

1 + 1αN

)

,

где дробь в больших скобках может быть сделана произвольно близкой к

единице путем выбора достаточно больших N и K.

4.5. Оптимальная экспоненциальная стратегия перезапуска

Теоремы 2 и 3 доказывают, что скорость работы алгоритма SaRA с экс-

поненциальной стратегией перезапуска пропорциональна значению

α2

α− 1,

где α — основание экспоненты, задающей размер мета-итераций. Нетрудно

показать, что если α > 1, единственной точкой минимума этого выражения

является α = 2. Это указывает на то, что оптимальной экспоненциальной

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

Ai = 2i−1. Для этого размера верхняя оценка на матожидание числа итераций

алгоритма SaRA равна

4K ·minG

TG,

где TG — матожидание числа итераций, требуемых алгоритму оптимизации

G для нахождения решения поставленной задачи оптимизации.

Page 105: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

105

4.6. О необходимости перезапуска алгоритмов

Описанный алгоритм, имеющий достаточно большую область примени-

мости, используется в данной диссертации для выбора функций приспособ-

ленности в процессе решения задачи оптимизации. Особенностью данной об-

ласти является то, что используемые алгоритмы оптимизации отличаются

лишь в том, какую функцию приспособленности оптимизирует тот или иной

алгоритм, в то время как все остальные свойства являются общими для всех

используемых алгоритмов. Это дает возможность использовать состояние од-

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

данных для другого алгоритма — иными словами, не производить перезапуск

алгоритма при переключении функции приспособленности.

Может ли эта особенность привести к какому-либо улучшению работы

всего алгоритма? Ответ на этот вопрос не является однозначным. В данном

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

сконструированных входных данных алгоритм, не производящий перезапуск

при переключении оптимизируемых величин, работает в K + 1 раз быстрее,

чем алгоритм, производящий перезапуск. Теорема 5, напротив, показывает,

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

не найти решение задачи оптимизации, в отличие от оригинальной версии

алгоритма.

Теорема 4. Рассмотрим такую задачу оптимизации и такой алгоритм

оптимизации G, что алгоритм решает задачу ровно за 2N итераций.

Рассмотрим K алгоритмов оптимизации, идентичных алгоритму G. То-

гда алгоритм SaRA при α = 2 найдет решение задачи оптимизации за

K(2N − 1) + 2N итераций, в то время как тот же алгоритм, но не произ-

водящий перезапуск, найдет решение за 2N итераций.

Доказательство. Алгоритм SaRA, производящий перезапуск, вынужден

произвести N мета-итераций без какого-либо успеха, и решение задачи оп-

Page 106: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

106

тимизации будет найдено лишь на (N + 1)-ой мета-итерации. Тот же алго-

ритм без перезапусков фактически запускает алгоритм G без остановок, что

приведет к нахождению решения на итерации с номером 2N .

Для следующей теоремы необходимо ввести некоторые определения. Рас-

смотрим задачу оптимизации, в которой область определения — битовые

строки длины N . Требуется найти битовую строку, состоящую целиком из

единичных бит. Определим две функции: функция LeadingOnes(x) возвра-

щает длину максимального префикса битовой строки x, состоящего из еди-

ничных бит. Функция ZeroMax(x) возвращает число нулевых бит в битовой

строке x.

Определим две оптимизируемые величины следующим образом:

— Величина O1:

O1(x) =

N if x = 0N ;

N + 1 if x = 1N ;

LeadingOnes(x) иначе.

— Величина O2(x) = ZeroMax(x).

Определим алгоритм RLS (randomized local search) следующим образом:

1. X ← сгенерированная случайным образом битовая строка длиной N .

2. Y ← X.

3. В битовой строке Y инвертируется один случайно выбранный бит.

4. Если f(Y ) > f(X), тогда X ← Y .

5. Перейти к шагу 2.

На основе введенных определений докажем следующую теорему.

Теорема 5. Пусть алгоритм SaRA использует два алгоритма оптими-

зации: алгоритм RLS, оптимизирующий величину O1, и алгоритм RLS,

использующий величину O2. Тогда верно следующее:

Page 107: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

107

— оценка матожидания числа итераций алгоритма SaRA для нахож-

дения решения задачи оптимизации равна O(N2);

— тот же алгоритм, но не производящий перезапуск, для достаточно

больших N в среднем не находит решения задачи оптимизации.

Доказательство. Если какой-либо из рассмотренных алгоритмов оптими-

зации достигает состояния X = 0N , то он останется в этом состоянии до

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

оптимизирующий O1, не может улучшить значение O1 путем однобитовых

мутаций, так как O1(0N) = N , а значение O1 для однобитовых мутантов не

превышает единицы. В случае алгоритма RLS, оптимизирующего O2, значе-

ние 0N уже является точкой глобального оптимума для функции ZeroMax,

что приводит к тем же последствиям.

Это означает, что версия алгоритма SaRA, не производящая переза-

пуск, с большой вероятностью остается в локальном оптимуме, поскольку

функция ZeroMax оптимизируется алгоритмом RLS быстрее, чем функция

LeadingOnes (Θ(N logN) [99] для первой из функций и Θ(N2) [122] для

второй). По этой причине матожидание числа итераций алгоритма без пере-

запусков является бесконечным.

Для доказательства утверждения об алгоритме SaRA с перезапусками, к

сожалению, не удается воспользоваться теоремой 2, потому что матожидание

времени работы алгоритма RLS, оптимизирующего O1, бесконечно. Однако,

вероятность того, что этот алгоритм застрянет в локальном оптимуме, очень

низка: алгоритм может начать работу в точке x = 0N с вероятностью 2−N ,

а также может начать работу в точке x = 10 . . . и в какой-то момент мути-

ровать в 00 . . ., которое может оказаться равным 0N — очень грубая верхняя

оценка на вероятность того, что это случится, равна 0,25/N . Это означает,

что для достаточно больших размеров мета-итерации вероятность того, что

Page 108: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

108

на данной мета-итерации решение задачи оптимизации не будет найдено при

оптимизации величины O1, не превзойдет 0,25/N + 2−N .

В статье [122] доказано, что для любого δ > 0 существует константа c,

такая что вероятность того, что функция LeadingOnes не будет оптими-

зирована алгоритмом RLS за cN2 итераций, не превосходит δ. Зафиксируем

δ = 0,1 и найдем такое m, что 2m−1 < cN2 6 2m. Тогда на каждой мета-

итерации алгоритма SaRA, начиная с итерации с номером m+1, вероятность

того, что решение задачи оптимизации не будет найдено при оптимизации

O1, не превосходит 0,1 + 0,9(

0,25/N + 2−N)

, что при N > 3 не превосхо-

дит 0,2875. Следовательно, матожидание числа итераций алгоритма SaRA

не превосходит:

T 6

∞∑

i=m+1

(

2(

2i − 1)

(1− 0,2875)0,2875i−m−1)

<

< 0,7125∞∑

i=m+1

(

2i+10,2875i−m−1)

=

= 0,7125

∞∑

i=0

(

2m+2+i0,2875i)

=

= 0,7125 · 2m+2∞∑

i=0

0,575i =

=0,7125

1− 0,575· 2m+2 < 14 · 2m−1 < 14cN2,

то есть, O(N2), что и требовалось доказать.

Выводы по главе 4

1. Предложен алгоритм, который использует K итеративных алгоритмов

оптимизации для решения задачи оптимизации. Для алгоритма предло-

жено название SaRA, от англ. switch-and-restart algorithm. Предложен-

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

ла итераций алгоритма G, требуемое для нахождения решения задачи

оптимизации, составляет TG, тогда матожидание общего числа итера-

Page 109: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

109

ций всех алгоритмов, используемых алгоритмом SaRA, не превосходит

4K ·minG TG.

2. Показано, что данная верхняя оценка асимптотически достижима: для

любого ε > 0 существует такая постановка задачи с K алгоритмами, что

матожидание числа итераций алгоритмов, используемых алгоритмом

SaRA, не меньше, чем 4K ·minG TG(1− ε).

3. В настоящей диссертации алгоритм SaRA используется для выбора оп-

тимальной функции приспособленности — используемые им алгоритмы

оптимизации отличаются только функциями приспособленности. Сле-

довательно, возможен такой вариант алгоритма SaRA, который не про-

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

алгоритмами. Показано, что на некоторых задачах версия без переза-

пусков работает лучше версии с перезапусками в K + 1 раз, а на неко-

торых задачах версия без перезапусков может, в отличие от версии с

перезапусками, не найти решения задачи оптимизации.

4. Результаты, описанные в данной главе, опубликованы в трудах все-

российской конференции по проблемам информатики СПИСОК [168]

и международной конференции International Conference on Machine

Learning and Applications [162].

Page 110: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

110

ГЛАВА 5. ТЕХНОЛОГИЯ ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ

ОПРЕДЕЛЕНИЯ НЕЭФФЕКТИВНЫХ РЕШЕНИЙ

ОЛИМПИАДНЫХ ЗАДАЧ ПО ПРОГРАММИРОВАНИЮ НА

ОСНОВЕ ЭВОЛЮЦИОННЫХ АЛГОРИТМОВ

В силу большого разнообразия олимпиадных задач по программирова-

нию, невозможно предложить единый метод или алгоритм генерации тестов

для определения неэффективных решений таких задач. Для некоторых олим-

пиадных задач построение теста, максимизирующего время работы авторско-

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

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

представления теста и с его помощью сгенерировать несколько случайных

тестов. Некоторые олимпиадные задачи основаны на хорошо известных за-

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

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

эффективно сведена к задаче оптимизации вполне определенной функции, в

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

емой функции является труднорешаемой проблемой.

По указанным причинам представляется возможным описать лишь неко-

торую технологию, позволяющую генерировать тесты для определения неэф-

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

эволюционных алгоритмов. Некоторые этапы этой технологии содержат под-

задачи, решаемые человеком для каждой олимпиадной задачи (и, возможно,

каждого решения этой задачи) независимо. Предлагаемая технология состо-

ит из следующих этапов:

1. Выбор неэффективного решения олимпиадной задачи для генерации

тестов (раздел 5.1).

2. Предварительный теоретический анализ задачи генерации тестов для

выбранного решения (раздел 5.2).

Page 111: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

111

3. Построение представления теста для олимпиадной задачи в виде особи

эволюционного алгоритма (раздел 5.3).

4. Генерация случайных тестов (раздел 5.4).

5. Построение оптимизируемых функций (раздел 5.5).

6. Построение оператора мутации (раздел 5.6).

7. Генерация тестов с помощью (1 + 1)-эволюционного алгоритма (раз-

дел 5.7).

8. Построение оператора скрещивания (раздел 5.8).

9. Генерация тестов с помощью генетического алгоритма (раздел 5.9).

10. Генерация тестов с помощью эволюционной стратегии (раздел 5.10).

11. Проверка имеющихся решений олимпиадной задачи на сгенерирован-

ном тесте (раздел 5.11).

12. Выбор подмножества сгенерированных тестов (раздел 5.12).

Схема, описывающая возможные переходы между этапами предлагаемой

технологии, приведена на рисунке 4.

5.1. Выбор неэффективного решения олимпиадной задачи для

генерации тестов

До генерации тестов для определения неэффективных решений олим-

пиадной задачи по программированию, у такой задачи, как правило, уже

существует некоторое условие, позволяющее построить формальную модель

задачи и начать ее решать. В частности, определен формат входных и вы-

ходных данных. Известны также ограничения на входные данные (такие как

максимальный размер входных данных, максимальное число вершин и ребер

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

а также ограничения на время работы и используемую память, хотя эти зна-

чения могут быть лишь предварительными.

Также, как правило, существует определенный набор решений, включая

корректные и некорректные (неверные и неэффективные). В случае, когда

Page 112: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

112

1. Выборнеэффективного

решения олимпиаднойзадачи для генерации

тестов

2. Предварительныйтеоретический анализ

задачи генерации тестовдля выбранного

решения

3. Построениепредставления теста дляолимпиадной задачи в

виде особиэволюционного

алгоритма

4. Генерация случайныхтестов

5. Построениеоптимизируемых

функций

6. Построение операторамутации

7. Генерация тестов спомощью

(1 + 1)-эволюционногоалгоритма

8. Построение оператораскрещивания

9. Генерация тестов спомощью генетического

алгоритма

10. Генерация тестов спомощью эволюционной

стратегии

11. Проверкаимеющихся решений

олимпиадной задачи насгенерированном тесте

12. Выбор подмножествасгенерированных тестов

Начало Конец

{2,3}

{2,3,5,6,8}

Рисунок 4 – Технология генерации тестов для определения неэффективных

решений олимпиадных задач по программированию

задача находится в процессе подготовки к соревнованию, решений участни-

ков еще не существует, однако имеются решения автора (авторов) задачи и

других членов жюри. В случае же, когда задача уже была дана на соревно-

вании и происходит ее доработка, например, для использования ее в архиве

задач с проверяющей системой, могут иметься и решения участников прошед-

Page 113: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

113

ших соревнований. Наконец, если задача уже какое-то время присутствовала

в архиве задач, то могут иметься решения, сданные в проверяющую систему

архива задач.

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

нерировать тесты, представляется естественным разбить решения на классы

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

одном и том же наборе тестов. В этом случае, как правило, достаточно сге-

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

работать и остальные решения из этого же класса.

Решения можно разбить на классы множеством способов. Перечислим

некоторые из способов, релевантных в отношении генерации тестов против

решений:

1. По времени работы. Решения, написанные на одном и том же языке

программирования и работающие на некоторых тестах примерно оди-

наковое время, с большой вероятностью реализуют один и тот же ал-

горитм решения задачи, либо похожие алгоритмы. В частности, если

среди имеющихся тестов имеется один или небольшое число тестов, на

которых несколько решений работает сравнительно долго, в то время

как на остальных тестах эти решения работают быстро, то, скорее всего,

эти решения похожи.

2. По используемой памяти. Идея схожа с разбиением по времени рабо-

ты, однако объем используемой памяти, особенно если он велик, точнее

характеризует используемый решением алгоритм. В олимпиадных зада-

чах, основанных на задачах комбинаторной оптимизации и NP-трудных

задачах, особое внимание следует обращать на решения, использующие

чуть больше, чем 2k байт памяти для некоторого целого k — такое пове-

дение означает, что решение использует структуры данных с размером,

экспоненциально зависящим от какого-либо параметра задачи.

Page 114: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

114

3. По автору решения. Часто решения одного и того же автора (или

команды-участника) представляют собой попытки инкрементального

улучшения реализации одного и того же алгоритма. И если на сорев-

нованиях по программированию формата ICPC команды, как правило,

перестают присылать решения после того, как сдают задачу, то в случае

архивов задач с проверяющей системой участники, помимо успешного

решения задачи, могут стремиться к минимизации максимального вре-

мени работы решения, если тестирующая система дает доступ к такой

информации, а также к минимизации объема кода. В таком случае ге-

нерацию тестов следует начинать с наилучшего из решений данного

автора, успешно прошедших тесты.

4. По используемому алгоритму. Существенным недостатком такого под-

хода является необходимость анализа исходного кода решения, который

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

При наличии доступа к информации о времени работы решений и ис-

пользуемой ими памяти, генерацию тестов следует начинать с решений, име-

ющих наибольшее время работы и/или наибольший объем используемой па-

мяти, не превышающие соответствующие ограничения. Это позволит быстрее

сгенерировать набор тестов против таких решений, определиться с представ-

лением тестов в виде особей эволюционного алгоритма, а также с конкретным

видом и настройками эволюционного алгоритма. В то же время, генерацию

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

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

Для генерации тестов не следует выбирать решения, против которых уже

был сгенерирован тест, демонстрирующий его неэффективность.

После определения неэффективного решения, против которого будут ге-

нерироваться тесты, следует перейти к этапу «Предварительный теоретиче-

ский анализ задачи генерации тестов для выбранного решения» (раздел 5.2).

Если же такого решения найдено не было, следует перейти к завершающе-

Page 115: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

115

му этапу технологии «Выбор подмножества сгенерированных тестов» (раз-

дел 5.12).

5.2. Предварительный теоретический анализ задачи генерации

тестов для выбранного решения

Многие решения олимпиадных задач обладают хорошо выраженной за-

висимостью времени работы и объема используемой памяти от небольшого

числа параметров входных данных. К примеру, решения, целиком основан-

ные на многих (но не всех) алгоритмах на графах обладают таким свойством:

— алгоритм Флойда-Уоршалла поиска кратчайших путей между всеми па-

рами вершин совершает ровно V 3 сложений и сравнений на графе с V

вершинами, заданном матрицей смежности;

— алгоритмы обхода в глубину или ширину просматривают каждое ребро

графа ровно один раз для ориентированных графов и ровно два раза

для неориентированных графов, а каждую вершину посещают ровно

один раз.

Для любого решения указанного вида любой тест с максимально возмож-

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

боты данного решения на тестах данного вида. Следовательно, генерировать

тесты против такого решения с помощью эволюционных алгоритмов не имеет

смысла.

Если для алгоритма возможно получить верхнюю оценку на время рабо-

ты или на объем используемой памяти, не превышающую соответствующих

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

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

также не требуется.

Иными словами, прибегать к генерации тестов с использованием описан-

ных в данной диссертации методов целесообразно только тогда, когда есть ос-

нования полагать, что для рассматриваемого решения существует тест, при-

Page 116: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

116

водящий к превышениям ограничений на время работы или объем исполь-

зуемой памяти, но такой тест еще не был найден. В этом случае следует

переходить к этапу «Построение представления теста для олимпиадной зада-

чи в виде особи эволюционного алгоритма» (раздел 5.3). В противном случае

следует вернуться к этапу «Выбор неэффективного решения олимпиадной

задачи для генерации тестов» (раздел 5.1).

5.3. Построение представления теста для олимпиадной задачи в

виде особи эволюционного алгоритма

Тесты для олимпиадных задач по программированию обычно являются

текстовыми файлами, подаваемыми на вход решению. В тесте может содер-

жаться практически произвольная информация: одна или несколько строк

над некоторым алфавитом, одно или несколько чисел, последовательность

чисел, описание одного или нескольких графов или автоматов, и тому подоб-

ное.

Теоретически, эволюционный алгоритм мог бы работать с тестом непо-

средственно в текстовом представлении. Однако у данного подхода есть су-

щественный недостаток: доля корректных тестов среди случайным образом

сгенерированных текстов (даже при условии ограниченной длины и алфави-

та), как правило, крайне мала. Так, если тест содержит последовательность

чисел и должен начинаться с числа, задающего длину последовательности,

то вероятность того, что случайный префикс теста, состоящий из цифр и

отделенный от остальной части теста пробелом или переводом строки, дей-

ствительно задает количество чисел в оставшейся части теста, будет крайне

низка. По той же причине вероятность сделать корректный тест некоррект-

ным с помощью даже незначительной мутации весьма велика.

Для того, чтобы направить эволюционный поиск в сторону сложных те-

стов, придется сначала направить его в сторону корректных тестов. Если

доля корректных тестов мала, то эволюционный алгоритм будет вынужден

Page 117: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

117

затратить много времени до появления первого корректного теста, а веро-

ятность получения такого корректного теста, который являлся бы лучшим,

чем текущие, с помощью операций мутации и скрещивания и вовсе окажет-

ся ничтожной. С целью преодоления этого недостатка, требуется разработ-

ка представления теста в виде особи эволюционного алгоритма, которое бы

обеспечило значительную (в идеале — стопроцентную) вероятность генерации

корректного теста, а среди корректных тестов — теста, на котором время ра-

боты рассматриваемого решения (или объем используемой им памяти) было

бы велико.

Так, в главах 2 и 3 были рассмотрены достаточно простые представле-

ния тестов для соответствующих задач в виде особи генетического алгоритма:

список предметов (пар чисел, задающих вес и стоимость) для задачи о рюк-

заке (причем вместимость рюкзака определяется как полусумма весов всех

предметов), список ребер с пропускными способностями для задачи о по-

иске максимального потока. Указанные представления удовлетворяют всем

ограничениям соответствующих задач по построению, то есть, любой слу-

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

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

представить в виде особи. В случае задачи о рюкзаке, разработанное пред-

ставление жестко фиксирует вместимость рюкзака, однако это было сделано

для увеличения доли сложных тестов, как описано в работе [37].

В большинстве олимпиадных задач по программированию ситуация по-

хожа на случаи, описанные выше. Однако, если в условии задачи на тест на-

ложены нетривиальные ограничения (одним из самых часто встречающихся

случаев — требование на существование ответа на задачу для любого теста),

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

корректных тестов (и тем более сложных), сам по себе является нетривиаль-

ной задачей.

Page 118: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

118

После построения представления теста в виде особи эволюционного ал-

горитма следует перейти к этапу «Генерация случайных тестов» (раздел 5.4).

5.4. Генерация случайных тестов

В случае наличия потенциально неэффективных решений олимпиадной

задачи целью генерации тестов против таких решений является не построе-

ние теста, максимизирующего время работы решения, а построение теста, на

котором решение будет работать слишком долго или использовать слишком

много памяти. Часто для этого оказывается достаточным построить боль-

шое число случайных тестов с использованием представления теста, разра-

ботанного на предыдущем этапе (раздел 5.3). По этой причине перед тем,

как осуществлять дальнейшие шаги по реализации эволюционного алгорит-

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

тестов не решает поставленную задачу.

Кроме описанного выше, генерация случайных тестов проверяет эффек-

тивность разработанного на предыдущем этапе представления. Если оказыва-

ется, что генерируемые тесты недостаточно часто оказываются корректными,

следует вернуться к этапу «Построение представления теста для олимпиад-

ной задачи в виде особи эволюционного алгоритма» (раздел 5.3) и разра-

ботать, если это возможно, более эффективное представление теста. Также

существует вероятность, что по итогам анализа поведения тестируемого ре-

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

ты или объема используемой памяти (этап «Предварительный теоретический

анализ задачи генерации тестов для выбранного решения», раздел 5.2).

В случае, когда в процессе генерации случайных тестов найден тест, на

котором рассматриваемое решение признано неэффективным, следует перей-

ти к этапу «Проверка имеющихся решений олимпиадной задачи на сгенери-

рованном тесте» (раздел 5.11). В противном случае целесообразно проверить

возможность генерации более сложных тестов с помощью эволюционных ал-

Page 119: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

119

горитмов, для чего следует перейти к этапу «Построение оптимизируемых

функций» (раздел 5.5).

5.5. Построение оптимизируемых функций

Как было показано в главе 3, оптимизация непосредственно времени ра-

боты решения (процессорного или астрономического) для получения теста,

максимизирующего это время или делающего его большим, может не приве-

сти к хорошим результатам. Следовательно, встает задача построения опти-

мизируемой функции (или, в случае наличия нескольких кандидатов, опти-

мизируемых функций).

На основании результатов глав 2 и 3, а также опыта подготовки олим-

пиадных задач по программированию, можно выделить несколько способов

построения оптимизируемых функций. Ниже перечислены различные случаи

и соответствующие рекомендации по построению оптимизируемых функций.

1. Рассматривается решение олимпиадной задачи, основанной на хорошо

известной задаче дискретной математики. В данном случае, исходя из

знаний задачи, можно определить перечень функций, оптимизация ко-

торых будет приводить к максимизации времени работы или объема

используемой памяти. Как правило, такие функции могут вычисляться

на основе непосредственно входных данных.

2. Рассматривается решение, использующее хорошо известный алгоритм

дискретной математики. Для таких алгоритмов, как правило, хорошо

известны функции, оптимизация которых будет приводить к максими-

зации времени работы или объема используемой памяти. Значения дан-

ных функций, однако, могут зависеть от входных данных нетривиаль-

ным образом (в том числе, зависящим от рассматриваемого решения),

что отличает данный пункт от предыдущего.

3. Рассматривается решение, по исходному коду которого можно опреде-

лить небольшое число наиболее времязатратных фрагментов кода и/и-

Page 120: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

120

ли наиболее объемных структур данных. В данном случае рекоменду-

ется интегрировать в исходный код решения счетчики, значения кото-

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

а также максимальные размеры структур данных. Значения данных

счетчиков по окончанию работы решения и будут оптимизируемыми

функциями.

4. Рассматривается решение, не обладающее ни одним из вышеперечис-

ленных признаков. В данном случае целесообразно внедрение в реше-

ние счетчиков числа вызовов каждой функции, числа итераций каж-

дого цикла, а также переменных, хранящих максимальные значения

размеров каждой структуры данных. Данные действия возможно осу-

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

(исполняемым файлом, байт-кодом), в зависимости от наличия соответ-

ствующих инструментальных средств и опыта работы с ними.

В результате выполнения указанных рекомендаций, в зависимости от

рассматриваемой олимпиадной задачи и ее решения, может получиться одна

оптимизируемая функция или же несколько функций. Во втором случае все

последующие алгоритмы оптимизации рекомендуется запускать с использо-

ванием всех построенных функций под управлением алгоритма SaRA, изло-

женного в главе 4.

После выполнения данного этапа следует перейти к этапу «Построение

оператора мутации» (раздел 5.6).

5.6. Построение оператора мутации

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

ставления теста в виде особи эволюционного алгоритма (раздел 5.3). Ти-

пичное требование к оператору мутации состоит в том, чтобы, как правило,

выполнялись небольшие мутации (которые, в частности, приводят к неболь-

шим изменениям на уровне теста и, как следствие, к небольшим изменениям

Page 121: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

121

времени работы и объема используемой памяти). Однако желательно, что-

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

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

В области эволюционных вычислений операторы мутации часто реали-

зуют так, чтобы с крайне малой, но отличной от нуля, вероятностью можно

было получить любую наперед заданную особь, что часто приводит к то-

му, что даже простейший эволюционный алгоритм гарантированно находит

оптимальное решение задачи (пусть даже за очень длительное время). Дей-

ствительно, пусть вероятность получения оптимального решения из любо-

го другого решения путем применения оператор мутации не меньше, чем

δ > 0. Тогда математическое ожидание числа итераций, например, (1 + 1)-

эволюционного алгоритма не превзойдет 1/δ, а вероятность того, что число

итераций будет больше, чем 1/δ · t, экспоненциально убывает с ростом t.

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

— для особи, представляющей собой список дискретных объектов:

– одноточечный оператор: замена ровно одного элемента списка на

случайно сгенерированный элемент;

– равномерный оператор: каждый элемент заменяется на случай-

но сгенерированный элемент с вероятностью p/N , где N — длина

списка;

– иерархические варианты перечисленных операторов: вместо заме-

ны элемента производится его небольшое изменение;

— для особи, представляющей собой вектор вещественных чисел:

– одноточечный гауссов оператор: ровно к одному числу из вектора

прибавляется число d ∼ N(0, σ2) для некоторой константы σ;

– равномерный гауссов оператор: ко всем числам прибавляется неза-

висимо выбираемое d ∼ N(0, σ2) для некоторой константы σ;

— для особи, являющейся деревом разбора какой-либо структуры:

Page 122: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

122

– замена случайно выбранного поддерева на случайным образом сге-

нерированное поддерево того же типа;

– обмен местами двух случайно выбранных поддеревьев одного и

того же типа.

После построения оператора мутации следует перейти к этапу «Генера-

ция тестов с помощью (1 + 1)-эволюционного алгоритма» (раздел 5.7).

5.7. Генерация тестов с помощью (1 + 1)-эволюционного алгоритма

Прежде чем переходить к более сложным эволюционным алгоритмам,

для решения задачи генерации тестов против выбранного неэффективного

решения вначале следует применить наиболее простой из них — (1 + 1)-

эволюционный алгоритм [99]. Это связано с тем, что указанный алгоритм ча-

сто может найти достаточно хорошее решение задачи оптимизации, а также

с тем, что для его работы не требуется реализации дополнительных эволюци-

онных операторов или определение параметров эволюционных алгоритмов.

(1 + 1)-эволюционный алгоритм рассмотрен подробно в разделе 1.2.2.

В случае успешной генерации тестов против неэффективного решения

олимпиадной задачи критерий качества особи возвращает значение «исти-

на», если рассматриваемое решение на соответствующем тесте превышает

ограничение либо по времени, либо по памяти. Остальные параметры алго-

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

этапах. Число итераций устанавливается пользователем.

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

работы (1 + 1)-эволюционного алгоритма заранее заданным числом итера-

ций, компенсируя это наблюдением за состоянием алгоритма (например, за

значением функции приспособленности и за максимальным временем рабо-

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

останавливается пользователем в случае, когда в течение достаточно дли-

тельного интервала времени не было получено сложных тестов.

Page 123: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

123

Если оказывается, что генерация тестов с использованием (1 + 1)-

эволюционного алгоритма не дает преимуществ по сравнению с генерацией

случайных тестов, следует вернуться к этапу «Построение оператора мута-

ции» (раздел 5.6) и разработать более эффективный оператор мутации. Если

такой оператор мутации не представляется возможным построить, следует

возвращаться к более ранним этапам технологии («Построение оптимизируе-

мых функций», раздел 5.5, «Построение представления теста для олимпиад-

ной задачи в виде особи эволюционного алгоритма», раздел 5.3, или «Пред-

варительный теоретический анализ задачи генерации тестов для выбранного

решения», раздел 5.2).

В случае, когда в процессе генерации случайных тестов найден тест, на

котором рассматриваемое решение признано неэффективным, следует перей-

ти к этапу «Проверка имеющихся решений олимпиадной задачи на сгенери-

рованном тесте» (раздел 5.11). В противном случае целесообразно проверить

возможность генерации более сложных тестов с помощью генетического ал-

горитма или эволюционной стратегии. Для этого следует перейти к этапу

«Построение оператора скрещивания» (раздел 5.8).

5.8. Построение оператора скрещивания

В качестве более сложных, но и более эффективных эволюционных ал-

горитмов по сравнению с (1 + 1)-эволюционным алгоритмом, рассматрива-

ются генетические алгоритмы и эволюционные стратегии. Отличительной

особенностью генетических алгоритмов является использование оператора

скрещивания, введенного по аналогии с процессом кроссинговера хромосом

в процессе размножения организмов в живой природе. Мотивация использо-

вания оператора скрещивания состоит в том, что с помощью рекомбинации

«хороших» фрагментов генов особей-родителей возможно создание особей-

потомков, несущих положительные черты обоих родителей и, следовательно,

более приспособленных.

Page 124: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

124

В качестве примеров оператора скрещивания для особей, представляю-

щих собой списки дискретных объектов, можно привести следующие опера-

торы:

— одноточечное скрещивание: случайным образом выбирается целое чис-

ло L, не превосходящее длины особей-родителей, особи-потомки полу-

чаются из особей-родителей путем обмена префиксами длиной L;

— двухточечное скрещивание: случайным образом выбирается два целых

числа L1 и L2, такие что их сумма не превосходит длины особей-

родителей, затем особи-потомки получаются из особей-родителей путем

обмена префиксами длиной L1 и суффиксами длиной L2;

— двухточечное скрещивание со сдвигом, описанное в главе 2;

— однородное скрещивание: особи-потомки создаются как копии особей-

родителей, затем на каждой позиции списка обмен элементами между

особями-потомками происходит с вероятностью 50 %.

Однако, не для любого представления теста в виде особи эволюционного

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

бы подобными свойствами (пусть и с некоторой вероятностью). В случае, ко-

гда оператор скрещивания с указанными свойствами может быть построен,

целесообразно переходить к этапу «Генерация тестов с помощью генетиче-

ского алгоритма» (раздел 5.9).

В качестве альтернативы генетическим алгоритмам можно рассматри-

вать использование эволюционных стратегий — алгоритмов, не использую-

щих оператор скрещивания. Взамен этого, эволюционные стратегии исполь-

зуют различные методы настройки собственных параметров в процессе ра-

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

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

ным причинам, при невозможности построения оператора скрещивания сле-

дует перейти к этапу «Генерация тестов с помощью эволюционной стратегии»

(раздел 5.10).

Page 125: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

125

5.9. Генерация тестов с помощью генетического алгоритма

В классическом понимании, генетический алгоритм состоит из следую-

щих компонентов:

— генератор случайных особей;

— функция приспособленности;

— оператор скрещивания;

— оператор мутации;

— оператор отбора для размножения;

— оператор отбора для выживания;

— критерий останова алгоритма.

Вначале с помощью генератора случайных особей создается популяция

генетического алгоритма, затем каждая созданная особь оценивается с по-

мощью функции приспособленности. Каждая итерация генетического алго-

ритма происходит следующим образом. Вначале создается набор особей с

помощью оператора отбора для размножения. Затем над особями этого набо-

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

оцениваются функцией приспособленности. Над этими особями, а также над

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

ния, в результате чего получается новая популяция.

В предыдущих этапах было произведено построение всех компонентов,

кроме операторов отбора для размножения и оператора отбора для выжи-

вания. Указанные операторы отбора являются операциями, в общем случае

независимыми от представления теста и достаточно обобщенными по своей

сути. Выбор данных операторов оставляется на усмотрение пользователя. В

практике автора настоящей диссертации в качестве оператора отбора для

размножения хорошо себя показал турнирный отбор, а в качестве оператора

отбора для выживания — элитизм с процентом лучших особей от пяти до 20

процентов.

Page 126: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

126

Если оказывается, что генерация тестов с использованием генетическо-

го алгоритма не дает преимуществ по сравнению с (1 + 1)-эволюционным

алгоритмом, следует вернуться к этапу «Построение оператора скрещива-

ния» (раздел 5.8) и разработать более эффективный оператор скрещивания

(а, возможно, и вовсе от него отказаться). В случае нескольких неудачных

попыток следует возвращаться к более ранним этапам технологии («Постро-

ение оператора мутации», раздел 5.6, «Построение оптимизируемых функ-

ций», раздел 5.5, «Построение представления теста для олимпиадной задачи

в виде особи эволюционного алгоритма», раздел 5.3, или «Предварительный

теоретический анализ задачи генерации тестов для выбранного решения»,

раздел 5.2).

В случае, когда в процессе генерации случайных тестов найден тест, на

котором рассматриваемое решение признано неэффективным, следует перей-

ти к этапу «Проверка имеющихся решений олимпиадной задачи на сгенериро-

ванном тесте» (раздел 5.11). В противном случае целесообразно производить

изменения параметров генетического алгоритма (например, выбор вероятно-

стей скрещивания и мутации, изменение операторов отбора) до получения

лучшего результата, использовать какой-либо другой вид генетического ал-

горитма или вернуться к более ранним этапам технологии.

5.10. Генерация тестов с помощью эволюционной стратегии

В случае отсутствия оператора скрещивания, который мог бы произ-

водить рекомбинацию особей так, чтобы имелась значительная вероятность

получения особи, сочетающей в себе положительные признаки своих родите-

лей, целесообразно использовать эволюционные стратегии. Среди наиболее

простых эволюционных стратегий можно выделить следующие виды:

— (1 + 1)-эволюционная стратегия;

— (1 + λ) и (1, λ)-эволюционные стратегии;

— (µ+ λ) и (µ, λ)-эволюционные стратегии.

Page 127: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

127

Отличие (1+1)-эволюционной стратегии от (1+1)-эволюционного алго-

ритма состоит в том, что эволюционная стратегия может управлять степенью

мутации в операторе мутации. Если с большой вероятностью оператор мута-

ции генерирует особь, лучшую, чем исходная, то эволюционная стратегия

увеличивает степень мутации с целью изучения большей части пространства

поиска. Если особи, лучшие, чем исходная, получаются редко, то степень му-

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

Эмпирическое «правило одной пятой» состоит в том, что степень мутации

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

чем имеющаяся, особь с вероятностью, приближенно равной 1/5.

В описании эволюционной стратегии вида (µ+λ) или (µ, λ) число µ озна-

чает число особей-родителей, а число λ — число особей-потомков, генериру-

емых из них оператором мутации. В случае знака «+» следующее поколение

строится из лучших особей среди родителей и потомков, а в случае знака

«,» — только из потомков. Эволюционные стратегии со знаком «+» быст-

рее сходятся к оптимуму, но с большей вероятностью это будет локальный

оптимум. В отличие от них, эволюционные стратегии со знаком «,» меньше

подвержены застреванию в локальных оптимумах.

Если оказывается, что генерация тестов с использованием эволюцион-

ных стратегий не дает преимуществ по сравнению с (1 + 1)-эволюционным

алгоритмом, следует вернуться к этапу «Построение оператора скрещива-

ния» (раздел 5.8) и, возможно, попытаться разработать оператор скрещива-

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

попыток следует возвращаться к более ранним этапам технологии («Постро-

ение оператора мутации», раздел 5.6, «Построение оптимизируемых функ-

ций», раздел 5.5, «Построение представления теста для олимпиадной задачи

в виде особи эволюционного алгоритма», раздел 5.3, или «Предварительный

теоретический анализ задачи генерации тестов для выбранного решения»,

раздел 5.2).

Page 128: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

128

В случае, когда в процессе генерации случайных тестов найден тест, на

котором рассматриваемое решение признано неэффективным, следует перей-

ти к этапу «Проверка имеющихся решений олимпиадной задачи на сгенериро-

ванном тесте» (раздел 5.11). В противном случае целесообразно производить

изменения параметров эволюционной стратегии до получения лучшего ре-

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

вернуться к более ранним этапам технологии.

5.11. Проверка имеющихся решений олимпиадной задачи на

сгенерированном тесте

После получения теста, на котором текущее рассматриваемое решение

признано неэффективным, следует протестировать на этом тесте оставшие-

ся решения. На данном этапе проверяется гипотеза о том, что тест, сложный

для одного решения из некоторого класса решений, также является сложным

для остальных решений этого класса. Кроме того, многие из еще не рассмот-

ренных решений также могут превысить ограничения на время работы или

объем используемой памяти на рассматриваемом тесте, что сократит число

решений на следующей итерации генерации тестов.

5.12. Выбор подмножества сгенерированных тестов

После получения тестов против всех имеющихся решений, являющих-

ся неэффективными, целесообразно минимизировать набор тестов с целью

уменьшения общего времени, затрачиваемого на тестирование решений на

этих тестах.

Пусть дано множество тестов T и множество имеющихся решений S.

Для каждого теста t ∈ T известно множество решений Cov(T ) ⊂ S, кото-

рые не проходят этот тест. Требуется построить минимальное по мощности

множество Topt ⊂ T , такое что:

t∈Topt

Cov(t) = S.

Page 129: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

129

Данная задача является частным случаем задачи о минимальном по-

крытии множества. В классической работе [123] показано, что данная задача

является NP-полной. В случае небольшого числа тестов и решений, мини-

мальное множество тестов, удовлетворяющих поставленным условиям, мо-

жет быть найдено вручную. Однако в случае большого числа решений или

тестов известные точные решения задачи неприменимы на практике по при-

чине чрезмерных затрат вычислительных ресурсов. По указанной причине

необходимо применять приближенные методы.

Приведем хорошо известный жадный алгоритм, решающий поставлен-

ную задачу (в терминах задачи минимизации тестов):

1. Пусть множество X — множество выбранных тестов, а множество Z —

множество решений, которые не проходят хотя бы один из этих тестов.

Изначально X,Z = ∅.2. Если Z = S, прекратить работу, при этом решение задачи Topt = X.

3. Выбрать такое t ∈ T , что Cov(t) ∩ (S \ Z) максимально.

4. X = X ∪ {t}, Z = Z ∪ Cov(t), перейти к шагу 2.

Наиболее простая реализация данного алгоритма имеет асимптотиче-

скую оценку на время работы O(|T |2 · |S|). В работе [124] показано, что

данный алгоритм генерирует в худшем случае ответ, превосходящий опти-

мальный в O(log |T |) раз. Однако на практике для многих входных данных

он дает ответ, отличающийся от оптимального не более чем на 10 %, что

является достаточно хорошим результатом с практической точки зрения.

Также данная задача может быть обобщена на взвешенный случай. В

этом варианте каждому тесту сопоставляется ожидаемое время работы ре-

шения на этом тесте, и требуется минимизировать суммарное время работы

при сохранении покрытия тестами всех имеющихся неэффективных решений.

Задача может быть решена приближенно аналогичным жадным алгоритмом,

при этом его результаты также являются удовлетворительными с практиче-

ской точки зрения.

Page 130: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

130

Выводы по главе 5

1. Предложена технология генерации тестов для определения неэффек-

тивных решений олимпиадных задач по программированию с исполь-

зованием эволюционных алгоритмов. Данная технология состоит из

12 этапов, определяющих последовательность действий при генерации

тестов.

2. Предложенная технология уменьшает влияние человеческого фактора

на качество набора тестов в силу того, что чисто эвристический под-

ход к построению тестов заменен использованием стандартной схемы,

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

Page 131: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

131

ГЛАВА 6. ВНЕДРЕНИЕ ПРЕДЛОЖЕННОЙ ТЕХНОЛОГИИ

ПРИ ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ ЗАДАЧИ

«SHIPS. VERSION 2»

В данной главе описывается применение технологии, предложенной в

главе 5, при генерации тестов для задачи «Ships. Version 2». С текстом усло-

вия этой задачи можно ознакомиться на сайте Timus Online Judge [142], где

она размещена под номером 1394 [141].

6.1. Условие задачи

Дано N (2 6 N 6 99) предметов с весами wi, 1 6 wi 6 100. Также

дано M (2 6 M 6 9) рюкзаков с вместимостями cj > 1. Известно, что∑N

i=1wi =∑M

j=1 ci. Требуется поместить все данные предметы в данные рюк-

заки. Гарантируется, что искомое размещение существует. Ограничение по

времени — одна секунда, ограничение по памяти — 64 мегабайта.

Из изложенного следует, что рассматриваемая задача является частным

случаем задачи о мультирюкзаке [37]. В терминах задачи о мультирюкзаке,

дополнительные ограничения состоят в том, что для всех предметов их вес

равен стоимости, и все рюкзаки должны быть заполнены.

В работе [125] показано, что задача разрешимости, соответствующая за-

даче о мультирюкзаке, является NP-полной в сильном смысле (неизвестно,

существует ли решение, время работы которого зависит полиномиально не

только от длины входных данных, но и от значений величин, содержащихся

во входных данных). Авторы доказывают данное утверждение путем сведе-

ния известной NP-полной в сильном смысле задачи 3-Partition к задаче о

мультирюкзаке, причем результирующие экземпляры задачи о мультирюк-

заке обладают теми же свойствами, что и поставленная задача — для всех

предметов их вес равен стоимости, и сумма весов предметов равна сумме

вместимостей рюкзаков.

Page 132: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

132

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

«Ships. Version 2» является NP-трудной задачей. С учетом NP-полноты в

сильном смысле соответствующей задачи разрешимости, а также довольно

больших значений ограничений на число предметов N и рюкзаков M , пред-

ставляется маловероятным, что для данной задачи существует однопоточное

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

память при работе на современных компьютерах с тактовой частотой 2–4 ги-

гагерца. Однако, существует большое число различных эвристических реше-

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

указанных ограничений.

Впервые эта задача была предложена на сборах болгарской команды

школьников, а позже была выложена в архиве задач с проверяющей систе-

мой Timus Online Judge [142] под номером 1115 [151]. Набор тестов, прила-

гаемый к этой задаче, оказался достаточно слабым, и через некоторое время

задача с тем же условием и усиленным набором тестов была выложена под

номером 1394 [141]. Некоторое время после этого тесты, генерируемые против

некоторых из решений, добавлялись в этот набор.

6.2. Применение технологии генерации тестов в 2009 году

В данном разделе описывается применение разработанной технологии

генерации тестов, описанной в главе 5, к генерации тестов для определения

неэффективных решений задачи «Ships. Version 2». В частности, приведе-

но пошаговое описание применения этапов технологии к четырем решениям

указанной задачи. Стоит отметить, что непосредственного доступа ко всем

решениям задачи у автора диссертации не было — решения высылались по

электронной почте по запросу администратору архива задач.

По состоянию на 15 июня 2009 года, в наборе присутствовало 47 тестов,

из 3100 посланных на проверку решений было принято 260. Разработанная

технология применялась в июне 2009 года. Применение технологии в данной

Page 133: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

133

главе описывается на примере первых четырех решений рассматриваемой за-

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

идентификаторы (в порядке описания) 2 558 302, 2 208 365, 2 072 705, 1 700 736.

6.2.1. Решение 2 558 302

По первому запросу администратору архива задач были получены реше-

ния с идентификаторами 2 052 162, 2 072 705, 2 208 365, 2 558 302. Первым из

них рассматривалось решение 2 558 302. С исходным кодом решения можно

ознакомиться в приложении в разделе А.1.

Теоретический анализ. Идея рассматриваемого решения состоит в мно-

гократном повторении следующих итераций:

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

2. Изменим случайным образом порядок следования рюкзаков.

3. Для каждого из рюкзаков в порядке следования осуществим следую-

щее:

— заполним с помощью динамического программирования массивы

can и path: can[i] означает, что из неиспользованных предметов

можно набрать вес i, path[i] хранит номер предмета, который, в

случае возможности набора веса i, заведомо принадлежит одному

из возможных решений;

— проверим с помощью массива can для текущего и всех последую-

щих рюкзаков, что каждый из них можно заполнить каким-либо

подмножеством неиспользованных предметов. Если этого сделать

нельзя, переходим к следующей итерации (к шагу 1).

— заполняем текущий рюкзак с использованием массива path, поме-

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

4. Все рюкзаки заполнены, следовательно, задача решена.

Из описанного следует, что рассматриваемое решение на каждой итера-

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

Page 134: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

134

Оценить данную вероятность затруднительно, поскольку она существенным

образом зависит от структуры входных данных, а также от того, как именно

заполняется массив path. Следовательно, имеется возможность того, что су-

ществует тест, на котором вероятность найти ответ на одной итерации мала,

а математическое ожидание времени работы, соответственно, велико.

Построение представления теста. При построении представления теста

в виде особи эволюционного алгоритма для рассматриваемой задачи следует

учитывать то, что проверить условие о существовании ответа не проще, чем

решить саму задачу — причем, как правило, существующие решения этой

задачи на тестах, для которых ответа не существует, работают бесконечно

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

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

Предлагается следующий способ представления теста. Особь эволюци-

онного алгоритма представляет собой последовательность длиной N , состоя-

щую из целых чисел, принадлежащих интервалу [0; 100]. При этом ненулевые

значения соответствуют предметам, а непрерывные подпоследовательности

ненулевых значений — рюкзакам. Данная идея проиллюстрирована на ри-

сунке 5.

0 0 0 010 45 91 17 45

55 91 62

10 45 91 17 45

Рюкзаки:

Предметы:

Рисунок 5 – Представление теста в виде особи эволюционного алгоритма.

На рисунке вторая строка соответствует особи, первая — сгенерированным

из особи предметам, третья — рюкзакам. Тест определяется предметами и

рюкзаками

Page 135: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

135

Любой корректный тест, с учетом возможной перестановки рюкзаков и

предметов, можно представить в виде особи такого вида, при этом существу-

ет особь с длиной, не превосходящей 99 + 8 = 107 (99 предметов и восемь

нулей в качестве разделителей девяти рюкзаков). Существуют особи, соот-

ветствующие некорректным тестам (например, особь, не содержащая нулей),

однако, можно предложить схему генерации особи, такую что корректные

тесты будут появляться достаточно часто.

Предлагается следующий способ генерации случайных особей эволюци-

онного алгоритма длиной N : каждый элемент последовательности генериру-

ется равным нулю с вероятностью 1/5 и случайному целому числу из интер-

вала [1; 100] с вероятностью 4/5. Оценить вероятность генерации корректно-

го теста можно следующим образом. Вероятность p(n,m, k) генерации теста

длиной n с числом предметов m и числом рюкзаков k рассчитывается по

следующей формуле:

p(n,m, k) =

1, если n = 0, m = 0, k = 0;

0, если n = 0 и (m 6= 0 или k 6= 0);

15p(n− 1, m, k) +

n−1∑

t=1

15

(

45

)tp(n− 1− t,m− t, k − 1)+

+(

45

)np(0, m− n, k − 1) в остальных случаях.

Вероятность генерации корректного теста длиной N рассчитывается так:

p(N) =

99∑

m=2

9∑

k=2

p(N,m, k).

В таблице 5 приведены значения p(N) для всех N от 1 до 100. В частно-

сти, при 6 6 N 6 55 вероятность генерации корректного теста превосходит

0,5. Это позволяет утверждать, что разработанное представление теста в виде

особи эволюционного алгоритма является достаточно эффективным.

Генерация случайных тестов. С использованием полученного в преды-

дущем параграфе построения представления теста в виде особи эволюцион-

Page 136: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

136

Таблица 5 – Вероятности появления корректного теста при случайной гене-

рации особи

N p(N) N N p(N) p(N) N p(N) N p(N) N p(N)

1 0,000 2 0,000 3 0,128 4 0,282 5 0,420 6 0,535

7 0,627 8 0,702 9 0,761 10 0,809 11 0,847 12 0,878

13 0,902 14 0,922 15 0,937 16 0,950 17 0,960 18 0,968

19 0,974 20 0,980 21 0,984 22 0,987 23 0,989 24 0,992

25 0,993 26 0,994 27 0,995 28 0,995 29 0,995 30 0,994

31 0,992 32 0,989 33 0,985 34 0,980 35 0,973 36 0,965

37 0,956 38 0,944 39 0,931 40 0,915 41 0,898 42 0,879

43 0,858 44 0,835 45 0,810 46 0,784 47 0,757 48 0,729

49 0,700 50 0,670 51 0,639 52 0,608 53 0,577 54 0,547

55 0,516 56 0,486 57 0,456 58 0,428 59 0,399 60 0,372

61 0,346 62 0,321 63 0,297 64 0,275 65 0,253 66 0,233

67 0,213 68 0,195 69 0,179 70 0,163 71 0,148 72 0,135

73 0,122 74 0,111 75 0,100 76 0,090 77 0,081 78 0,073

79 0,066 80 0,059 81 0,053 82 0,047 83 0,042 84 0,038

85 0,033 86 0,030 87 0,026 88 0,023 89 0,021 90 0,018

91 0,016 92 0,014 93 0,013 94 0,011 95 0,010 96 0,009

97 0,008 98 0,007 99 0,006 100 0,005 101 0,004 102 0,004

103 0,003 104 0,003 105 0,003 106 0,002 107 0,002 108 0,001

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

тимальный размер особи N неизвестен, были проведены эксперименты для

четных значений N из интервала [20; 110]. Для каждого такого значения было

сгенерировано 100 000 случайных тестов. Среднее и максимальное процессор-

ное время работы решения на таких тестах приведено в таблице 6. Исходя из

Page 137: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

137

Таблица 6 – Результаты генерации случайных тестов для решения 2 558 302.

Условные обозначения: N — длина особи, max — максимальное время работы

решения (мс), avg — среднее значение времени работы решения (мс)

N max avg N max avg N max avg N max avg

20 30 0,57 22 40 0,67 24 50 0,77 26 170 0,89

28 160 1,04 30 140 1,15 32 240 1,23 34 260 1,25

36 140 1,17 38 210 1,13 40 50 1,04 42 60 0,95

44 40 0,91 46 40 0,81 48 40 0,74 50 20 0,69

52 30 0,66 54 30 0,60 56 30 0,54 58 20 0,47

60 30 0,40 62 20 0,32 64 20 0,29 66 30 0,24

68 20 0,23 70 20 0,19 72 20 0,16 74 10 0,13

76 20 0,11 78 20 0,09 80 20 0,08 82 20 0,06

84 20 0,05 86 20 0,04 88 20 0,03 90 10 0,03

92 10 0,02 94 20 0,02 96 10 0,01 98 10 0,01

100 10 0,01 102 10 0,01 104 10 0,01 106 10 0,00

108 10 0,00 110 10 0,00 – – – – – –

полученных результатов, оптимальным значением N для данного решения

следует признать 34.

Построение оптимизируемых функций. Исходя из знаний, получен-

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

ко времени работы, можно выделить три оптимизируемые функции:

— число итераций, состоящих в перестановке рюкзаков и предметов и по-

пытке нахождения решения задачи;

— общее число вызовов операции обработки одного рюкзака;

— общее число элементарных действий по работе с массивами.

Page 138: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

138

Априори не представляется возможным определить, какая из этих функ-

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

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

Для того чтобы улучшить работу алгоритмов оптимизации при постро-

ении тестов, зафиксируем начальное состояние генератора случайных чисел,

используемого в решении. При этом, однако, возможно «переобучение» ал-

горитма оптимизации — существует возможность того, что сгенерированный

тест будет сложным только для того начального состояния генератора слу-

чайных чисел, которое было зафиксировано, а для множества других значе-

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

теста будет превышение не оригинального ограничения на время работы (од-

на секунда), а увеличенного ограничения (10 секунд). Кроме того, построен-

ные тесты будут проверяться на оригинальной версии решения.

Построение оператора мутации. В качестве оператора мутации для раз-

работанного ранее представления теста в виде особи эволюционного алгорит-

ма предлагается использовать оператор, аналогичный стандартному опера-

тору для (1+1)-эволюционного алгоритма. С вероятностью 1/N данный опе-

ратор заменяет каждый элемент особи на случайно сгенерированный. Как и в

случае генерации случайной особи, с вероятностью 1/5 генерируется элемент,

равный нулю, а с вероятностью 4/5 — элемент, равный случайному числу из

интервала [1; 100].

Генерация теста с помощью (1 + 1)-эволюционного алгоритма. С

использованием представления теста в виде особи эволюционного алгоритма,

оптимизируемых функций и оператора мутации, разработанных на предыду-

щих этапах технологии, была проведена генерация теста с помощью (1 + 1)-

эволюционного алгоритма. На 53 116 итерации алгоритма был получен тест,

Page 139: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

139

на котором решение 2 558 302 с фиксированным начальным состоянием гене-

ратора случайных чисел работает более 10 секунд.

Было проведено испытание данного теста для решения со случайным

начальным состоянием генератора случайных чисел: решение было запущено

на тесте 50 раз и было измерено время работы. В таблице 7 приведено время

работы на этих запусках. В 32 из 50 случаев время работы превысило одну

секунду, а среднее время работы составило 2,20 секунд, что означает, что

цель генерации теста достигнута.

Таблица 7 – Время работы решения 2558302 на сгенерированном тесте

2,84 3,17 0,62 2,57 2,03 0,40 1,94 0,22 1,09 1,11

4,03 0,32 0,83 5,64 0,51 2,52 0,96 1,73 11,72 3,32

1,99 2,75 2,47 0,68 3,13 1,52 1,16 2,59 0,50 4,12

0,24 4,45 2,49 1,37 0,41 0,51 0,35 0,29 7,65 0,72

0,06 1,41 0,29 1,72 3,20 6,49 1,94 5,51 1,51 0,82

Проверка имеющихся решений на сгенерированном тесте. После

проверки теста на сервере выяснилось, что его не прошло 51 решение из 260,

причем у некоторых участников не устояло ни одно решение.

6.2.2. Решение 2 208 365

С исходным кодом решения можно ознакомиться в разделе А.2.

Теоретический анализ. Данное решение схоже с решением 2 558 302 (раз-

дел 6.2.1). Перечислим отличия в эвристиках, которые приводят к тому, что

решение в среднем работает быстрее, чем решение 2 558 302:

— рюкзаки сортируются в порядке неубывания вместимости;

— порядок рюкзаков фиксирован в течение всех итераций;

— на каждой итерации рюкзаки заполняются, начиная с последнего;

Page 140: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

140

— итерация прерывается не только в случае, когда какой-то из рюкзаков

невозможно заполнить, но и тогда, когда без использования последнего

из оставшихся предметов невозможно заполнить более одного рюкзака.

Аналогично решению 2 558 302, построение верхней оценки на время ра-

боты решения представляется затруднительным. Предлагается исследовать

возможность построения сложных тестах с использованием технологии гене-

рации тестов.

Построение представления теста. Для данного решения будет исполь-

зовано то же представление теста в виде особи эволюционного алгоритма,

что и для решения 2 558 302.

Генерация случайных тестов. Была проведена генерация случайных те-

стов с использованием разработанного представления теста в виде особи эво-

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

рассматриваемого решения размер N должен быть больше, чем для реше-

ния 2 558 302. Были проведены эксперименты для четных значений N из ин-

тервала [20; 110]. Для каждого такого значения было сгенерировано 100 000

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

шения на таких тестах приведено в таблице 8. Максимальное время работы

имеет слишком мало возможных значений (10 или 20 миллисекунд), поэтому

для выбора N целесообразно ориентироваться на среднее время работы. В

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

равное 50.

Построение оптимизируемых функций. Исходя из знаний, получен-

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

ко времени работы, можно выделить три оптимизируемых функции:

Page 141: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

141

Таблица 8 – Результаты генерации случайных тестов для решения 2 208 365.

Условные обозначения: N — длина особи, max — максимальное время работы

решения (мс), avg — среднее значение времени работы решения (мс)

N max avg N max avg N max avg N max avg

20 10 0,41 22 10 0,43 24 20 0,45 26 20 0,49

28 20 0,53 30 20 0,59 32 20 0,59 34 40 0,61

36 20 0,72 38 10 0,71 40 10 0,69 42 10 0,75

44 10 0,74 46 10 0,81 48 10 0,72 50 10 0,78

52 10 0,71 54 10 0,65 56 10 0,63 58 10 0,62

60 10 0,56 62 10 0,53 64 10 0,47 66 10 0,43

68 10 0,40 70 10 0,34 72 10 0,30 74 10 0,26

76 10 0,22 78 10 0,20 80 10 0,15 82 10 0,14

84 10 0,12 86 10 0,11 88 10 0,09 90 10 0,07

92 10 0,06 94 10 0,05 96 10 0,04 98 10 0,03

100 10 0,02 102 10 0,02 104 10 0,02 106 10 0,01

108 10 0,01 110 10 0,00 – – – – – –

— число итераций, состоящих в перестановке предметов и попытке нахож-

дения решения задачи;

— общее число вызовов операции обработки одного рюкзака;

— общее число итераций вложенного цикла в процедуре обработки одно-

го рюкзака (ожидается, что данное число примерно пропорционально

времени работы решения).

Априори не представляется возможным определить, какая из этих функ-

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

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

что и в случае с решением 2 558 302, зафиксируем начальное состояние гене-

Page 142: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

142

ратора случайных чисел в решении при генерации тестов, а также увеличим

ограничение на время работы до 10 секунд.

Построение оператора мутации. Для данного решения будет использо-

ваться тот же оператор мутации, что и для решения 2 558 302.

Генерация теста с помощью (1 + 1)-эволюционного алгоритма. Бы-

ла проведена генерация теста с помощью (1+ 1)-эволюционного алгоритма с

использованием разработанного ранее представления теста в виде особи эво-

люционного алгоритма, оператора мутации, оптимизируемых функций и ал-

горитма выбора функций приспособленности из главы 4. На 97 734 итерации

был сгенерирован тест, время работы рассматриваемого решения на котором

превысило 10 секунд. Оригинальная версия решения, в которой не произ-

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

работает на этом тесте 3,2 секунды. В отличие от решения 2 558 302, время

работы решения оказалось фиксированным, поскольку инициализация гене-

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

Следовательно, задача генерации теста для этого решения выполнена.

Проверка имеющихся решений на сгенерированном тесте. После

проверки теста на сервере выяснилось, что его не прошло 41 решение из 209

решений, прошедших тест для решения 2 558 302.

6.2.3. Решение 2 072 705

С исходным кодом решения можно ознакомиться в разделе А.3.

Теоретический анализ. Данное решение принадлежит принципиально

иному классу решений. В основе решения лежит перебор с отсечениями, ко-

торый построен на основе функции search. Данная функция принимает два

Page 143: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

143

параметра x и y — номер текущего рюкзака и номер текущего рассматрива-

емого предмета. При этом предполагается, что рюкзаки с номерами от 0 до

x− 1 уже заполнены, а соответствующие предметы помечены как принадле-

жащие рюкзакам. Также считается, что для всех предметов с номерами от 0

до y−1 уже было определено, лежат ли они в рюкзаке с номером x. Предме-

ты и рюкзаки предполагаются отсортированными либо по возрастанию, либо

по убыванию весов и вместимостей соответственно.

В глобальной переменной valid, являющейся двумерным массивом бу-

левых значений, хранится информация о том, можно ли в текущем состоянии

перебора, когда заполнено x рюкзаков, набрать с помощью оставшихся пред-

метов вес y. Также хранятся остаточные вместимости каждого из рюкзаков.

Пусть M — число рюкзаков, а N — число предметов. Если значение x

больше, чем M−1, то все рюкзаки заполнены и решение найдено. В этом слу-

чае функция выводит ответ на задачу и возвращает значение 1 (эквивалентно

булевому значению «истина»), что впоследствие приводит к завершению ра-

боты. Если значение y больше, чем N − 1, то текущий рюкзак никогда не

будет заполнен, и функция возвращает значение 0 (эквивалентно булевому

значению «ложь»).

Если текущий рюкзак оказывается заполненным (остаточная вмести-

мость рюкзака равна нулю), перебор переходит на следующий уровень. Вна-

чале для вместимостей, не превосходящих 300, проверяется, можно ли на-

брать такую вместимость, используя предметы, не помещенные ни в один

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

индексом x + 1. Далее для всех рюкзаков, чья остаточная вместимость не

превышает 300, с помощью массива valid проверяется, можно ли набрать

их остаточную вместимость с использованием предметов, не помещенных ни

в один рюкзак. Если это неверно хотя бы для одного рюкзака, значит при

текущем способе заполнения рюкзаков с номерами от 0 до x задача не имеет

решения, и функция возвращает значение 0. В противном случае функция

Page 144: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

144

совершает рекурсивный вызов search(x+1, 0) и возвращает полученное зна-

чение.

Если текущий рюкзак не заполнен, сначала проверяется, можно ли его

заполнить с использованием оставшихся предметов, с использованием значе-

ний valid[0] для большой остаточной вместимости и valid[x] для остаточ-

ной вместимости, не превышающей 300. Если этого сделать нельзя, функция

возвращает значение 0. В противном случае определяется номер предмета y′,

не меньший, чем y, такой что соответствующий предмет может поместить-

ся в рюкзак и при этом не назначен какому-либо другому рюкзаку. Также

определяется предмет с максимальным номером y′′, вес которого совпадает с

весом предмета с номером y′ (по причине того, что предметы отсортированы

по весам, предметы с одинаковыми весами будут формировать непрерывную

подпоследовательность). Вначале предполагается, что в текущий рюкзак не

будет положено ни одного предмета с весом, равным весу предмета с номером

y′, и производится рекурсивный вызов search(x, y′′+ 1). Если данный вызов

вернул значение 1, функция также возвращает значение 1. Далее предпола-

гается, что в текущий рюкзак будет положен предмет y′, поэтому остаточная

вместимость рюкзака с номером x уменьшается на вес этого предмета и про-

изводится рекурсивный вызов search(x, y′ + 1). Если данный вызов вернул

значение 1, функция также возвращает значение 1, иначе остаточная вме-

стимость увеличивается на вес предмета с номером y′ и функция возвращает

значение 0.

Ключевая особенность данного решения состоит в том, что описанный

перебор с возвратом вызывается три раза:

— с предметами, отсортированными по невозрастанию весов, и рюкзака-

ми, отсортированными по неубыванию вместимостей, на не более чем

250 миллисекунд.

Page 145: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

145

— с предметами, отсортированными по неубыванию весов, и рюкзаками,

отсортированными по неубыванию вместимостей, на не более чем 250

миллисекунд.

— с предметами, отсортированными по невозрастанию весов, и рюкзака-

ми, отсортированными по невозрастанию вместимостей, на все остав-

шееся время.

Таким образом, описанное решение можно превратить в множество воз-

можных решений путем варьирования внутренних ограничений по времени,

а также перестановки вызовов местами. При этом тесты, сложные для одно-

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

вида.

С целью генерации тестов против всех возможных решений из указанно-

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

до трех секунд. При успешной генерации теста против такого модифициро-

ванного решения каждое из решений описанного выше вида также не пройдет

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

Построение представления теста. Для данного решения будет исполь-

зовано то же представление теста в виде особи эволюционного алгоритма,

что и для предыдущих решений.

Генерация случайных тестов. Была проведена генерация случайных те-

стов с использованием разработанного представления теста в виде особи эво-

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

N из интервала [20; 110]. Для каждого такого значения было сгенерировано

100 000 случайных тестов. Среднее и максимальное процессорное время ра-

боты решения на таких тестах приведено в таблице 9.

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

3 010 начиная с N = 40. Такое время работы означает, что решению потре-

Page 146: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

146

Таблица 9 – Результаты генерации случайных тестов для решения 2 072 705.

Условные обозначения: N — длина особи, max — максимальное время работы

решения (мс), avg — среднее значение времени работы решения (мс)

N max avg N max avg N max avg N max avg

20 10 0,37 22 10 0,40 24 10 0,44 26 30 0,48

28 50 0,54 30 100 0,61 32 180 0,69 34 740 0,79

36 950 0,98 38 2 800 1,15 40 3 010 1,29 42 3 010 1,69

44 3 010 1,55 46 3 010 1,62 48 3 010 1,83 50 3 010 1,72

52 3 010 1,38 54 3 010 1,30 56 3 010 1,33 58 3 010 1,15

60 3 010 1,01 62 3 010 1,13 64 3 010 0,90 66 3 010 0,81

68 3 010 0,86 70 3 010 0,61 72 3 020 0,63 74 3 010 0,55

76 3 010 0,42 78 3 040 0,52 80 3 120 0,44 82 3 020 0,34

84 3 160 0,44 86 3 020 0,44 88 1 720 0,17 90 3 040 0,29

92 3 060 0,26 94 3 020 0,25 96 3 030 0,20 98 3 070 0,18

100 3 140 0,30 102 3 110 0,19 104 1 310 0,07 106 3 080 0,09

108 3 220 0,06 110 250 0,01 – – – – – –

бовалось перейти с первой фазы (с предметами, отсортированными по невоз-

растанию весов, и рюкзаками, отсортированными по неубыванию вместимо-

стей), длительность которой ограничена тремя секундами, на вторую для

нахождения ответа на тест. Среднее время работы демонстрирует тенденцию

к уменьшению при увеличении N . Однако, это объясняется тем, что вероят-

ность генерации корректного теста с ростом N уменьшается. Максимальное

время работы имеет тенденцию к небольшому увеличению при N ≈ 100, по-

этому был сделан вывод, что для рассматриваемого решения наиболее слож-

ными могут быть тесты с N ≈ 100. Для генерации тестов было выбрано N ,

равное 100.

Page 147: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

147

Построение оптимизируемых функций. Одной из оптимизируемых

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

стов для задачи о рюкзаке, целесообразно сделать число вызовов функции

search. Однако время работы одного вызова этой функции не является по-

стоянной величиной — оно зависит от того, сколько и каких предметов уже

положено в рюкзаки по состоянию на текущий момент времени, кроме того,

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

заведен еще один счетчик операций, который будет увеличиваться на единицу

при каждой итерации цикла, выполняемого после того, как рюкзак оказы-

вается заполненным, а также при каждой итерации циклов, внутри которых

ищутся номера предметов y′ и y′′. Для выбора функций будет использоваться

алгоритм из главы 4.

Построение оператора мутации. Для данного решения будет использо-

ваться тот же оператор мутации, что и для предыдущих решений.

Генерация теста с помощью (1 + 1)-эволюционного алгоритма. Бы-

ла проведена генерация теста с помощью (1 + 1)-эволюционного алгоритма

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

эволюционного алгоритма, оператора мутации, оптимизируемых функций и

алгоритма выбора функций приспособленности из главы 4.

На 27 473 итерации был сгенерирован тест, на котором время работы

каждой фазы рассматриваемого решения превысило три секунды, соответ-

ственно общее время работы решения превысило девять секунд. Оригиналь-

ная версия решения работает на этом тесте как минимум несколько минут.

Следовательно, задача генерации теста для этого решения выполнена.

Page 148: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

148

Проверка имеющихся решений на сгенерированном тесте. После

проверки теста на сервере выяснилось, что его не прошло семь из 168 реше-

ний, прошедших тесты для предыдущих решений.

6.2.4. Решение 1 700 736

С исходным кодом решения можно ознакомиться в разделе А.4.

Теоретический анализ. Схема рассматриваемого решения заключается

в следующем:

1. Рюкзаки сортируются по неубыванию вместимости.

2. На каждой итерации производится попытка заполнения рюкзаков в по-

рядке сортировки.

3. Перед заполнением каждого рюкзака предметы переставляются слу-

чайным образом.

4. Если какой-либо рюкзак заполнить невозможно, текущая итерация пре-

кращается и начинается следующая (переход на шаг 2).

5. Когда все рюкзаки заполнены, решение найдено.

Главное отличие от предыдущих решений, использующих генератор случай-

ных чисел, состоит в том, что перестановка предметов производится не в

начале каждой итерации, а в начале каждой попытки заполнить рюкзак. Ис-

ходя из изложенного, представляется возможным сгенерировать тест против

такого решения по аналогии с предыдущими решениями, использующими ге-

нератор случайных чисел.

Построение представления теста. Для данного решения будет исполь-

зовано то же представление теста в виде особи эволюционного алгоритма,

что и для предыдущих решений.

Генерация случайных тестов. Была проведена генерация случайных те-

стов с использованием разработанного представления теста в виде особи эво-

Page 149: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

149

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

N из интервала [20; 110]. Для каждого такого значения было сгенерировано

100 000 случайных тестов. Среднее и максимальное процессорное время ра-

боты решения на таких тестах приведено в таблице 10. Можно видеть, что на

случайных тестах решение работает очень быстро. Среднее значение времени

работы составляет приблизительно 0,03 миллисекунды на интервале для N

от 36 до 46. Исходя из этих данных, для генерации тестов будет использо-

ваться значение N , равное 42.

Таблица 10 – Результаты генерации случайных тестов для решения 1 700 736.

Условные обозначения: N — длина особи, max — максимальное время работы

решения (мс), avg — среднее значение времени работы решения (мс)

N max avg N max avg N max avg N max avg

20 10 0,018 22 10 0,017 24 10 0,018 26 10 0,019

28 10 0,021 30 10 0,022 32 10 0,023 34 10 0,025

36 10 0,030 38 10 0,029 40 10 0,031 42 10 0,031

44 10 0,031 46 10 0,031 48 10 0,028 50 10 0,027

52 10 0,026 54 10 0,024 56 10 0,024 58 10 0,020

60 10 0,019 62 10 0,018 64 10 0,016 66 10 0,013

68 10 0,011 70 10 0,011 72 10 0,009 74 10 0,007

76 10 0,008 78 10 0,005 80 10 0,005 82 10 0,004

84 10 0,003 86 10 0,003 88 10 0,002 90 10 0,002

92 10 0,001 94 10 0,002 96 10 0,000 98 10 0,001

100 10 0,000 102 10 0,001 104 10 0,001 106 10 0,000

108 10 0,000 110 10 0,000 – – – – – –

Построение оптимизируемых функций. В связи со сложной структу-

рой кода рассматриваемого решения (код разделен на малое число процедур

Page 150: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

150

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

точно сложной) было принято решение сгенерировать функции приспособ-

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

том Н. Кравцовым и описанной в совместной работе [161]. В исходный код

решения было внедрено 33 счетчика, хранящих число вычислений каждой

из функций или процедур, а также число итераций каждого из циклов. Зна-

чение указанных счетчиков в конце работы решения, а также процессорное

время, затраченное решением на тесте, являются значениями приспособлен-

ности. Для работы с ними будет использован алгоритм из главы 4.

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

чисел, начальное состояние генератора случайных чисел рассматриваемого

решения было зафиксировано, а ограничение на время работы было увели-

чено с одной до 10 секунд.

Построение оператора мутации. Для данного решения будет использо-

ваться тот же оператор мутации, что и для предыдущих решений.

Генерация теста с помощью (1 + 1)-эволюционного алгоритма. Бы-

ла произведена попытка генерации теста с помощью (1 + 1)-эволюционного

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

эволюционного алгоритма, оператор мутации и оптимизируемые функции.

Алгоритм проработал в течение 5 000 000 итераций и был остановлен. На луч-

шем из тестов рассмотренное решение работало порядка 4,91 секунды. Одна-

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

чисел) на этом тесте потребовалось всего лишь 0,326 секунды для нахожде-

ния ответа. Это значение существенно больше, чем то, что наблюдалось при

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

задачу генерации теста решенной. По данной причине было принято решение

продолжить генерацию тестов с помощью генетического алгоритма.

Page 151: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

151

Построение оператора скрещивания. Для используемого представле-

ния теста в виде особи эволюционного алгоритма был использован двухто-

чечный оператор скрещивания со сдвигом, аналогичный оператору, исполь-

зуемому в главах 2 и 3, так как рассматриваемая задача является вариантом

задачи о мультирюкзаке, а данный оператор хорошо себя показал при работе

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

приведена на рисунке 6.

7 0 2 5 4 0 9 3 6

1 3 9 0 2 9 6 8 7

7 0 2 9 6 0 9 3 6

1 3 9 0 2 5 4 8 7

Рисунок 6 – Оператор скрещивания, используемый в главе 6. Красным

цветом выделены фрагменты особей, подлежащих перестановке, зеленым —

те же фрагменты после перестановки

Генерация теста с помощью генетического алгоритма. Для генера-

ции теста использовался генетический алгоритм со следующими параметра-

ми:

— число особей в поколении — 100;

— оператор отбора для размножения — турнирный отбор по олимпийской

системе из восьми случайно выбранных особей и вероятностью побе-

ды более приспособленной особи, равной 0,9 (аналогично оператору в

главах 2 и 3);

— оператор отбора для выживания — элитизм с долей элиты 10 %;

— вероятность применения оператора скрещивания — 100 %;

— вероятность применения оператора мутации — 100 %.

Операторы скрещивания и мутации, а также функции приспособленности

разработаны ранее в данном разделе.

На 27966 итерации генетический алгоритм построил тест, на котором

время работы рассматриваемого решения превысило 10 секунд. Оригиналь-

Page 152: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

152

ная версия решения работает на этом тесте 1,726 секунды, что превышает

ограничение по времени.

Для проверки качества теста оригинальная версия решения была моди-

фицирована так, чтобы генератор случайных чисел инициализировался си-

стемным временем. Указанная версия решения была запущена 10 раз с ин-

тервалом минимум в две секунды на сгенерированном тесте. Время работы

данных запусков составило 5,65, 6,41, 8,79, 12,25, 0,10, 1,23, 11,13, 0,35, 3,46,

1,52 секунды соответственно. Таким образом, в восьми из 10 случаях ограни-

чение по времени было превышено, а среднее время работы составило 5,089

секунды. Следовательно, цель генерации теста выполнена.

Проверка имеющихся решений на сгенерированном тесте. По ре-

зультатам проверки имеющихся решений, сгенерированный тест не прошло

36 из 161 решений, прошедших предыдущие тесты.

6.2.5. Выбор подмножества сгенерированных тестов

Всего в распоряжение автора диссертации оказалось 22 решения. Против

них было сгенерировано в общей сложности 28 тестов. По итогам процесса

генерации тестов ни одно имеющееся 260 решений не прошло хотя бы один

из сгенерированных тестов.

Из сгенерированных тестов было отобрано 11 лучших тестов, которые

были добавлены в архив задач и получили номера с 48 по 58. Наиболее слож-

ные в среднем тесты получили меньшие номера. В таблице 11 приведено

время работы некоторых решений на сгенерированных тестах, полученное

на проверяющем сервере. В таблице 12 для каждого теста приведено число

решений, которые прошли предыдущие тесты, но не прошли текущий.

6.3. Применение технологии генерации тестов в 2011 году

В мае 2011 года было проведено повторное применение разработанной

технологии. В этот раз число авторов, решения которых прошли тесты, рав-

Page 153: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

153

Таблица 11 – Время работы некоторых решений на тестах, мс. Отметка TL

означает, что решение превысило ограничение на время работы. Отметка WA

означает, что решение дало неверный ответ.

Номер теста 48 49 50 51 52 53 54 55 56 57 58

937 951 234 234 250 234 218 15 15 15 46 15 TL

1 048 182 156 156 156 156 156 265 TL 125 78 15 328

1 053 557 187 171 187 156 171 31 15 TL 140 15 15

1 243 136 TL 343 TL 687 328 15 15 296 593 15 15

1 289 928 WA WA TL 718 WA 15 15 265 125 15 15

1 290 261 TL 265 TL TL TL 15 15 296 312 15 15

1 322 878 TL TL TL TL TL 15 15 TL 78 15 15

1 328 152 TL TL TL TL TL 140 31 750 TL 15 TL

1 394 345 TL TL TL TL TL 15 15 TL 31 15 46

1 682 998 TL TL TL TL TL 15 15 TL 46 15 453

1 700 721 TL TL 234 TL TL 15 15 125 TL 15 15

1 841 778 TL TL TL 359 TL 15 15 281 109 15 31

2 004 976 TL TL TL TL TL 62 15 TL TL 15 671

2 006 419 TL TL TL TL TL 156 15 TL TL 15 93

2 052 162 TL TL TL TL TL 593 15 TL 156 15 TL

2 072 685 437 312 437 312 312 328 328 328 281 TL 15

2 072 705 390 390 390 375 375 281 281 281 265 TL 15

2 141 473 421 TL 765 TL 296 15 15 171 TL 15 15

2 208 365 TL TL TL TL TL 15 15 TL TL 15 15

2 293 082 TL 1000 TL TL 875 TL TL TL 484 15 218

2 293 085 TL 937 TL TL 812 984 TL TL 375 15 125

2 354 409 TL TL TL TL TL 109 31 TL 78 15 187

2 438 565 TL TL TL 218 TL 15 15 TL 31 15 31

Page 154: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

154

Таблица 12 – Число решений для каждого теста, которые прошли предыду-

щие тесты, но не прошли текущий

Номер теста 48 49 50 51 52 53 54 55 56 57 58

Число решений 217 15 8 4 1 1 5 2 2 4 1

нялось трем, что существенно меньше, чем было в 2009 году. Кроме того,

в процессе добавления в архив новых тестов и перетестирования решений

участники присылали на проверку новые, более эффективные решения.

В результате применения технологии было сгенерировано 13 тестов, ко-

торые были добавлены в архив задач под номерами 59–71. Ни одно из новых

решений не прошло указанные тесты.

Выводы по главе 6

1. Предложенная технология внедрена в архив задач с проверяющей си-

стемой Timus Online Judge при генерации тестов для задачи «Ships.

Version 2», что подтверждается актом внедрения из Уральского феде-

рального университета.

2. Технология применялась в 2009 и 2011 годах. В обоих случаях были

сгенерированы и добавлены в архив задач новые тесты, при этом ни

одно из известных решений, написанных в том числе и чемпионами

мира по программированию, не прошло указанные тесты.

3. Результаты, описанные в данной главе, опубликованы в журнале, вхо-

дящем в перечень ВАК [152], а также в трудах всероссийских [163, 166,

167] и международных конференций [154, 156—158].

Page 155: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

155

ГЛАВА 7. ВНЕДРЕНИЕ ПРЕДЛОЖЕННОЙ ТЕХНОЛОГИИ

ПРИ ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ ЗАДАЧИ

«WORK FOR ROBOTS»

В данной главе описывается применение технологии, предложенной в

главе 5, при генерации тестов для задачи «Work for Robots». С текстом усло-

вия этой задачи можно ознакомиться на сайте Timus Online Judge [142], где

она размещена под номером 1695 [143].

7.1. Условие задачи

Дан неориентированный граф без петель и кратных ребер. Число вершин

графа N находится в диапазоне от одной до 50. Необходимо найти число

клик в этом графе. Ограничение по времени — две секунды, ограничение по

памяти — 64 мегабайта.

7.2. Авторское решение задачи

Авторское решение этой задачи основано на известном среди участников

олимпиад по программированию приеме «meet-in-the-middle».

Разделим вершины графа на два множества L и H, так чтобы |L| 6 23 и∣

∣|H| − |L|∣

∣ было минимальным. Занумеруем вершины множества L числами

от 0 до |L| − 1. Любое подмножество множества L может быть выражено

в виде битовой маски — неотрицательного целого числа, не превосходящего

2|L| − 1, в двоичном представлении которого единицы в разрядах i1, . . . , ik

соответствуют входящим в это подмножество вершинам с индексами соот-

ветственно i1, . . . , ik. Аналогично можно задавать подмножества множества

H.

Пусть E — множество ребер в данном графе. Введем функцию покры-

тия e, которая сопоставляет множеству вершин V множество вершин, для

которых каждая вершина из V является смежной:

e(V ) = { u | ∀v ∈ V uv ∈ E }.

Page 156: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

156

Число клик c(A) для каждого подмножества A множества L может быть

вычислено по следующим формулам:

c(∅) = 1;

c(A ∪ {v}) = c(A) + c(A ∩ e({v})).

При использовании кодирования подмножеств множества L, описанного

выше, и хранения значения c(A) в массиве cliquesL, индексируемом цело-

численным представлением подмножества A, вычисление всех c(A) можно

выполнить за O(2|L|) времени и памяти с помощью динамического програм-

мирования. При указанном ограничении на размер L массив cliquesL зани-

мает не более 32 мегабайт оперативной памяти.

Рассмотрим произвольную клику C и два ее подмножества CL = C ∩ L,

CH = C ∩ H. Очевидно, что CL ⊂ e(CH) ∩ L, иначе C не было бы кликой.

Следовательно, если бы мы посчитали для CH число клик в e(CH) ∩ L, то

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

Отсюда следует идея второй половины решения. Для каждого подмно-

жества C множества H, являющегося кликой, вычислим LC = e(CH) ∩ L и

найдем число клик в LC в массиве cliquesL. Сумма всех таких значений и

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

один раз.

Для эффективной реализации этой идеи требуется быстро выяснять, яв-

ляется ли данное подмножество C множества H кликой, а также быстро на-

ходить e(C)∩L. Для этого достаточно разбить множество H на две прибли-

зительно равных половины HL и HH , подсчитать для каждого подмножества

из этих половин функции покрытия и вычислять требуемое по следующим

формулам:

isClique(C) = (e(HL) ∩ e(HH) ∩H = C);

e(C) ∩ L = e(HL) ∩ e(HH) ∩ L.

Page 157: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

157

Вычисление указанных значений для каждой из половин требует

O(2⌈|H |/2⌉) времени и памяти. Вычисление итоговой суммы, а, следовательно,

и ответа, требует O(2|H |) времени и O(1) дополнительной памяти.

Итоговое время работы оценивается как O(2N−min(23,⌊N/2⌋)) с достаточ-

но небольшой скрытой константой. Фактическое время работы находится в

пределах от 0,5 до 1,5 секунд при реализации на языках C++ и Java. Ис-

пользуется 4 · 2min(23,⌊N/2⌋) + 16 · 2⌈(N−min(23,⌊N/2⌋))/2⌉ +O(N) байт памяти, что

составляет приблизительно 33 мегабайта.

Автору работы также известно о существовании решения с оценкой на

время работы O(23N/7).

7.3. Неэффективные решения

По состоянию на 1 августа 2009 года по этой задаче было засчитано мно-

жество решений, основанных на неэффективных алгоритмах. К таким ал-

горитмам относится, например, перебор с запоминанием — число состояний,

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

всех имевшихся тестах это число было небольшим. Были также сданы неко-

торые решения, эффективные по времени, но потенциально использующие

больше памяти, чем разрешено.

Решения, использующие перебор с запоминанием, реализованы, как пра-

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

исходного графа, построенного на некотором подмножестве его вершин. Если

для данного подграфа A ответ еще не вычислялся, то выбирается некоторая

вершина v этого подграфа и производится вычисление ответа по формуле:

ans(A) = ans(A \ v) + ans(A \ v ∩ e(v)).

При этом возможно использование некоторых эвристик, ускоряющих ра-

боту программы. Например, если A \ v ⊂ e(v), то ans(A) = 2 ·ans(A \ v), при

этом удается избежать повторного вызова процедуры на том же подмноже-

стве.

Page 158: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

158

После вычисления полученный ответ, если возможно, сохраняется. Если

же для данного подграфа сохранен ранее вычисленный ответ, то он и возвра-

щается. При каждом вызове такой процедуры выполняется O(1), O(logN)

или O(N) действий (где N — число вершин в графе) в зависимости от струк-

туры данных, используемой для хранения подсчитанной информации, и от

стратегии выбора удаляемой вершины.

Помимо описанных способов решения, известны решения, основанные на

следующих принципах:

— поиск наибольшего независимого подмножества и динамическое про-

граммирование;

— предварительное переупорядочивание вершин и перебор с запоминани-

ем;

— случайная перестановка вершин и перебор с запоминанием.

С помощью переупорядочивания вершин можно добиться уменьшения

асимптотической оценки на время работы и потребляемую память до величи-

ны O(23N/7). Однако, этого не было сделано ни одним из авторов решений на

момент начала применения технологии генерации тестов. Остальные описан-

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

генератора случайных чисел, могут в константное число раз снизить мате-

матическое ожидание времени работы, при этом оставаясь неэффективными

на некоторых тестах.

7.4. Применение технологии генерации тестов

В данном разделе приводятся шаги по применению технологии генера-

ции тестов, описанной в главе 5, к генерации тестов для определения неэф-

фективных решений задачи «Work for Robots». Непосредственного доступа

к решениям задачи, за исключением одного из них, у автора диссертации не

было — решения высылались по электронной почте по запросу администра-

тору архива задач.

Page 159: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

159

Ниже излагаются детали применения технологии к трем наиболее харак-

терным классам решений.

7.4.1. Решение с кешированием младших бит

Первым решением задачи «Work for Robots», оказавшимся у автора дис-

сертации, было решение с кешированием младших бит, автор — В. Исенбаев,

чемпион мира по программированию 2009 г. Решение основано на ранее из-

ложенной идее перебора с запоминанием: запоминались ответы для подмно-

жеств графа, состоящих из первых 23 вершин. Фрагмент решения на языке

Java приведен на листинге 3. В данном, а также в последующих фрагментах

решений предполагается, что знаковый целочисленный тип long занимает 64

бит, edgesOf — массив 64-битных знаковых чисел, хранящий заданный на

входе граф с использованием битового сжатия (edgesOf[i] — битовая мас-

ка, в которой установлены биты, соответствующие смежным с i вершинам).

Операции чтения входных данных и вывода ответа не приводятся.

Для теста в виде полного графа при N = 50 число вызовов функции calc

приблизительно равно 226 ≈ 6,7 × 107, что при использовании процессора с

тактовой частотой порядка 2–3 ГГц занимает менее половины секунды.

Представление теста в виде особи эволюционного алгоритма. В

соответствии с технологией генерации тестов, на третьем этапе требуется по-

строить представление теста в виде особи эволюционного алгоритма. Тесты

для рассматриваемой задачи предлагается кодировать в виде симметричной

матрицы булевых значений размера N×N , являющейся матрицей смежности

графа, данного в тесте. При этом на диагонали матрицы всегда стоят нули.

Такой способ представления является достаточно простым, в то же время лю-

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

в виде особи. Для того чтобы получающиеся тесты были как можно более

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

вершин в графе (N = 50).

Page 160: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

160

Листинг 3 – Фрагмент решения с кешированием младших бит (на языке Java)

i n t [ ] cache = new in t [ 1 << 2 3 ] ;

long ca l c ( long mask ) {

i f (mask == 0) {

return 1 ;

}

i f ( (mask & (mask − 1) ) == 0) {

return 2 ;

}

i f (mask < cache . l ength && cache [ ( i n t ) (mask ) ] != 0) {

return cache [ ( i n t ) (mask) ] ;

}

i n t l a s tB i t = Long . numberOfTrai l ingZeros (mask) ;

long rec1 = mask ^ (1L << l a s tB i t ) ;

long rec2 = rec1 & edgesOf [ l a s tB i t ] ;

long r e s = ca l c ( rec1 ) + ca l c ( rec2 ) ;

i f (mask < cache . l ength ) {

cache [ ( i n t ) (mask ) ] = ( i n t ) ( r e s ) ;

}

return r e s ;

}

Генерация случайных тестов. Генерация случайных тестов осуществ-

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

случайного значения логического типа. По итогам генерации 10000 случай-

ных тестов среднее значение времени работы рассматриваемого решения на

тесте составило 7,4 миллисекунды, максимальное — 20 миллисекунд. Число

вызовов функции calc в среднем составило 4 495,699, максимальное — 7 271.

Данные результаты показывают, что генерацию случайных тестов нецеле-

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

попробовать применить (1 + 1)-эволюционный алгоритм.

Page 161: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

161

Построение оптимизируемых функций. В рассматриваемом решении

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

ний, приходящаяся на каждый вызов, составляет O(1), следовательно, общее

время работы данной части решения пропорционально числу вызовов функ-

ции calc. По указанной причине, в качестве оптимизируемой функции будет

использоваться число вызовов функции calc.

Построение оператора мутации. Для описанного выше способа пред-

ставления теста в виде особи эволюционного алгоритма разработано два опе-

ратора мутации. Первый оператор инвертирует один элемент матрицы, не

стоящий на диагонали, и симметричный ему. Второй оператор симметрично

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

вышающем 1/10 от числа всех элементов матрицы. Данные операторы при-

меняются поочередно.

Целью первого из операторов является попытка перепробовать все воз-

можные «единичные» изменения теста. Для этого элементы матрицы, подле-

жащие изменению, перебираются в некотором, заранее определенном поряд-

ке, например A2,1, A3,1, A3,2 и т. д. Второй оператор делает более глобальные

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

Генерация тестов с помощью (1+1)-эволюционного алгоритма. Для

генерации теста был применен (1 + 1)-эволюционный алгоритм. На рисун-

ке 7 показан график значения функции приспособленности в зависимости

от числа вызовов функции приспособленности. Время работы решения, соот-

ветствующее максимальному значению функции на этом графике, равно 5,25

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

генерации тестов против рассматриваемого решения достигнута.

Page 162: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

162

0 2000 4000 6000

2×108

4×108

6×108

8×108

Число вызовов функции приспособленности

Макси

мум

присп

осо

блен

ност

и

Рисунок 7 – График функции приспособленности для решения с

кешированием младших бит

Проверка имеющихся решений на сгенерированном тесте. Резуль-

таты проверки имеющихся решений на полученном тесте показали, что у трех

авторов все принятые решения по этой задаче не проходят новый тест.

7.4.2. Решение, использующее ассоциативный массив

Проблема, состоящая в том, что число клик одного и того же подграфа

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

вать ассоциативный массив, в котором будем хранить соответствие подграфу

(битовой маске) вычисленного для него ответа. При этом может использо-

ваться как реализация ассоциативного массива из стандартной библиотеки

языка (std::map в C++, java.util.HashMap в Java), так и более экономная

и быстрая реализация, выполненная автором решения. На листинге 4 приве-

ден фрагмент такой программы с использованием ассоциативного массива,

реализованного на основе открытой хеш-таблицы.

Решению такого типа присущ следующий недостаток: так как каждая

пара ключ-значение занимает 16 байт (два 64-битных целых числа), то, не

Page 163: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

163

Листинг 4 – Фрагмент решения с использованием ассоциативного массива

(на языке Java)

LLOpenHashMap hash = new LLOpenHashMap (4000037) ;

long ca l c ( long mask ) {

i f (mask == 0) {

return 1 ;

}

i f ( (mask & (mask − 1) ) == 0) {

return 2 ;

}

long hv = hash . get (mask ) ;

i f ( hv != −1) {

return hv ;

}

i n t l a s tB i t = Long . numberOfTrai l ingZeros (mask) ;

long rec1 = mask ^ (1L << l a s tB i t ) ;

long rec2 = rec1 & edgesOf [ l a s tB i t ] ;

r e turn hash . put (mask , c a l c ( rec1 ) + ca l c ( rec2 ) ) ;

}

превышая ограничения по памяти, возможно запомнить не более четырех

миллионов таких пар.

Представление теста в виде особи эволюционного алгоритма. Было

принято решение переиспользовать представление теста, разработанное для

предыдущего решения.

Генерация случайных тестов. По итогам генерации 10000 случайных

тестов среднее время работы решения составило 0,48 миллисекунд, макси-

мальное — 10 миллисекунд. Среднее число вызовов функции calc составило

Page 164: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

164

4 692,4504, максимальное — 7 959. Было принято решение проводить генера-

цию тестов с помощью (1 + 1)-эволюционного алгоритма.

Построение оптимизируемых функций. В предположении того, что

существуют тесты, где этому решению придется использовать больше значе-

ний, в качестве функции приспособленности выбирается число пар, храня-

щихся по окончании работы решения в ассоциативном массиве.

Построение оператора мутации. Был использован оператор мутации,

разработанный для предыдущего решения.

Генерация тестов с помощью (1+1)-эволюционного алгоритма. Для

генерации теста был применен (1+ 1)-эволюционный алгоритм. Пример гра-

фика функции приспособленности для этого решения приведен на рисунке 8.

Максимальное время работы решения составило порядка 1,4 секунды, однако

использование памяти существенно превысило 64 мегабайта. В зависимости

от реализации ассоциативного массива, решения такого типа могут раньше

нарушить ограничение по памяти (как в случае описанного решения) или по

времени (если использовать, например, java.util.HashMap<Long, Long>), а

также, в некоторых случаях, может произойти ошибка времени выполнения

(«падение» решения) или выдача неверного ответа.

Проверка имеющихся решений на сгенерированном тесте. После

проверки решений на сгенерированном тесте, тесты перестали проходить 23

решения из 81, прошедших все тесты до начала применения технологии. По-

сле добавления в набор теста, являющегося зеркальным отражением постро-

енного (вершина с индексом i становится вершиной с индексом 51− i), тесты

перестали проходить еще несколько решений, в том числе решение с иденти-

фикатором 2 629 401, которое выдало на нем неверный ответ.

Page 165: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

165

0 2×104 4×104 6×104

0

106

2×106

3×106

4×106

5×106

Число вызовов функции приспособленности

Макси

мум

присп

осо

блен

ност

и

Рисунок 8 – График функции приспособленности для решения с

использованием ассоциативного массива

7.4.3. Решение с использованием «большого массива»

Идею перебора с запоминанием можно улучшить и другим способом.

На x86-совместимых архитектурах (на которых, в основном, и производит-

ся тестирование олимпиадных задач) страницы памяти, которые никогда не

были прочитаны или записаны, не выделяются операционной системой и по-

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

как правило, имеют размер четыре килобайта. По этой причине можно ста-

тически выделить очень большой массив (например, 256 мегабайт), и, если

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

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

ограничение по памяти).

Отметим, что это утверждение неверно для языка Java, так как в нем

все массивы выделяются в динамической памяти и предварительно инициа-

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

C++ можно использовать как оригинальное решение, так и перевод этого

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

Page 166: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

166

алгоритма. При этом решение на Java будет всегда использовать больше 64

мегабайт памяти, что не мешает успешному построению теста.

Фрагмент исходного кода соответствующего решения не приводится, по-

скольку он идентичен листингу 3 за исключением того, что размер кеша будет

равным 224 и больше.

Так как генерация случайных тестов даст приблизительно такой же ре-

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

решения перейти непосредственно на пятый этап технологии «Построение

оптимизируемых функций».

Построение оптимизируемых функций. Для решения, описанного вы-

ше, можно ввести функцию приспособленности, равную числу использован-

ных страниц памяти. С учетом возможного отсутствия выравнивания мас-

сива по границам страниц, целесообразно проверить (и учесть в функции

приспособленности) решение на использование крайних элементов, таких как

нулевой и с номером 224 − 1. Для вычисления функции приспособленности

проще всего реализовать класс, эмулирующий массив и одновременно вычис-

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

число страниц, а число блоков по четыре килобайта. Для повышения веро-

ятности использования страницы памяти вне зависимости от выравнивания

массива в памяти, вместо блоков по четыре килобайта были использованы

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

подсчет (листинг 5).

Построение оператора мутации. Используется оператор мутации, раз-

работанный для предыдущих решений, описанных в настоящей главе.

Генерация тестов с помощью (1 + 1)-эволюционного алгоритма.

Максимальное значение приспособленности для кеша размером 224 элемен-

Page 167: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

167

та равно 65538. Пример графика функции приспособленности для решения

такого типа с кешом размера 224 приведен на рисунке 9. Максимальное значе-

ние функции приспособленности достигнуто примерно на 150 000 поколении.

При этом время работы решения на лучшем тесте составило около 80 мил-

лисекунд.

0 5×104 105 1.5×105

104

2×104

3×104

4×104

5×104

6×104

Число вызовов функции приспособленности

Макси

мум

присп

осо

блен

ност

и

Рисунок 9 – График функции приспособленности для решения с

использованием большого массива

Проверка имеющихся решений на сгенерированном тесте. После

проверки решений на сгенерированном тесте, тесты перестали проходить 45

решений из 86. В 86 решений были включены все решения, прошедшие все

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

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

рассматриваемого теста.

7.5. Выбор подмножества сгенерированных тестов

Технология генерации тестов была применена с использованием 10 из

86 решений. Из этих 10 решений одно было признано корректным по итогам

Page 168: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

168

Таблица 13 – Эффективность сгенерированных тестов для задачи «Work for

Robots». Условные обозначения: WA — неверные ответ, TL — превышение

ограничения на время, ML — превышение ограничения на память

№ теста Число решений, не прошедших тест

Все WA TL ML

43 1 0 1 0

44 2 0 2 0

45 2 0 2 0

46 1 0 1 0

47 0 0 0 0

48 9 0 8 1

49 13 0 13 0

50 12 0 12 0

51 2 2 0 0

52 3 0 0 3

Всего 45 2 39 4

теоретического анализа (этап «Предварительный теоретический анализ зада-

чи генерации тестов для выбранного решения»). Против остальных решений

было сгенерировано в совокупности 10 тестов, получивших номера с 43 по 52

в наборе тестов для рассматриваемой задачи.

В таблице 13 для каждого теста T приведено число решений, которые

прошли все тесты с номерами, меньшими T , и не прошли тест T , включая

отдельную статистику для каждого возможного результата прохождения те-

ста.

Было принято решение оставить в наборе все сгенерированные тесты,

включая тест 47, который не добавлял новых решений к списку доказанно

неэффективных решений.

Page 169: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

169

Таким образом, с помощью описанного метода сгенерированы тесты, поз-

волившие почти полностью устранить имеющиеся на время проведения экс-

перимента зачтенные неэффективные решения, которых было более 50 %.

Тем не менее, полностью устранить неэффективные решения по этой

задаче не удалось. Это связано с тем, что некоторые решения существенно

используют рандомизацию (случайную перестановку номеров вершин), ко-

торой в данной задаче пока не получается противопоставить эффективные

меры. Вероятно, для многих таких решений можно доказать, что математи-

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

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

соответственно.

Выводы по главе 7

1. Предложенная технология внедрена в архив задач с проверяющей си-

стемой Timus Online Judge при генерации тестов для задачи «Work for

Robots», что подтверждается актом внедрения из Уральского федераль-

ного университета.

2. В результате были сгенерированы и добавлены в архив задач 10 новых

тестов. Из имевшихся на момент внедрения 86 решений 45 не прошло

сгенерированные тесты.

3. Результаты, описанные в данной главе, опубликованы в журнале, вхо-

дящем в перечень ВАК [153], а также в трудах всероссийской [164] и

международной [155] конференций.

Page 170: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

170

Листинг 5 – Класс, реализующий подсчет числа используемых страниц (на

языке Java)

pub l i c c l a s s CountingArray {

p r i va t e i n t [ ] data ;

p r i va t e boolean [ ] used ;

p r i va t e boolean used0 , usedL ;

pub l i c CountingArray ( i n t i l o g S i z e ) {

data = new in t [ 1 << i l o g S i z e ] ;

used = new boolean [ 1 << ( i l o g S i z e − 8) ] ;

}

p r i va t e void d i g e s t ( i n t index ) {

used0 |= index == 0 ;

usedL |= index == data . l ength − 1 ;

used [ index >>> 8 ] = true ;

}

pub l i c i n t get ( i n t index ) {

d i g e s t ( index ) ;

r eturn data [ index ] ;

}

pub l i c vo id s e t ( i n t index , i n t va lue ) {

d i g e s t ( index ) ;

data [ index ] = value ;

}

pub l i c i n t f i t n e s s ( ) {

i n t rv = 0 ;

rv += used0 ? 1 : 0 ;

rv += usedL ? 1 : 0 ;

f o r ( boolean v : used ) {

rv += v ? 1 : 0 ;

}

return rv ;

}

}

Page 171: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

171

ЗАКЛЮЧЕНИЕ

В результате диссертационного исследования получены следующие ре-

зультаты:

1. Предложен метод генерации тестов для алгоритмов решения NP-

трудных задач на основе генетического алгоритма (на примере задачи

о рюкзаке).

2. Предложен метод генерации тестов для алгоритмов решения графовых

задач на основе генетического алгоритма (на примере задачи о поиске

максимального потока).

3. Разработан алгоритм выбора из нескольких функций приспособленно-

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

4. Предложена и внедрена технология генерации тестов для определения

неэффективных решений олимпиадных задач по программированию на

основе эволюционных алгоритмов.

Результаты диссертации внедрены при генерации дополнительных те-

стов для олимпиадных задач по программированию «Ships. Version 2» и

«Work for Robots», находящихся в архиве задач с проверяющей системой

Timus Online Judge, функционирующей на базе Уральского федерального

университета имени первого президента России Б. Н. Ельцина, г. Екатерин-

бург, о чем получен акт внедрения.

Также результаты диссертации использовались в учебном процессе ка-

федры «Компьютерные технологии» Университета ИТМО при руководстве

следующими бакалаврскими работами и магистерскими диссертациями:

1. А. Ю. Рост. Методы автоматизированного покрытия кода тестами на

основе эволюционных алгоритмов. Бакалаврская работа, 2013 г.

2. А. А. Байдаров. Генерация тестов, выявляющих целочисленное пере-

полнение и потерю точности при использовании вещественных чисел.

Бакалаврская работа, 2013 г.

Page 172: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

172

3. В. С. Архипов. Генерация тестов для задачи о максимальном потоке с

использованием генетических алгоритмов. Бакалаврская работа, 2013 г.

4. В. О. Якорев. Генерация тестов для олимпиадных задач по программи-

рованию с помощью многокритериальных эволюционных алгоритмов.

Магистерская диссертация, 2013 г.

5. М. А. Лазеба. Автоматизированное исправление программ путем коэ-

волюции изменений программы и тестов. Бакалаврская работа, 2014 г.

6. Н. О. Кравцов. Автоматическое построение вспомогательных критери-

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

анализа исходного кода. Бакалаврская работа, 2014 г.

7. В. А. Миронович. Генерация тестов против неверных алгоритмов реше-

ния задачи о рюкзаке. Бакалаврская работа, 2014 г.

Page 173: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

173

СПИСОК ИСТОЧНИКОВ

Печатные издания на русском языке

1 Скобцов Ю. А., Федоров Е. Е. Метаэвристики. — Донецк : Ноулидж,

2013. — 426 с.

2 Оршанский С. А. О решении олимпиадных задач по программированию

формата ACM ICPC // Информатика. — 2006. — Т. 1. — С. 21—26.

3 Акишев И. Р. Об опыте участия в командных соревнованиях по про-

граммированию формата ACM // Информатика. — 2008. — Т. 19.

— С. 20—28.

4 Харари Ф. Теория графов. — М. : Едиториал УРСС, 2003. — 300 с.

5 Царев Ф. Н., Шалыто А. А. Применение генетического программиро-

вания для генерации автомата в задаче об «Умном муравье» // Труды

IV Международной научно-практической конференции «Интегрирован-

ные модели и мягкие вычисления в искусственном интеллекте». — М. :

Физматлит, 2007. — С. 590—597.

6 Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы. Построение и анализ.

Второе издание. — М. : Издательский дом «Вильямс», 2005. — 1296 с.

Печатные издания на английском языке

7 Teaching Fundamentals Concepts of Informatics, 4th International Con-

ference on Informatics in Secondary Schools – Evolution and Perspec-

tives. Proceedings / ed. by J. Hromkovic, R. Kralovic, J. Vahrenhold.

— Springer, 2010. — (Lecture Notes in Computer Science ; 5941).

8 Skiena S. S., Revilla M. A. Programming Challenges: The Programming

Contest Training Manual. — New York : Springer Verlag, 2003. — 365 p.

9 Halim S. Competitive Programming 3: The New Lower Bound of Pro-

gramming Contests. — Lulu. — 447 p.

Page 174: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

174

10 Testing of Programs with Random Generated Test Cases / K. Manev, B.

Yovcheva, M. Yankov, P. Petrov // Olympiads in Informatics. — 2010.

— Vol. 4. — P. 76–86.

11 Harman M., Mansouri S. A., Zhang Y. Search Based Software Engi-

neering: A Comprehensive Analysis and Review of Trends, Technologies

and Applications: tech. rep. / Department of Computer Science, King’s

College London. — 2009.

12 Holland J. P. Adaptation in Natural and Artificial Systems. — University

of Michigan, 1975. — 211 p.

13 Koza J. R. Genetic programming: on the programming of computers by

means of natural selection. — Cambridge, MA, USA : MIT Press, 1992.

14 Mitchell M. An Introduction to Genetic Algorithms. — Cambridge, MA :

MIT Press, 1996.

15 Tonella P. Evolutionary Testing of Classes // Proceedings of International

Symposium on Software Testing and Analysis. — 2004. — P. 119–128.

16 Offutt J., Abdurazik A. Generating Tests from UML specifications

// Second International Conference on the Unified Modeling Language

(UML99). — 1999. — P. 416–429.

17 Generating Test data from State based Specifications / J. Offutt, L.

Shaoying, A. Abdurazik, P. Ammann // The Journal of Software Testing,

Verification and Reliability. — 2003. — Vol. 1, no. 13. — P. 25–53.

18 Offutt J., Abdurazik A. Using UML Collaboration diagrams for static

checking and test generation // Third International Conference on UML.

— UK, 2000.

19 Bousquet L. d., Martin H., Jezequel J. M. Conformance Testing from

UML Specification Experience Report: tech. rep. — 2001.

Page 175: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

175

20 Toth A., Varro D., Pataricca A. Model Level Automatic Test Generation

for UML State-Charts // Sixth IEEE workshop on Design and Diagnostics

of Electronic Circuits and System. — 2003.

21 Automating Software Testing Using Program Analysis / P. Godefroid, P.

de Halleux, A. Nori, S. Rajamani, W. Schulte, N. Tillmann, M. Levin

// IEEE Software. — 2008. — Vol. 25, no. 5. — P. 30–37.

22 Tillmann N., Halleux J. de Pex – White Box Test Generation for

.NET // Tests And Proofs. Second International Conference. — 2008.

— P. 134–153.

23 Burnim J., Sen K. Heuristics for Scalable Dynamic Test Generation

// Proceedings of the 23rd IEEE/ACM International Conference on Au-

tomated Software Engineering. — 2008. — P. 443–446.

24 Sen K., Marinov D., Agha G. CUTE: A Concolic Unit Testing Engine

for C // SIGSOFT Software Engineering Notes. — New York, NY, USA,

2005. — Vol. 30, no. 5. — P. 263–272.

25 Alander J. T., Mantere T., Turunen P. Genetic Algorithm Based

Software Testing // Artificial Neural Nets and Genetic Algorithms.

— Springer-Verlag, 1998. — P. 325–328.

26 Alander J. T., Mantere T., Moghadampour G. Testing Software Re-

sponse Times Using a Genetic Algorithm // Proceedings of the 3rd

Nordic Workshop on Genetic Algorithms and their Applications. — 1997.

— P. 293–298.

27 Gross H.-G. Measuring Evolutionary Testability of Real-Time Software:

PhD thesis / Gross Hans-Gerhard. — University of Glamorgan, June

2000.

Page 176: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

176

28 Gross H.-G., Jones B. F., Eyres D. E. Structural Performance Measure of

Evolutionary Testing Applied to Worst-Case Timing of Real-Time Sys-

tems // IEEE Proceedings – Software. — 2000. — Vol. 147, no. 2.

— P. 25–30.

29 Gross H.-G. A Prediction System for Evolutionary Testability Applied to

Dynamic Execution Time Analysis // Information and Software Technol-

ogy. — 2001. — Vol. 43, no. 14. — P. 855–862.

30 Gross H.-G., Mayer N. Evolutionary Testing in Component-based Real-

Time System Construction // Proceedings of Genetic and Evolutionary

Computation Conference. — 2002. — P. 207–214.

31 Gross H.-G., Mayer N. Search-based Execution-Time Verification in

Object-Oriented and Component-Based Real-Time System Development

// Proceedings of the 8th IEEE International Workshop on Object-

Oriented Real-Time Dependable Systems. — 2003. — P. 113–120.

32 Tlili M., Wappler S., Sthamer H. Improving Evolutionary Real-Time

Testing // Proceedings of Genetic and Evolutionary Computation Con-

ference. — ACM, 2006. — P. 1917–1924.

33 Testing Real-Time Systems using Genetic Algorithms / J. Wegener, H.

Sthamer, B. F. Jones, D. E. Eyres // Software Quality Journal. — 1997.

— Vol. 6, no. 2. — P. 127–135.

34 Wegener J., Mueller F. A Comparison of Static Analysis and Evolu-

tionary Testing for the Verification of Timing Constraints // Real-Time

Systems. — 2001. — Vol. 21, no. 3. — P. 241–268.

35 PathCrawler: Automatic Generation of Path Tests by Combining Static

and Dynamic Analysis / N. Williams, B. Marre, P. Mouy, M. Roger // De-

pendable Computing – EDCC 5. — 2005. — P. 281–292. — (Lecture

Notes in Computer Science ; 3463).

Page 177: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

177

36 Williams N., Roger M. Test Generation Strategies to Measure Worst-Case

Execution Time // ICSE Workshop on Automation of Software Testing.

— 2009. — P. 88–96.

37 Pisinger D. Algorithms for Knapsack Problems: PhD thesis / Pisinger

David. — University of Copenhagen, Feb. 1995.

38 Ford Jr. L. R., Fulkerson D. R.Maximal flow through a network // Cana-

dian Journal of Mathematics. — 1956. — Vol. 8. — P. 399–404.

39 Edmonds J., Karp R. M. Theoretical Improvements in Algorithmic Ef-

ficiency for Network Flow Problems // Journal of the ACM. — 1972.

— Vol. 19, no. 2. — P. 248–262.

40 Dinic E. A. Algorithm for solution of a problem of maximum flow in

networks with power estimation // Soviet Math. Dokl. — 1970. — Vol.

11, no. 5. — P. 1277–1280.

41 Ahuja R. K., Magnanti T. L., Orlin J. B. Network Flows: Theory, Algo-

rithms, and Applications. — Upper Saddle River, NJ, USA : Prentice-

Hall, Inc., 1993.

42 Ahuja R. K., Orlin J. B. A Capacity Scaling Algorithm for the Con-

strained Maximum Flow Problem // Networks. — 1995. — Vol. 25, no.

2. — P. 89–98.

43 Rice H. G. Classes of Recursively Enumerable Sets and Their Decision

Problems // Transactions of the American Mathematical Society. — 1953.

— Vol. 74, no. 2. — P. 358–366.

44 Mucherino A., Seref O. Monkey Search: A Novel Meta-Heuristic Search

for Global Optimization // Data Mining, System Analysis and Optimiza-

tion in Biomedicine, AIP Conference Proceedings. — 2007. — P. 162–173.

45 Kirkpatrick S., Gelatt C. D., Vecchi M. P. Optimization by Simulated

Annealing // Science. — 1983. — Vol. 220, no. 4598. — P. 671–680.

Page 178: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

178

46 Boettcher S., Percus A. G. Extremal Optimization: Methods derived from

co-evolution // Proceedings of the Genetic and Evolutionary Computation

Conference. — 1999. — P. 825–832.

47 Geem Z. V., Kim J. H., Loganathan G. V. A new heuristic optimiza-

tion algorithm: harmony search // Simulation. — 2001. — Vol. 76.

— P. 60–68.

48 Shah-Hosseini H. Principal component analysis by the galaxy-based

search algorithm: a novel metaheuristic for continuous optimization // In-

ternational Journal on Computation Science and Engineering. — 2011.

— Vol. 1/2. — P. 132–140.

49 Stutzle T. G., Hoos H. H. Analyzing the run-time behavior of iterated

local search for the TSP // Proceedings of III Metaheuristic International

Conference. — 1999. — P. 1–18.

50 Mladenovic N., Hansen P. Variable neighborhood search // Computers

and Operations Research. — 1997. — Vol. 24, no. 11. — P. 1097–1100.

51 Feo T. A., Resende M. G. C. A probabilistic heuristic for a computa-

tionally difficult set covering problem // Operations Research Letters.

— 1989. — Vol. 8. — P. 67–71.

52 Voudouris C., Tsang E. P. K. Guided local search joins the elite in dis-

crete optimization // Proceedings of DIMACS Workshop on Constraint

Programming and Large Scale Discrete Optimization. — New Jersey :

Rutgers, 1998. — P. 29–40.

53 Glover F. Tabu search methods for optimization // Feature Issue of Eu-

ropean Journal on Operations Research. — 1998. — Vol. 106, no. 2.

— P. 110–115.

54 Battiti R., Tecchiolli G. The reactive tabu search // ORSA Journal on

Computing. — 1994. — Vol. 6, no. 2. — P. 126–140.

Page 179: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

179

55 Taillard E., Voss S. POPMUSIC: Partial optimization metaheuristic un-

der special intensification conditions // Essays and surveys in metaheuris-

tics. — 2001. — P. 613–629.

56 Moscato P. On Evolution, Search, Optimization, Genetic Algorithms and

Martial Arts: Towards Memetic Algorithms. — Pasadena : California

Institute of Technology, 1989. — 101 p.

57 Fogel L. J. Autonomous automata // Industrial Research. — 1962.

— Vol. 4. — P. 14–19.

58 Storn R., Price K. Differential Evolution – A Simple and Efficient Heuris-

tic for Global Optimization over Continuous Spaces // Journal of Global

Optimization. — 1997. — Vol. 11, no. 4. — P. 341–359.

59 Reynolds R. G. An Introduction to Cultural Algorithms // Proceedings

of the 3rd Annual Conference on Evolutionary Programming. — 1994.

— P. 131–139.

60 Baluja S. Population-based incremental learning: A method for integrat-

ing genetic search based function optimization and competitive learning.

— Pittsburgh, Pennsylvania : Carnegie Mellon University, 1994. — 100 p.

61 Syswerda G. Simulated crossover in genetic algorithms // Foundations of

Genetic Algorithms. — 1993. — Vol. 2. — P. 239–255.

62 Muehlenbein H. The equation for response to selection and its use for

prediction // Evolutionary Computation. — 1997. — Vol. 5, no. 3.

— P. 303–346.

63 Pelikan M., Muehlenbein H. The Bivariate Marginal Distribution Algo-

rithm // Advances in Soft Computing: Engineering Design and Manufac-

turing. — London : Springer, 1999. — P. 521–535.

Page 180: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

180

64 Harik G. R., Lobo F. G., Goldberg D. E. The compact genetic algorithm

// IEEE Transactions on Evolutionary Computation. — 1999. — Vol. 3,

no. 4. — P. 287–297.

65 Harik G. R. Linkage Learning via Probabilistic Modeling in the Extended

Compact Genetic Algorithm (ECGA). — Urbana : University of Illinois,

1999. — 19 p.

66 Bonet J. S. de, Isbell C. L., Viola P. MIMIC: finding optima by estimat-

ing probability densities // Advances in Neural Information Processing

Systems. — 1997. — Vol. 9. — P. 424–431.

67 Baluja S., Davies S. Using optimal dependency-trees for combinatorial

optimization: learning the structure of the search space // Proceedings of

the International Conference on Machine Learning. — 1997. — P. 30–38.

68 Pelikan M., Goldberg D. E., Cantu-Paz E. Linkage Problem, Distribu-

tion Estimation, and Bayesian Networks // Evolutionary Computation.

— 2002. — Vol. 8, no. 3. — P. 311–341.

69 Shakya S., Santana R. An EDA based on local Markov property and

Gibbs sampling // Proceedings of Genetic and Evolutionary Computation

Conference. — 2008. — P. 475–476.

70 Eberhart R. C., Kennedy J. A new optimizer using particle swarm theory

// Proceedings of the Sixth International Symposium on Micro Machine

and Human Science. — 1995. — P. 39–43.

71 Li X. L., Shao Z. J., Qian J. X. An optimizing method based on au-

tonomous animate: Fish swarm algorithm // Systems Engineering: The-

ory and Practice. — 2002. — Vol. 22. — P. 32–38.

72 Yang X. S., Deb S. Cuckoo search via Levy flights // Proceedings of

World Congress on Nature and Biologically Inspired Computing. — 2009.

— P. 210–214.

Page 181: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

181

73 Yang X. S. A New Metaheuristic Bat-Inspired Algorithm // Nature In-

spired Cooperative Strategies for Optimization. — 2010. — P. 65–74.

74 Chu S. C., Tsai P. W., Pan J. S. Cat swarm optimization // Proceedings

of the 9th Pacific Rim International Conference on Artificial Intelligence.

— 2006. — P. 854–858.

75 Eusuff M. M., Lansey K. E. Optimization of water distribution network

design using the shuffled frog leaping algorithm // Journal of Water Re-

source Planning and Management. — 2003. — Vol. 129. — P. 210–225.

76 Dorigo M. The ant system: Optimization by colony of cooperating agents

// IEEE Transactions on Systems, Man and Cybernetics. — 1996. — Vol.

26, no. 1. — P. 1–13.

77 Dorigo M., Gambardella L. M. Ant Colony System: A Cooperative Learn-

ing Approach to the Traveling Salesman Problem // IEEE Transactions

on Evolutionary Computation. — 1. — Vol. 1. — P. 53–66.

78 Yang X. S. Firefly algorithms for multimodal optimization // Stochastic

Algorithms: Foundations and Applications. — 2009. — P. 169–178.

— (Lecture Notes in Computer Science ; 5792).

79 Krishnanand K. N., Ghose D. Detection of multiple source locations using

a glowworm metaphor with applications to collective robotics // IEEE

Swarm Intelligence Symposium. — 2005. — P. 84–91.

80 Basturk B., Karaboga D. An Artificial Bee Colony (ABC) Algoritmh for

Numeric Function Optimization // IEEE Swarm Intelligence Symposium.

— 2006. — P. 10–15.

81 Pinto C., Runkler T. A., Sousa J. M. Wasp Swarm Algorithm for Dy-

namic MAX-SAT Problems // Proceedings of the 8th International Con-

ference on Adaptive and Natural Computing Algorithms. Vol. 1. — 2007.

— P. 350–357.

Page 182: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

182

82 Liu Y., Passino K. M. Biomimicry of Social Foraging Bacteria for Dis-

tributed Optimization // Journal of Optimization Theory and Applica-

tions. — 2002. — Vol. 115, no. 3. — P. 603–628.

83 Mehrabian A. R., Lucas C. A novel numerical optimization algorithm in-

spired from weed colonization // Ecological Informatics. — 2006. — Vol.

1. — P. 355–366.

84 Shah-Hosseini H. Problem Solving by Intelligent Water Drops // Pro-

ceedings of IEEE Congress on Evolutionary Computation. — 2007.

— P. 3226–3231.

85 Rabanal P., Rodrigues I., Rubio F. Using River Formation Dynamics to

Design Heuristic Algorithms // Unconventional Computation. — 2007.

— P. 163–177. — (Lecture Notes in Computer Science ; 4618).

86 Rashedi E., Nezamabadi-pour H. A gravitational search algorithm // In-

formation Sciences. — 2209. — Vol. 179, no. 13. — P. 2232–2248.

87 Birbil S., Fang S. An Electromagnetism-like Mechanism for Global Op-

timization // Journal of Global Optimization. — 2003. — Vol. 25.

— P. 263–282.

88 Kaveh A., Talatahari S. A novel heuristic optimization method: charged

system search // Acta Mechanica. — 2010. — Vol. 213. — P. 267–289.

89 Bishop J. M. Stochastic Searching Networks // Proceedings of 1st IEEE

Conference on Artificial Neural Networks. — 1989. — P. 329–331.

90 Erol O. K., Eksin I. A new optimization method: Big Bang-Big Crunch

// Advances in Engineering Software. — 2006. — Vol. 37, no. 2.

— P. 106–111.

91 Castro L. N. de, Zuben F. J. von Learning and optimization using clonal

selection principle // IEEE Transactions on Evolutionary Computation.

— 2002. — Vol. 6. — P. 239–251.

Page 183: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

183

92 Self-Nonself Discrimination in a Computer / S. Forrest, A. S. Perelson, L.

Allen, R. Cherukuri // Proceedings of the IEEE Symposium on Security

and Privacy. — 1994. — P. 202–212.

93 Castro L. N. de, Zuben F. J. von An evolutionary immune network for

data clustering // Proceedings of the 6th Brazilian Symposium on Neural

Networks. — 2000. — P. 84–89.

94 Kelsey J., Timmis J. Immune Inspired Somatic Contiguous Hypermuta-

tion for Function Optimization // Proceedings of Genetic and Evolution-

ary Computation Conference. — 2003. — P. 207–218. — (Lecture Notes

in Computer Science ; 2723).

95 Lucinska M., Wierzchon S. T. Hybrid Immune Algorithm for Multimodal

Function Optimization // Recent Advances in Intelligent Information Sys-

tems. — 2009. — P. 301–313.

96 Aragon V. S., Esquivel S. C., Coello Coello C. A. Solving Constrained

Optimization using a T-Cell Artificial Immune System // Inteligencia

Artificial. — 2008. — Vol. 40. — P. 7–22.

97 Glover F. A Template for Scatter Search and Path Relinking // Proceed-

ings of the 3rd European Conference on Artificial Evolution. — 1998.

— P. 3–54.

98 A Fast Elitist Multi-Objective Genetic Algorithm: NSGA-II / K. Deb,

A. Pratap, S. Agarwal, T. Meyarivan // Transactions on Evolutionary

Computation. — 2000. — Vol. 6. — P. 182–197.

99 Witt C. Optimizing Linear Functions with Randomized Search Heuristics

– the Robustness of Mutation // Proceedings of the 29th Annual Sympo-

sium on Theoretical Aspects of Computer Science. — 2012. — P. 420–431.

Page 184: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

184

100 Back T., Hoffmeister F., Schwefel H.-P. A Survey of Evolution Strate-

gies // Proceedings of the Fourth International Conference on Genetic

Algorithms. — Morgan Kauffman, 1991. — P. 2–9.

101 Luke S. Essentials of Metaheuristics. — Lulu, 2009. — 253 p.

102 Hansen N., Ostermeier A. Completely Derandomized Self-Adaptation in

Evolution Strategies // Evolutionary Computation. — 2001. — Vol. 9.

— P. 159–195.

103 Hansen N., Muller S. D., Koumoutsakos P. Reducing the Time Com-

plexity of the Derandomized Evolution Strategy with Covariance Matrix

Adaptation (CMA-ES) // Evolutionary Computation. — 2003. — Vol.

11, no. 1. — P. 1–18.

104 Ros R., Hansen N. A Simple Modification in CMA-ES Achieving Linear

Time and Space Complexity // Parallel Problem Solving from Nature

X. — Springer, 2008. — P. 296–305. — (Lecture Notes in Computer

Science ; 5199).

105 Langdon W. B., Harman M. Genetically Improving 50000 Lines of C++:

Research Note RN/12/09: tech. rep. — 2012.

106 FloPSy – Search-Based Floating Point Constraint Solving for Symbolic

Execution / K. Lakhotia, N. Tillmann, M. Harman, J. de Halleux // 22nd

IFIP International Conference on Testing Software and Systems. — 2010.

— P. 142–157.

107 Fitness-Guided Path Exploration in Dynamic Symbolic Execution / T.

Xie, N. Tillmann, P. de Halleux, W. Schulte // Proceedings of the 39th

Annual IEEE/IFIP International Conference on Dependable Systems and

Networks (DSN 2009). — IEEE, 2009. — P. 359–368.

Page 185: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

185

108 Garey M. R., Johnson D. S. Computers and Intractability: A Guide

to the Theory of NP-Completeness. — New York, NY, USA : W. H.

Freeman & Co., 1979. — 338 p.

109 Bellman R. E. Dynamic Programming. — Princeton, NJ : Princeton

University Press, 1957. — 342 p.

110 Chvatal V. Hard Knapsack Problems // Operations Research. — 1980.

— Vol. 28, no. 6. — P. 1402–1411.

111 Nemhauser G., Ullmann Z. Discrete Dynamic Programming and Cap-

ital Allocation // Management Science. — 1969. — Vol. 15, no. 9.

— P. 494–505.

112 Dunn O. J. Multiple Comparisons Among Means // Journal of the Amer-

ican Statistical Association. — 1961. — Vol. 56, no. 293. — P. 52–64.

113 Goldberg A. V., Tarjan R. E. A New Approach to the Maximum Flow

Problem // Proceedings of the Eighteenth Annual ACM Symposium

on Theory of Computing. — New York, NY, USA : ACM, 1986.

— P. 136–146.

114 Zwick U. The smallest networks on which the Ford-Fulkerson maximum

flow procedure may fail to terminate // Theoretical Computer Science.

— 1995. — Vol. 148, no. 1. — P. 165–170.

115 Goldfarb D., Grigoriadis M. D. A computational comparison of the Dinic

and network simplex methods for maximum flow // Annals of Operations

Research. — 1988. — Vol. 13, no. 1. — P. 81–123.

116 Zadeh N. Theoretical Efficiency of the Edmonds-Karp Algorithm for Com-

puting Maximal Flows // Journal of the ACM. — 1972. — Vol. 19, no. 1.

— P. 184–192.

117 Rice J. R. The algorithm selection problem // Advances in Computers.

— 1976. — Vol. 15. — P. 65–118.

Page 186: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

186

118 Kotthoff L. Algorithm selection for combinatorial search problems: A

survey // AI Magazine. — 2014.

119 Gomes C. P., Selman B. Algorithm portfolios // Artificial Intelligence.

— 2001. — Vol. 126, no. 1. — P. 43–62.

120 Yuen S. Y., Chow C. K., Zhang X. Which Algorithm Should I Choose at

Any Point of the Search: An Evolutionary Portfolio Approach // Proceed-

ings of the Genetic and Evolutionary Computation Conference. — 2013.

— P. 567–574.

121 Baudis P., Posık P. Online Black-Box Algorithm Portfolios for Continu-

ous Optimization // Parallel Problem Solving from Nature XIII. — 2014.

— P. 40–49. — (Lecture Notes in Computer Science ; 8672).

122 Bottcher S., Doerr B., Neumann F. Optimal Fixed and Adaptive Mu-

tation Rates for the LeadingOnes Problem // Parallel Problem Solving

from Nature XI. — Springer, 2010. — P. 1–10. — (Lecture Notes in

Computer Science ; 6238).

123 Karp R. Reducibility Among Combinatorial Problems // 50 Years of In-

teger Programming 1958–2008. — 2010. — P. 219–241.

124 Raz R., Safra S. A sub-constant error-probability low-degree test, and a

sub-constant error-probability PCP characterization of NP // Proceedings

of the twenty-ninth annual ACM Symposium on Theory of Computing.

— ACM, 1997. — P. 475–484.

125 Zhang L., Geng S. The Complexity of the 0/1 Multi-knapsack problem

// Journal of Computer Science and Technology. — 1986. — Vol. 1,

no. 1.

Page 187: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

187

Печатные издания на немецком языке

126 Rechenberg I. Evolutionsstrategie: Optimierung technischer Systeme nach

Prinzipien der biologischen Evolution. — Stuttgart : Fromman-Holzboorg

Verlag, 1973.

127 Schwefel H.-P. Binare Optimierung durch somatische Mutation: Techn.

Ber. / Technical University of Berlin ; Medical University of Hannover.

— Mai 1975.

128 Hofler A. Formoptimierung von Leichtbaufachwerken durch Einsatz einer

Evolutionsstrategie: Diss. / Hofler A. — Technical University of Berlin,

Juni 1976.

Ресурсы сети Интернет

129 International Olympiad in Informatics. — URL:

http://www.ioinformatics.org.

130 Интернет-олимпиады по информатике. — URL:

http://neerc.ifmo.ru/school/io/.

131 ACM International Collegiate Programming Contest. — URL:

http://cm.baylor.edu/welcome.icpc.

132 Правила проведения Северо-западного полуфина-

ла чемпионата мира по программированию. — URL:

http://neerc.ifmo.ru/information/contest-rules.html.

133 Russian Code Cup. — URL: https://www.russiancodecup.ru/.

134 Programming Contests at TopCoder. — URL:

http://www.topcoder.com/tc.

135 Google Code Jam. — URL: http://code.google.com/codejam.

136 Internet Problem Solving Contest. — URL: http://ipsc.ksp.sk/.

137 Codeforces. — URL: http://codeforces.ru.

Page 188: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

188

138 CodeChef. — URL: http://www.codechef.com/.

139 Google Code Jam: Problem Preparation Guide. — URL:

https://code.google.com/codejam/problem-preparation.html.

140 CodeChef: Test Generation Plan. — URL:

http://www.codechef.com/wiki/test-generation-plan.

141 Задача «Ships. Version 2» из архива задач Timus Online Judge. — URL:

http://acm.timus.ru/problem.aspx?num=1394.

142 Timus Online Judge. Архив задач с проверяющей системой. — URL:

http://acm.timus.ru.

143 Задача «Work for Robots» из архива задач Timus Online Judge. — URL:

http://acm.timus.ru/problem.aspx?num=1695.

144 Яндекс.Алгоритм. — URL: http://contest.yandex.ru/.

145 Архив задач и проверяющая система Саратовского государственного

университета. — URL: http://acm.sgu.ru.

146 Sphere Online Judge. — URL: http://www.spoj.com.

147 UVa Online Judge. — URL: http://uva.onlinejudge.org.

148 Verhoeff T. Guidelines for Producing a

Programming-Contest Problem Set. — URL:

http://www.win.tue.nl/~wstomv/publications/guidelines.html.

149 R Core Team. R: A Language and Environment for Statistical Com-

puting / R Foundation for Statistical Computing. — 2013. — URL:

http://www.R-project.org/.

150 Генераторы тестов для алгоритмов реше-

ния задачи о максимальном потоке. — URL:

http://www.informatik.uni-trier.de/~naeher/Professur/research.

Page 189: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

189

151 Задача «Ships» из архива задач Timus Online Judge. — URL:

http://acm.timus.ru/problem.aspx?num=1115.

Page 190: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

190

ПУБЛИКАЦИИ АВТОРА ПО ТЕМЕ ДИССЕРТАЦИИ

Статьи в журналах из перечня ВАК

152 Буздалов М. В. Генерация тестов для олимпиадных задач по про-

граммированию с использованием генетических алгоритмов // Научно-

технический вестник СПбГУ ИТМО. — 2011. — 2(72). — С. 72—77.

153 Буздалов М. В. Генерация тестов для олимпиадных задач по теории гра-

фов с использованием эволюционных стратегий // Научно-технический

вестник СПбГУ ИТМО. — 2011. — 6(76). — С. 123—127.

Публикации в рецензируемых изданиях, индексируемых Web of

Science или Scopus

154 Buzdalov M. Generation of Tests for Programming Challenge Tasks Us-

ing Evolution Algorithms // Proceedings of Genetic and Evolutionary

Computation Conference Companion. — ACM, 2011. — P. 763–766.

155 Buzdalov M. Generation of Tests for Programming Challenge Tasks on

Graph Theory using Evolution Strategy // Proceedings of the Interna-

tional Conference on Machine Learning and Applications. Vol. 2. — IEEE

Computer Society, 2012. — P. 62–65.

156 Buzdalov M., Buzdalova A. Adaptive Selection of Helper-Objectives for

Test Case Generation // 2013 IEEE Congress on Evolutionary Compu-

tation. Vol. 1. — 2013. — P. 2245–2250.

157 Buzdalova A., Buzdalov M., Parfenov V. Generation of Tests for Pro-

gramming Challenge Tasks Using Helper-Objectives // 5th International

Symposium on Search-Based Software Engineering. — Springer, 2013.

— P. 300–305. — (Lecture Notes in Computer Science ; 8084).

Page 191: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

191

158 Buzdalov M., Buzdalova A., Petrova I. Generation of Tests for Program-

ming Challenge Tasks Using Multi-Objective Optimization // Proceed-

ings of Genetic and Evolutionary Computation Conference Companion.

— ACM, 2013. — P. 1655–1658.

159 Arkhipov V., Buzdalov M., Shalyto A. Worst-Case Execution Time Test

Generation for Augmenting Path Maximum Flow Algorithms using Ge-

netic Algorithms // Proceedings of the International Conference on Ma-

chine Learning and Applications. Vol. 2. — IEEE Computer Society,

2013. — P. 108–111.

160 Buzdalov M., Shalyto A. Worst-Case Execution Time Test Generation for

Solutions of the Knapsack Problem using a Genetic Algorithm // Proceed-

ings of 9th International Conference on Bio-inspired Computing: Theories

and Applications. — Springer, 2014. — P. 1–10. — (Communications in

Computer and Information Science ; 472).

161 Worst-Case Execution Time Test Generation using Genetic Algorithms

with Automated Construction and Online Selection of Objectives / N.

Kravtsov, M. Buzdalov, A. Buzdalova, A. Shalyto // Proceedings of 20th

International Conference on Soft Computing MENDEL 2014. — Czech

Republic, 2014. — P. 111–116.

162 Buzdalov M. A Switch-and-Restart Algorithm with Exponential Restart

Strategy for Objective Selection and its Runtime Analysis // Proceedings

of the International Conference on Machine Learning and Applications.

— IEEE Computer Society, 2014. — P. 141–146.

Другие публикации

163 Буздалов М. В. Применение генетических алгоритмов для определе-

ния неэффективных решений олимпиадных задач по программирова-

нию (на примере задачи о рюкзаке) // Труды Третьей Всероссийской

Page 192: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

192

конференции «Нечеткие системы и мягкие вычисления». Т. 2. — 2009.

— С. 16—24.

164 Буздалов М. В. Генерация тестов для олимпиадных задач по програм-

мированию с использованием эволюционных стратегий // Материалы

Второй межвузовской научной конференции по проблемам информати-

ки СПИСОК. — 2011. — С. 336—338.

165 Буздалов М. В. Применение эволюционных алгоритмов для покрытия

кода тестами // Материалы Всероссийской научной конференции по

проблемам информатики СПИСОК. — 2012. — С. 404—408.

166 Буздалова А. С., Буздалов М. В. Использование вспомогательных

функций приспособленности для тестирования решений олимпиадных

задач по программированию // Материалы Всероссийской научной кон-

ференции по проблемам информатики СПИСОК. — 2013. — С. 548—555.

167 Якорев В. О., Буздалов М. В. Генерация тестов для олимпиадных задач

по программированию с помощью многокритериальных эволюционных

алгоритмов // Материалы Всероссийской научной конференции по про-

блемам информатики СПИСОК. — 2013. — С. 571—573.

168 Буздалов М. В., Буздалова А. С. Асимптотически оптимальные алго-

ритмы для выбора вспомогательных критериев оптимизации // Мате-

риалы Всероссийской научной конференции по проблемам информати-

ки СПИСОК. — 2014. — С. 324—329.

Page 193: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

193

ПРИЛОЖЕНИЕ А. НЕКОТОРЫЕ РЕШЕНИЯ ЗАДАЧИ

«SHIPS. VERSION 2»

А.1. Решение 2 558 302 (язык C++)

#inc lude <iostream>

#inc lude <algorithm>

#inc lude <ctime>

#inc lude <cs td io>

#inc lude <c s td l i b >

#inc lude <c s t r i ng >

us ing namespace std ;

i n t n ,m, a [ 1 0 2 ] , c [ 1 2 ] , o rder [ 1 0 2 ] , path [ 1 0 0 0 2 ] ;

i n t ans [ 1 2 ] [ 1 0 2 ] , t o t [ 1 2 ] , p [ 1 2 ] ;

boo l used [ 1 0 2 ] , can [ 1 0 0 0 2 ] ;

i n l i n e void Pr int ( )

{

f o r ( i n t i =1; i<=m; i++) {

p r i n t f ( "%d\n" , to t [ i ] ) ;

f o r ( i n t j =0; j<to t [ i ] ; j++)

p r i n t f ( "%d " , a [ ans [ i ] [ j ] ] ) ;

p r i n t f ( "\n" ) ;

}

e x i t ( 0 ) ;

}

i n l i n e void DP( in t m)

{

memset ( can , 0 , s i z e o f ( can ) ) ;

can [ 0 ]=1 ;

f o r ( i n t i =1; i<=n ; i++)

i f ( ! used [ o rder [ i ] ] ) {

i n t j=order [ i ] ;

f o r ( i n t k=m; k>=a [ j ] ; k−−)

Page 194: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

194

i f ( ! can [ k ] && can [ k−a [ j ] ] ) {

can [ k ]=1;

path [ k]= j ;

}

}

}

i n l i n e void Search ( i n t k )

{

i f (k>m) Pr int ( ) ;

i n t s=0;

f o r ( i n t i=k ; i<=m; i++)

s=max( s , c [ i ] ) ;

DP( s ) ;

f o r ( i n t i=k ; i<=m; i++)

i f ( ! can [ c [ i ] ] ) r e turn ;

i n t now=p [ k ] ;

t o t [ now]=0;

f o r ( i n t i=c [ k ] ; i ; i−=a [ path [ i ] ] )

ans [ now ] [ t o t [ now]++]=path [ i ] ;

f o r ( i n t i =0; i<to t [ now ] ; i++)

used [ ans [ now ] [ i ] ]=1 ;

Search (k+1) ;

f o r ( i n t i =0; i<to t [ now ] ; i++)

used [ ans [ now ] [ i ] ]=0 ;

}

i n t main ( )

{

srand ( time (0 ) ^19930130) ;

s can f ( "%d%d",&n,&m) ;

f o r ( i n t i =1; i<=n ; i++)

scan f ( "%d" ,&a [ i ] ) ;

f o r ( i n t i =1; i<=m; i++)

scan f ( "%d" ,&c [ i ] ) ;

Page 195: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

195

f o r ( i n t i =1; i<=n ; i++)

order [ i ]= i ;

f o r ( i n t i =1; i<=m; i++)

p [ i ]= i ;

f o r ( ; ; ) {

f o r ( i n t i =1; i <=10000; i++) {

in t x=rand ( )%n+1;

i n t y=rand ( )%n+1;

swap ( order [ x ] , o rder [ y ] ) ;

}

f o r ( i n t i =1; i<=m; i++) {

in t x=rand ( )%m+1;

i n t y=rand ( )%m+1;

swap ( c [ x ] , c [ y ] ) ;

swap (p [ x ] , p [ y ] ) ;

}

Search (1 ) ;

}

return 0 ;

}

А.2. Решение 2 208 365 (язык Pascal)

program aa ;

const

maxm = 10+2;

maxn = 100+5;

maxs = 10000;

var

f : array [ 0 . . maxn , 0 . . maxs ] o f boolean ;

l e f t : array [ 1 . . maxn ] o f l o ng i n t ;

row , idrow : array [ 1 . .maxm] o f l ong i n t ;

ship , id , belong : array [ 1 . . maxn ] o f l o ng i n t ;

i , j , k , tmp , n ,m: l ong i n t ;

procedure I n i t ;

beg in

Page 196: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

196

read ln (n ,m) ;

f o r i :=1 to n do read ln ( sh ip [ i ] ) ;

f o r i :=1 to m do

begin

read ln ( row [ i ] ) ;

idrow [ i ] := i ;

end ;

f o r i := 1 to m do

f o r j := i+1 to m do i f row [ i ]<row [ j ] then

begin

tmp:=row [ i ] ; row [ i ] := row [ j ] ; row [ j ] :=tmp ;

tmp:= idrow [ i ] ; idrow [ i ] := idrow [ j ] ; idrow [ j ] :=tmp ;

end ;

f o r i := 1 to n do id [ i ] := i ;

end ;

procedure p r i n t ;

beg in

f o r i := 1 to m do

begin

k :=0;

f o r j :=1 to n do i f idrow [ belong [ j ] ]= i then

inc (k ) ;

wr i t e l n ( k ) ;

f o r j :=1 to n do i f idrow [ belong [ j ] ]= i then

wr i t e ( sh ip [ j ] , ’ ’ ) ;

w r i t e l n ;

end ;

ha l t ;

end ;

procedure d f s ( x : l o ng i n t ) ;

var

i , t o t : l o ng i n t ;

beg in

i f x=0 then Pr int ;

Page 197: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

197

//dp

to t :=0; k :=0;

f o r i := 1 to n do i f be long [ id [ i ] ]=0 then

begin

inc ( to t ) ; l e f t [ t o t ] := id [ i ] ;

i n c (k , sh ip [ id [ i ] ] ) ;

end ;

f [ 0 , 0 ] := true ;

f o r i := 1 to to t do f i l l c h a r ( f [ i ] , k+1, f a l s e ) ;

k :=0;

f o r i := 1 to to t do

begin

f o r j := 0 to k do i f f [ i −1, j ] then

begin

f [ i , j ] := true ; f [ i , j+sh ip [ l e f t [ i ] ] ] : = true ;

end ;

inc (k , sh ip [ l e f t [ i ] ] ) ;

end ;

k :=0;

f o r i := 1 to x do

begin

i f not f [ tot , row [ i ] ] then e x i t ;

i f not f [ tot −1,row [ i ] ] then inc ( k ) ;

end ;

i f k>1 then ex i t ;

k := row [ x ] ;

f o r i := to t downto 1 do i f not f [ i −1,k ] then

begin

belong [ l e f t [ i ] ] := x ;

dec ( k , sh ip [ l e f t [ i ] ] ) ;

end ;

Page 198: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

198

d f s (x−1) ;

f o r i := 1 to n do i f be long [ i ]=x then belong [ i ] :=0 ;

end ;

procedure Main ;

beg in

f [ 0 , 0 ] := true ;

whi l e t rue do

begin

f o r i := 1 to n do

begin

j :=random(n)+1;

k:=random(n)+1;

tmp:= id [ j ] ; id [ j ] := id [ k ] ; id [ k ] :=tmp ;

end ;

d f s (m) ;

end ;

end ;

beg in

I n i t ;

Main ;

end .

А.3. Решение 2 072 705 (язык C++)

#inc lude <s td i o . h>

#inc lude <s t d l i b . h>

#inc lude <memory . h>

#inc lude <time . h>

in t N, M, tmp = 0 ;

i n t Rx [ 1 5 ] [ 2 ] , R [ 1 5 ] [ 2 ] , S [ 1 0 5 ] , v i s [ 1 0 5 ] ;

char va l i d [ 1 5 ] [ 2 0 0 0 0 ] ;

i n t search ( i n t x , i n t y ) {

Page 199: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

199

i f ( c l o ck ( ) > 250000 && tmp < 1) return 0 ;

i f ( c l o ck ( ) > 500000 && tmp < 2) return 0 ;

i f (R[ x ] [ 0 ] == 0){

memset ( va l i d [ x + 1 ] , 0 , s i z e o f ( i n t ) ∗ 301) ;

va l i d [ x + 1 ] [ 0 ] = 1 ;

f o r ( i n t i = 0 ; i < N; i ++){

i f ( v i s [ i ] != −1) cont inue ;

f o r ( i n t j = 300 ; j >= 0 ; j −−)

va l i d [ x + 1 ] [ j + S [ i ] ] |= va l i d [ x + 1 ] [ j ] ;

}

f o r ( i n t i = 0 ; i < M; i ++)

i f (R[ i ] [ 0 ] <= 300 && ! va l i d [ x + 1 ] [R[ i ] [ 0 ] ] ) r e turn 0 ;

return search (x + 1 , 0) ;

}

i f ( y >= N | |

(R[ x ] [ 0 ] <= 300 && ! va l i d [ x ] [R[ x ] [ 0 ] ] ) | |

(R[ x ] [ 0 ] <= 19000 && ! va l i d [ 0 ] [R[ x ] [ 0 ] ] ) ) r eturn 0 ;

i f ( x >= M − 1) {

f o r ( i n t i = 0 ; i < N; i ++)

i f ( v i s [ i ] == −1) v i s [ i ] = M − 1 ;

f o r ( i n t i = 0 ; i < M; i ++){

in t p , count = 0 ;

f o r ( i n t j = 0 ; j < M; j ++)

i f (R[ j ] [ 1 ] == i ) p = j ;

f o r ( i n t j = 0 ; j < N; j ++) count += ( v i s [ j ] == p) ;

p r i n t f ( "%d\n" , count ) ;

f o r ( i n t j = 0 ; j < N; j ++)

i f ( v i s [ j ] == p) p r i n t f ( "%d " , S [ j ] ) ;

p r i n t f ( "\n" ) ;

}

return 1 ;

}

whi l e (S [ y ] > R[ x ] [ 0 ] ) y ++;

whi l e ( v i s [ y ] != −1) y ++;

i n t yx = y ;

Page 200: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

200

whi l e (S [ yx ] == S [ y ] ) yx ++;

i f ( search (x , yx ) ) return 1 ;

R[ x ] [ 0 ] −= S [ y ] ;

v i s [ y ] = x ;

i f ( search (x , y + 1) ) return 1 ;

v i s [ y ] = −1;

R[ x ] [ 0 ] += S [ y ] ;

r e turn 0 ;

}

i n t i n l i n e qCmp( void const ∗a , vo id const ∗b) {

return ∗( i n t ∗) a − ∗( i n t ∗)b ;

}

i n t i n l i n e qCmp2( void const ∗a , vo id const ∗b) {

return ∗( i n t ∗)b − ∗( i n t ∗) a ;

}

i n t main ( void ) {

memset ( v i s , 255 , s i z e o f ( v i s ) ) ;

s can f ( "%d%d" , &N, &M) ;

f o r ( i n t i = 0 ; i < N; i ++) scan f ( "%d" , &S [ i ] ) ;

f o r ( i n t i = 0 ; i < M; i ++) scan f ( "%d" , &Rx [ i ] [ 0 ] ) ;

f o r ( i n t i = 0 ; i < M; i ++) Rx[ i ] [ 1 ] = i ;

memset ( va l id , 0 , s i z e o f ( va l i d ) ) ;

va l i d [ 0 ] [ 0 ] = 1 ;

f o r ( i n t i = 0 ; i < N; i ++)

f o r ( i n t j = 19000; j >= 0 ; j −−)

va l i d [ 0 ] [ j + S [ i ] ] |= va l i d [ 0 ] [ j ] ;

memcpy(R, Rx , s i z e o f (Rx) ) ;

q so r t (S , N, s i z e o f ( i n t ) , qCmp2) ;

q so r t (R, M, s i z e o f ( i n t ) ∗ 2 , qCmp) ;

i f ( ! search (0 , 0) ) {

memset ( v i s , 255 , s i z e o f ( v i s ) ) ;

memset ( va l id , 0 , s i z e o f ( va l i d ) ) ;

Page 201: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

201

va l i d [ 0 ] [ 0 ] = 1 ;

f o r ( i n t i = 0 ; i < N; i ++)

f o r ( i n t j = 19000; j >= 0 ; j −−)

va l i d [ 0 ] [ j + S [ i ] ] |= va l i d [ 0 ] [ j ] ;

memcpy(R, Rx , s i z e o f (Rx) ) ;

q so r t (S , N, s i z e o f ( i n t ) , qCmp) ;

q so r t (R, M, s i z e o f ( i n t ) ∗ 2 , qCmp) ;

tmp = 1 ;

i f ( ! search (0 , 0) ) {

memset ( v i s , 255 , s i z e o f ( v i s ) ) ;

memset ( va l id , 0 , s i z e o f ( va l i d ) ) ;

va l i d [ 0 ] [ 0 ] = 1 ;

f o r ( i n t i = 0 ; i < N; i ++)

f o r ( i n t j = 19000; j >= 0 ; j −−)

va l i d [ 0 ] [ j + S [ i ] ] |= va l i d [ 0 ] [ j ] ;

memcpy(R, Rx , s i z e o f (Rx) ) ;

q so r t (S , N, s i z e o f ( i n t ) , qCmp2) ;

q so r t (R, M, s i z e o f ( i n t ) ∗ 2 , qCmp2) ;

tmp = 2 ;

search (0 , 0) ;

}

}

}

А.4. Решение 1 700 736 (язык C++)

#inc lude <s td i o . h>

#inc lude <s t r i n g . h>

#inc lude <s t d l i b . h>

const i n t maxn=100+5;

const i n t maxsize=maxn∗maxn ;

i n t n ,m,A[maxn ] ,K[maxn ] , L [maxn ] ,R[maxn ] ,P [maxn ] , ID [maxn ] ;

i n t s i z e ,Q[ maxsize ] , f [ maxsize ] ;

boo l used [maxn ] ;

Page 202: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

202

i n l i n e void swap ( i n t &a , i n t &b)

{

i n t t=a ;

a=b ;

b=t ;

}

void randomize ( i n t A[ ] , i n t n)

{

f o r ( i n t i =1; i<=n ; i++)

{

in t p=i+rand ( )%(n−i +1) ;

swap (A[ i ] ,A[ p ] ) ;

}

}

i n t main ( )

{

srand (1028) ;

s can f ( "%d%d",&n,&m) ;

f o r ( i n t i =1; i<=n ; i++) scan f ( "%d" ,&A[ i ] ) ;

f o r ( i n t i =1; i<=m; i++) scan f ( "%d" ,&L [ i ] ) ;

f o r ( i n t i =1; i<=n ; i++) P[ i ]= i ;

f o r ( i n t i =1; i<=m; i++) ID [ i ]= i ;

f o r ( i n t step =1;1 ; s tep++)

{

f o r ( i n t i =1; i<=m; i++)

f o r ( i n t j=i +1; j<=m; j++)

i f (L [ ID [ j ] ] <L [ ID [ i ] ] )

swap ( ID [ i ] , ID [ j ] ) ;

i f ( s t ep==1)

f o r ( i n t i =1; i<=n ; i++)

f o r ( i n t j=i +1; j<=n ; j++)

i f (A[P[ j ] ] <A[P[ i ] ] )

swap (P[ i ] ,P [ j ] ) ;

memset ( used , f a l s e , s i z e o f ( used ) ) ;

Page 203: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

203

i n t Tv=0;

f o r (Tv=1;Tv<=m;Tv++)

{

in t v=ID [Tv ] ;

i f (Tv==m)

{

f o r ( i n t i =1; i<=n ; i++) i f ( ! used [ i ] ) R[ i ]=v ;

cont inue ;

}

i n t L0=L [ v ] ;

i f ( step >1) randomize (P, n ) ;

f [ 0 ]=0 ;

memset ( f +1 ,255 ,L0∗ s i z e o f ( i n t ) ) ;

Q[ s i z e =1]=0;

f o r ( i n t i =1; i<=n ; i++)

i f ( ! used [P[ i ] ] && f [ L0]==−1)

i f ( s i z e <=(L0>>2))

f o r ( i n t _size=s i z e , c l =1; c l<=_size ; c l++)

{

in t t=Q[ c l ]+A[P [ i ] ] ;

i f ( t<=L0 && f [ t ]==−1)

f [ t ]= i ,Q[++s i z e ]= t ;

}

e l s e

{

i n t now=A[P[ i ] ] ;

f o r ( i n t k=L0 ; k>=now ; k−−)

i f ( f [ k]==−1 && f [ k−now]!=−1)

f [ k]= i ;

}

i f ( f [ L0]==−1) break ;

f o r ( i n t k=L0 ; k>0;k−=A[P[ f [ k ] ] ] )

R[P[ f [ k ] ] ]= v , used [P[ f [ k ] ] ]= true ;

}

i f (Tv<=m) cont inue ;

Page 204: Буздалов Максим Викторовичis.ifmo.ru/disser/buzdalov-dissertation.pdf · с использованием эволюционных алгоритмов Специальность

204

f o r ( i n t i =1; i<=m; i++)

{

in t C=0;

f o r ( i n t k=1;k<=n ; k++) C+=(in t ) (R[ k]== i ) ;

p r i n t f ( "%d\n" ,C) ;

f o r ( i n t k=1;k<=n ; k++) i f (R[ k]== i ) p r i n t f ( "%d " ,A[ k ] ) ;

p r i n t f ( "\n" ) ;

}

break ;

}

return 0 ;

}