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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    32,64 Кб
  • Опубликовано:
    2014-03-11
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Санкт-Петербургский Государственный Политехнический Университет

кафедра прикладной математики











Курсовая работа по методам оптимизации:

«Решение задач оптимизации генетическими алгоритмами

на примере задачи коммивояжера»


Студент Кацман Виктор, группа 33601/2

Оглавление

Введение

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

1.1 Общее описание задачи

1.2 Формальная постановка

2. Общее описание генетического алгоритма

2.1 Формализация задачи для решения генетическим алгоритмом

2.2 Общая схема алгоритма

2.3 Подробный разбор некоторых элементов алгоритма

3. Описание алгоритмов решения задачи

3.1 Алгоритм полного перебора

3.2 Алгоритм динамического программирования

3.3 Генетический алгоритм

4. Описание исследований и их результатов

4.1 Перечень тестировавшихся алгоритмов

4.2 Тест на задачах малой размерности

4.3 Тест на задачах средней размерности

4.4 Тест на задачах высокой размерности

4.5 Тест для исследования «алгоритма повторных применений» генетического алгоритма

Выводы

Литература

Введение

Данная работа посвящена исследованию возможности решать дискретные оптимизационные задачи с помощью генетических алгоритмов. Исследования проводились на примере решения «несимметричной незамкнутой задачи коммивояжера» - известной комбинаторной NP-трудной задачи, для которой наилучший известный на данный момент точный алгоритм работает с асимптотикой O(2^n). В ходе исследований результаты работы генетического алгоритма сравнивались с результатами работы с решением «несимметричной незамкнутой задачи коммивояжера» динамическим программированием по таким параметрам, как время работы, точность результата и объем используемой памяти на различных входных данных.

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


.1 Общее описание задачи

Коммивояжер - странствующий торговец должен объехать N городов. Известны затраты на переезд между i-ым и j-ым городами, которые заданы в виде матрицы C = (c[i][j]), i = 1..N, j = 1..N. Коммивояжер должен объехать все города один раз. Требуется определить, в каком порядке следует объезжать города, чтобы суммарные затраты были минимальны.

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

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

.2 Формальная постановка

На вход получаем матрицу затрат C = (c[i][j]), i = 1..N, j = 1..N, c[i][j] - затраты на переезд из i-го города в  j-ый, c[i][j] неотрицательно, ограниченно; при желании запретить переезд из i-го города в j-ый следует сделать c[i][j] максимально большим.

Существует несколько вариантов выбора переменных для данной задачи:

. В качестве переменных выбираем элементы матрицы переездов X = (x[i][j]), i = 1..N, j = 1..N, x[i][j] = {0,1}; x[i][j] = 1, если переезд из i-го города в j-ый включается в маршрут и x[i][j] = 0, если переезд из i-го города в j-ый не включается в маршрут. Получаем следующую задачу:

2. В качестве переменных выбираем элементы «вектора номеров городов» X = (x[i]), i = 1..N, x[i] ; ∀j ≠ k: x[j] ≠ x[k]. Получаем следующую задачу:

 

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


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

.1 Формализация задачи для решения генетическим алгоритмом

Задача формализуется таким образом, чтобы её решение могло быть закодировано в виде вектора <#"724410.files/image003.gif"> N^2.

Алгоритм поиска N-ой статистики:

partition (arr, l, r)

{= arr[r];= l - 1;(j = l; j < r - 1; j++)

{(arr[j] <= x)

{++; (i != j)

{[j] += arr[i];[i] = arr[j] - arr[i];[j] = arr[j] - arr[i];

}

}

}++;(i != r){ arr[r] += arr[i]; arr[i] = arr[r] - arr[i]; arr[r] = arr[r] - arr[i];}i;

}

_partition (arr, l, r)

{= rand () % (r - l) + l;(i != r){ arr[r] += arr[i]; arr[i] = arr[r] - arr[i]; arr[r] = arr[r] - arr[i];}partition (arr, l, r);

}

_i_min (arr, l, r, i)

{(l == r) return arr[l];= rand_partition (arr, l, r);= q - l + 1;(i == k) return arr[k];if (i < k) return choose_i_min (arr, l, q - 1, i);return choose_i_min (arr, q + 1, r, i - k);

}

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

. Критерий сходимости популяции:

В исследованиях использовалось два критерия сходимости популяции: по прохождении определенного числа итераций и по достижению модулем разности между минимальным значением функции приспособленности и N-ой статистики выборки из функций приспособленности всех особей числа меньшего некоторого ε > 0.

. Код основной части алгоритма:

solution_not_found = 1;

while (solution_not_found)

{(i = 0; i < cur_size; i++) {arr[i] = generation[i]->min;}_min = choose_i_min (arr, 0, cur_size - 1, G.size);

с = 0;(i = 0; i < cur_size; i++)

{(generation[i]->min <= k_min && с <= G.alloc*2)

{= generation[i];[i] = generation[с];[с++] = ext;

}

}_size = с;

//crossover(i = 0; i < cur_size; i++)

{(j = i+1; j < cur_size; j++)

{(!isEqual(generation[i], generation[j]))

{(crossover(generation[i], generation[j], &(generation[с]), &(generation[с + 1])))

с += 2;

}

}

}_size = с;

//mytationsmin_genmin = UINT_MAX;(i = 0; i < cur_size; i++) {(min_genmin > generation[i]->min) {min_genmin = generation[i]->min;}

}(mytations)

{(i = 0; i < cur_size; i++)

{(generation[i]->min == min_genmin) continue;= mytation (generation[i], ext1, ext2);= generation[i];[i] = ext3;= ext;

}

}_genmin = UINT_MAX;(i = 0; i < cur_size; i++) {(min_genmin > generation[i]->min) {min_genmin = generation[i]->min; solution_ind = i;}

}(min_genmin + eps > k_min) solution_not_found = 0;

}

. Оценки алгоритма:

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

·        O(N^3) памяти: O(N) требуется для хранения одной особи, максимально возможный размер популяции (перед отбором) составляет O(N^2).

·        O(N^3) времени на одну итерацию (наибольшее время уходит на кроссовер: требуется O(N^2) операций кроссовера, трудоемкость каждой из которых O(N))

Оценка трудоемкости всего алгоритма зависит от выбранного критерия сходимости популяции: в случае выбора первого критерия - O(N^3 * M), где M - число итераций; в случае второго критерия теоретическая оценка затруднительна в связи с разнообразным набором возможных входных данных, практическая оценка будет приведена ниже.

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

4. Описание исследований и их результатов

.1 Перечень тестировавшихся алгоритмов

Таблица 4.1

Номер алгоритма

Описание

1

Алгоритм полного перебора

2

Алгоритм динамического программирования

3

Генетический алгоритм с кроссовером «по частям», «цикличекой» мутацией для двух городов и 1 итерацией

4

Генетический алгоритм с кроссовером «по частям», «цикличекой» мутацией для двух городов и 2 итерациями

5

Генетический алгоритм с кроссовером «по частям», «цикличекой» мутацией для двух городов и 5 итерациями

6

Генетический алгоритм с одноточечным кроссовером, «цикличекой» мутацией для одного города и вторым критерием сходимости

7

Генетический алгоритм с одноточечным кроссовером, «не цикличекой» мутацией для одного города и вторым критерием сходимости

8

Генетический алгоритм с одноточечным кроссовером, «цикличекой» мутацией для двух городов и вторым критерием сходимости

9

Генетический алгоритм с одноточечным кроссовером, «не цикличекой» мутацией для двух городов и вторым критерием сходимости

10

Генетический алгоритм с одноточечным кроссовером, «смешенной» мутацией для двух городов и вторым критерием сходимости

11

Генетический алгоритм с двухточечным кроссовером, «цикличекой» мутацией для одного города и вторым критерием сходимости

12

Генетический алгоритм с двухточечным кроссовером, «не цикличекой» мутацией для одного города и вторым критерием сходимости

13

Генетический алгоритм с двухточечным кроссовером, «цикличекой» мутацией для двух городов и вторым критерием сходимости

14

Генетический алгоритм с двухточечным кроссовером, «не цикличекой» мутацией для двух городов и вторым критерием сходимости

15

Генетический алгоритм с двухточечным кроссовером, «смешенной» мутацией для двух городов и вторым критерием сходимости

16

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

17

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

18

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

19

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

20

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

21

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


.2 Тест на задачах малой размерности

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

Тест включает в себя по 100 задач каждой из размерностей 5, 6, 7, 9, 10, матрица ограничений содержит значения от 0 до 1000.

Результаты тестов (в левом столбце указаны номера алгоритмов, в остальных - результаты для соответствующей размерности входных данных; в ячейке указано время работы в тактах процессора и точность результата в виде частного разности между полученными и точными решениями и 1000 - верхнего ограничения данных):

Таблица 4.2

№ алгоритма

5 городов

6 городов

7 городов

9 городов

10 городов

1

47940, 0

297555, 0

1999074, 0

125613126, 0

1159747715, 0

2

41012,0

125366, 0

293429, 0

2613265, 0

5285576, 0

3

245434, 0.310

329121, 0.535

352885, 0.644

548858, 1.352

597877, 1.312

4

383212, 0.210

540357, 0.423

608930, 0.483

871349, 1.013

1119372, 1.657

5

524690, 0.210

885583, 0.280

788040, 0.500

1712369, 0.727

1977881, 1.044

6

535421, 0.173

768059, 0.249

724162, 0.362

1544689, 0.682

1864501, 0.726

7

446293, 0.144

780759, 0.285

795200, 0.375

1298272, 0.859

1663050, 0.900

8

457493, 0.162

864851, 0.269

1119195, 0.359

2834889, 0.455

3380160, 0.621

9

615445, 0.195

885784, 0.263

1072128, 0.397

1871712, 0.648

2276078, 0.661

10

600075, 0.172

1002164, 0.253

989799, 0.333

2426724, 0.578

2869449, 0.641

11

463795, 0.155

727924, 0.267

737878, 0.413

1439068, 0.625

1688384, 0.850

12

384893, 0.169

718982, 0.315

668836, 0.503

1107253, 0.902

1824984, 0.970

13

731393, 0.104

904013, 0.265

1131401, 0.344

2778641, 0.561

3445356, 0.713

14

664261, 0.174

1068748, 0.277

794839, 0.446

1806951, 0.744

2347263, 0.887

15

890573, 0.172

969951, 0.232

1098898, 0.384

2056957, 0.619

2616159, 0.843

16

477237, 0.212

633770, 0.384

622857, 0.483

1244565, 0.745

1482849, 0.917

17

447806, 0.290

663264, 0.357

584099, 0.656

1068022, 0.936

1518663, 1.059

18

676178, 0.161

737040, 0.299

811023, 0.498

1810618, 0.726

1687509, 1.111

19

666856, 0.173

690027, 0.379

813683, 0.470

1754136, 0.740

2042246, 0.970

20

745182, 0.171

666424, 0.333

785375, 0.486

1786601, 0.834

1926489, 1.017

21

315644, 0.444

346189, 0.704

401958, 0.972

676170, 1.491

966292, 1.759


По результатам данного теста хорошо видна нецелесообразность использования алгоритма полного перебора для решения «задачи коммивояжера». Также можно заметить нецелесообразность использования генетического алгоритма без мутаций (21), потому как и время его работы и ошибка по сравнению с точным результатом растет быстрее, чем, например, у 3-его алгоритма (с одноточечным кроссовером и «циклической» мутацией для одного города и одной итерации).

Кроме того, из проведенных исследований следует, что для решения «задач коммивояжера» малой размерности лучше подходит алгоритм динамического программирования (и по времени и по точности).

.3 Тест на задачах средней размерности

Данный тест представляют собой «несимметричные незамкнутые задачи коммивояжера» при количестве городов порядка 15-19, даются программе на вход в виде матрицы затрат. Использовался этот тест для исследования времени и точности работы генетического алгоритма на задачах средней размерности.

Тест включает в себя по 100 задач каждой из размерностей 15, 17, 19, матрица ограничений содержит значения от 0 до 1000.

Результаты тестов (в левом столбце указаны номера алгоритмов, в остальных - результаты для соответствующей размерности входных данных; в ячейке указано время работы в тактах процессора и точность результата в виде частного разности между полученными и точными решениями и 1000 - верхнего ограничения данных):

Таблица 4.3

№ алгоритма

15 городов

17 городов

19 городов

2

828575405, 0

4246515380, 0

21546365063, 0

3

1295253, 3.423

1685045, 4.166

2079217, 4.806

4

2228001, 2.970

2668267, 3.555

3517825,  4.137

5

3880801, 2.076

5693568, 2.548

6252386, 3.284

6

5179881, 1.574

8415665, 2.026

8612602, 2.550

7

4958129, 1.899

6020746, 2.289

8591202, 2.737

8

10007204, 1.464

12485682, 2.057

16063651, 2.507

9

7316538, 1.650

7442943, 2.435

11470503, 2.493

10

9035033, 1.425

12441862, 1.929

13588687, 2.536

11

6000724, 1.628

8024809, 1.819

11880129, 2.342

12

5195162, 1.843

6084621, 2.455

10374952, 2.439

13

11586620, 1.615

14710175, 1.874

18723471, 2.453

14

7425435, 1.602

8180333, 2.392

11759932, 2.856

15

10333317, 1.623

12357801, 2.122

16337563, 2.271

16

4556540, 1.943

5590378, 2.429

8760769, 2.496

17

4203885, 2.059

6003484, 2.466

18

5953596, 2.005

7104790, 2.363

11222184, 2.694

19

5925075, 1.924

7754152, 2.508

8975546, 3.158

20

5961760, 1.911

8121099, 2.246

10559025, 2.718


По результатам данного теста хорошо видна нецелесообразность использования динамического программирования для решения «задачи коммивояжера» ввиду больших временных затрат. Трудоемкость работы генетического алгоритма на основе исследований составляет o(N^4), что позволяет надеяться на достаточно быстрое решение задачи высокой размерности. Плохую тенденцию представляет ухудшение точности: средняя разность между полученным и оптимальным значениями растет быстрее, чем линейно относительно N*1000 (1000 - верхняя граница данных). Для решения этой проблемы можно применять алгоритм несколько раз и брать наилучший результат, это может привести к лучшему результату в связи со случайными генерациями мутаций.

.4 Тест на задачах высокой размерности

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

Тест включает в себя по 100 задач каждой из размерностей 40, 60, 80, 100 матрица ограничений содержит значения от 0 до 1000.

Результаты тестов (в левом столбце указаны номера алгоритмов, в остальных - результаты для соответствующей размерности входных данных; в ячейке указано время работы в тактах процессора):

Таблица 4.4

№ алгоритма

40 городов

60 городов

80 городов

100 городов

3

13869657

38421970

55298795

75944467

4

26485951

58478116

65362540

89778728

5

47573750

116052555

158248183

203085649

6

91932504

852802560

406025090

599689705

7

89224844

689499528

209191128

502414416

8

145264977

235647929

510230755

849701034

9

109529934

134146799

390671209

734172264

10

128015246

224339695

470048851

829701318

11

100875795

114735950

542020450

715425804

12

91671430

118870453

384195168

433715360

13

120963588

223183049

484323760

914393247

14

104692106

200380730

385446547

870083172

15

160120583

191328739

371821962

717835433

16

73306764

154243932

400560900

879946371

17

72630789

215827892

605618957

744229511

18

87109040

169618046

336987348

687957487

19

99422589

281745930

514861598

778038679

20

90700406

170255103

352518951

787416156


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

·        На процедуры алгоритма выполняющиеся один раз за весь алгоритм независимо от количества итераций тратится примерно треть времени от первой итерации или одноитерационного алгоритма (следует из сравнения времен, затраченных алгоритмами со сходимостью по конечному числу итераций).

·        В среднем, в алгоритме со сходимостью по второму критерию проходит не более log(N)*5 итераций. Это подтверждает общую оценку трудоемкости алгоритма o(N^4).

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

·        «Не циклическая» мутация по двум городам работает медленнее, чем «циклическая» мутация по одному городу и дает не лучший результат (исходя из результатов предыдущих тестов), её использование в алгоритме нецелесообразно.

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

.5 Тест для исследования «алгоритма повторных применений» генетического алгоритма

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

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

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

Тест включает в себя по 5 задач каждой из размерностей 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 матрица ограничений содержит значения от 0 до 1000.

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

Таблица 4.5

Алгоритм

11

12

13

14

15

16

17

18

19

20

21

6, 11, 16

0.460

0.351

0.648

0.707

0.837

0.654

1.339

1.344

1.637

1.525

2.314

7, 12, 17

0.402

0.606

0.811

0.896

0.855

1.248

1.420

1.537

1.660

1.524

1.934

8, 13, 18

0.335

0.488

0.699

0.710

0.869

0.938

1.191

1.269

1.285

1.085

1.851

9, 14, 19

0.641

0.767

0.605

0.665

1.012

1.107

1.044

1.400

1.565

1.422

1.656

10, 15, 20

0.410

0.584

0.689

0.722

0.932

1.149

1.035

0.921

1.140

1.230

1.475

6, 9, 12, 15, 18

0.290

0.566

0.534

0.548

0.584

0.632

1.259

1.007

1.154

1.399

1.502

7, 10, 13, 16, 19

0.427

0.335

0.429

0.432

0.545

1.018

0.942

1.032

1.006

1.069

1.423

8, 11, 14, 17, 20

0.384

0.505

0.479

0.470

0.532

0.878

1.013

1.002

1.024

1.685

1.270

6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

0.150

0.271

0.322

0.341

0.525

0.578

0.796

0.808

1.052

0.945

0.972

10, 11, 13, 15

0.234

0.394

0.504

0.641

0.868

0.698

0.813

1.094

1.473

1.109

1.274

9, 11, 12, 13, 15, 16

0.229

0.390

0.496

0.606

0.704

0.690

0.993

0.962

1.282

0.921

1.438


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

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

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

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

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

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

Выводы

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

Литература

1. Д.И. Батищев, С.А. Исаев. Оптимизация многоэкстремальных функций с помощью генетических алгоритмов (1997)

2.      Д.И. Батищев, С.А. Исаев, Е.К. Ремер. Эволюционно-генетический подход к решению задач невыпуклой оптимизации (1998)

.        Р. Акоф, М. Сасиени, Основы исследования операций, Издательство «Мир», (1971).

.        Задачи оптимизации и нечеткие переменные (1980)

.        А.И. Орлов. Теория принятия решений (2004)

6.      R. Allenson. Genetic Algorithms with Gender for Multivariate Optimisation. (1992).

.        Blickle, Thiele "A Comparison of Selection Schemes used in Genetic Algorithms" (1993)

.        Darrel Whitley "A Genetic Algorithm Tutorial" (1993).

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!