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

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2004
Тип роботи:
Лабораторна робота
Предмет:
Проектування операційних систем, утиліт і драйверів
Група:
КСМ-5

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти І науки України національний університет “Львівська політехніка” Звіт по л.р. №3 Застосування генетичних алгоритмів для вирішення задачі комівояжера Виконав: студент гр. КСМ-5 Львів – 2004 Мета: ознайомитись з методами вирішення задач за допомогою генетичних алгоритмів та використати даний алгоритм для вирішення задачі комівояжера. Основні теоретичні відомості Еволюційні підходи до рішення наукових проблем   Використовуючи дарвіністську теорію походження життя, учені знайшли спосіб використання її принципів для рішення різних проблем.       ПРИНЦИП ЕВОЛЮЦІЇ - це головний біологічний фактор, що поєднує всі організми в історичний ланцюг подій. Кожен об'єкт у цьому ланцюзі є результатом серії "випадків", що відбувалися під впливом селективних факторів навколишнього середовища. Протягом багатьох поколінь випадкові зміни і природний добір додавали визначені обриси поводженню елементів співтовариства, щоб якнайкраще пристосується до середовища, що оточується, що змінюється.      Такі зміни можуть бути досить екстраординарними, чергове підтвердження, що еволюція творча. Незважаючи на те, що еволюція не має строго визначеної внутрішньої мети - це ефект фізичних законів, що впливають на популяцію індивідів і на кожен індивід окремо - вона створює рішення проблеми виживання, унікальні для кожного індивіда, і ці рішення геніальні.       Представте скількох корисного можна зробити, промоделювавши процес еволюції на комп'ютері. Еволюційне моделювання може надати кошти для рішення комплексних інженерних задач (з використанням хаотичних збурювань, ймовірнісного підходу, складної нелінійної динаміки), які не можна було вирішити традиційними методами. Уже з цієї причини ця область є однієї із самих швидко розвиваються в області комп'ютерних технологій; вона розглядає проблеми, що раніше не мали задовільного рішення, такі як, швидка розробка нових лікарських препаратів, гнучкі рішення задачі керування доставкою товарів, швидкий розрахунок тактики оборони при боях, і т.д. У майбутньому може здійснитися мрія штучного інтелекту: комп'ютер буде самонавчатися і зможе стати експертом у будь-якій обраній області. Результати виконання завдання (для 20 міст) Розглядається випадок для 20 міст із початковою популяцією 100 осіб і 1000 циклію розмноження. Тест 1.  Тест 2.  Висновок: таким чином дана лабораторна робота дала можливість ознайомитися з одним із методів вирішення задач оптимізації – генетичними алгоритмами. В якості тестової задачі розглядалася задача комівояжера, для якої було розроблено програму на основі еволюційного підходу і проведено ряд тестів. Аналізуючи результати можна сказати, якщо і отримані результати є не оптимальними, але вони є дуже близькими до таких. Лістінг програми: #include <stdio.h> #include <graphics.h> #include <alloc.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <math.h> #define СITIES 20 #define POPULATION 100 #define MUTATION 0 #define CROSSOVER 5 #define GENERATIONS 1000 #define RADIUS 2 #define MAXX 640 #define MAXY 480 int city_x[CITIES], city_y[CITIES]; double estimation[POPULATION*2]; int estimation_index[POPULATION*2]; int* buffer; int* generate_population(){ int i,j,k,city_exist,z; int *p,*pp; int individuum[CITIES]; for (i=0; i<CITIES; i++){ city_x[i]=random(MAXX); city_y[i]=random(MAXY); } p=(int*)calloc(2*POPULATION, CITIES*sizeof(int)); for (i=0; i<POPULATION ;i++){ for (j=0; j<CITIES; j++) individuum[j]=0; for (j=0; j<CITIES; j++){ k=random(CITIES); while (individuum[k]) k=(k+1)%CITIES; individuum[k]=1; *(p+i*CITIES+j)=k; } } return p; } void mutuate(int* a){ int k,x1,x2; k=random(100); if (k<MUTATION){ x1=random(CITIES); x2=random(CITIES); k=a[x1]; a[x1]=a[x2]; a[x2]=k; } } void correct(int* res,int k){ int i,single_gene[CITIES],element,z,l; for (i=0;i<CITIES;i++) single_gene[i]=0; for (i=0;i<CITIES;i++) single_gene[res[i]]=1; for (i=0;i<k;i++){ element=res[i]; for (z=k;z<CITIES;z++){ if (element==res[z]){ for (l=CITIES-1;l>=0;l--) if(!single_gene[l]) break; single_gene[l]=1; res[i]=l; break; } } } } void crossover(int *chromosome_a, int *chromosome_b, int *res_a, int *res_b){ int k,i; k=random(CITIES-1)+1; printf(" k= %u\n",k); for (i=0;i<k;i++){ res_a[i]=chromosome_b[i]; res_b[i]=chromosome_a[i]; } for (i=k;i<CITIES;i++){ res_a[i]=chromosome_a[i]; res_b[i]=chromosome_b[i]; } correct(res_a,k); correct(res_b,k); mutuate(res_a); mutuate(res_b); } double estimate_function(int *x){ int i,city; double length,dx,dy; dx=(double)(city_x[x[0]]-city_x[x[CITIES-1]]); dy=(double)(city_y[x[0]]-city_y[x[CITIES-1]]); length=sqrt(dx*dx+dy*dy); for (i=0; i<(CITIES-1);i++){ dx=(double)(city_x[x[i+1]]-city_x[x[i]]); dy=(double)(city_y[x[i+1]]-city_y[x[i]]); length+=sqrt(dx*dx+dy*dy); } return length; } void selection(int *population){ int i,j,changed,index,*p_dest,*p_src; double length; for (i=0;i<(POPULATION*2);i++){ estimation_index[i]=i; estimation[i]=estimate_function(population+i*CITIES); } changed=1; while (changed){ changed=0; for (i=0;i<(2*POPULATION-1);i++) if (estimation[i]>estimation[i+1]){ length=estimation[i+1]; estimation[i+1]=estimation[i]; estimation[i]=length; index=estimation_index[i+1]; estimation_index[i+1]=estimation_index[i]; estimation_index[i]=index; changed=1; } } for(i=0;i<POPULATION;i++){ p_dest=buffer+i*CITIES; p_src=population+estimation_index[i]*CITIES; for (j=0;j<CITIES;j++) { p_dest[j]=p_src[j]; } } for (i=0;i<POPULATION;i++){ p_dest=population+i*CITIES; p_src=buffer+i*CITIES; for (j=0;j<CITIES;j++) p_dest[j]=p_src[j]; } } void print_generation(int *p){ int i,j; for (i=0;i<2*POPULATION;i++){ for (j=0; j<CITIES;j++) printf("%2u ",*(p+i*CITIES+j)+1); printf("%g %u ",estimation[i],estimation_index[i]); putchar('\n'); } } void main(){ int *p,i,j,mode,driver=DETECT; clrscr(); randomize(); buffer=(int*)calloc(POPULATION,CITIES*sizeof(int)); p=generate_population(); for (i=0;i<GENERATIONS;i++){ for (j=0;j<POPULATION;j+=2){ crossover(p+j*CITIES,p+(j+1)*CITIES, p+(j+POPULATION)*CITIES,p+(j+1+POPULATION)*CITIES); } print_generation(p); selection(p); putchar('\n'); print_generation(p); putchar('\n'); } initgraph(&driver,&mode,""); for(i=0;i<CITIES;i++){ circle(city_x[p[i]],city_y[p[i]],RADIUS); line(city_x[p[i]],city_y[p[i]], city_x[p[(i+1)%CITIES]],city_y[p[(i+1)%CITIES]]); } getch(); closegraph(); free(p); free(buffer); }
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!