Documente Academic
Documente Profesional
Documente Cultură
Punerea problemei
Problema Comis-Voiajorului timp, caz in care costul unei muchii este egal cu timpul
neorientat doua
oricare ale
varfuri sunt
diferite unite
grafului
intre
V ' = {v i | i = 1,...,n 1}
asociate
determine un ciclu care sa inceapa oarecare treaca toate sa se dintr-un al grafului, o data varf sa prin si
multimea
varfurilor
oraselor de vizitat iar cu v0 varful plecare avea asociat initial orasului (baza), De de vom
exact
celelalte intoarca
varfuri in
V = V ' {v0 } .
regula
varful
notam cu lij lungimea muchiei dintre varfurile vi si vj sau cu cij costul muchiei asociat dintre
initial, ciclul indeplinind in plus conditia de a avea un cost minim. Costul unui ciclu este definit ca suma a costurilor atasate muchiilor componente. Numele problemei provine de la analogia cu un comis-
parcurgerii
varfurile vi si vj. In [1] si [2] este prezentat urmatorul algoritm euristic de tip greedy care furnizeaza o solutie a problemelor de tip comis-voiajor intr-un interval de timp polinomial. Astfel, este
voiajor care pleaca dintr-un oras, trebuie sa viziteze un numar de orase date si apoi sa se intoarca in orasul de plecare (de cu minim in de efort de
daca
(v0,v1,...,vk)
exemplu
minim
(vk,v0)
Reprezentarea grafului G
Fie: N = |V|, numarul variabila COST, care va contine costul lantului
deja construit; vectorul componente 1, dac vrful i apartine P(i)= lantului deja construit ; 0, dac nu ; vectorul CICLU, avand N+1 componente, memoreaza varfurile construit; variabila contine varfurilor CICLU la NC, care va in in care se P avand N
principala,
ordine deja
lantului
elemente pentru a
aparitia
unor
curent.
Aplicand
acest
algoritm
5 5 3 4 7 2
1 2 4 4 3 1 2
pentru graful din figura 1, graf avand n = 5 varfuri si m = 10 muchii, 1, si se pornind obtine
din
varful
fiind
trecut
asemenea si in matricea C.
1 C = 2 7 5
1 4 4 3
2 4 1 2
7 4 1 3
5 3 2 3
nu
este
insa cea
lungimea
dintre
toate
din figura 3 pentru care se obtine costul 13 pornind din varful 5. Daca se porneste
1 5 5 1 2 5 3 4 3 4
1 2 1 2
Observatii
1. Algoritmul euristic deci ca reluarea cu mici modificari a unui algoritm euristic intr-o poate oarecare compensa masura
pornind
varful
v0, trecand exact o data prin fiecare din celelalte varfuri si intorcandu-se
obstacolelor naturale din teren), algoritmul poate fi aplicat prin fixarea unor valori mult mai mari ale
accepta
compromisul
alegerii la fiecare pas a muchiei de cost minim. 2. Rezultatul algoritmul sus poate obtinut prezentat fi cu mai
muchiilor de cele
imbunatatit
ale muchiilor existente. 4. Daca pentru un varf initial din cele alese se ajunge la un moment dat la un lant de cost mai mare decat cel al ciclului obtinut
5
daca se efectueaza rulari succesive pentru un numar M { 2, ... , N} de varfuri distincte, retinand dintre toate solutiile obtinute pe cea de cost minim. Rezulta
de prin
cost
minim
aplicarea
c(i,j) c(j,i). Este cazul rutelor aeriene din Statele Unite, unde, datorita directiei predominante ale vanturilor, durata unui zbor intre doua orase in sensul de la est la vest difera de durata zborului de la vest la est intre aceleasi orase.
intrerupe
completarea
acestui lant si se va trece la varful initial urmator. 5. In exemplul prezentat, matricea C are o structura simetrica, respectiv c(i,j) = c(j,i). In realitate, pot exista situatii in care
corespunde
unuia din cele (N-1)! cicluri posibile ce se pot forma intre varfurile numarul grafului, al N fiind
total
varfurilor
de determinat un traseu care pornind de pe bara sursei de alimentare sa treaca exact o data pe la fiecare
termoficare; c) Determinarea rutelor pentru mijloace de transport: transport aerian; transport urban public; transport de marfa
Considerand consumatorii si sursa de alimentare ale unui in drept graf care sunt
6
conex
doua
varfuri
Bibliografie
1. L.Livovschi, H.Georgescu: Sinteza si analiza Editura algoritmilor. Stiintifica, 3. Editura Bucuresti, 1994. O.Patrascoiu, Gh.Marian, N.Mitroi: grafuri Copos, combinatorica. algoritmi si Elemente de si Metode, programe. Intact,
programare.
Problema Comis-Voiajorului
#include <stdio.h> #include <conio.h> int i, n, k, nc, v, w, j, cost,cmin; int ciclu[100], p[100]; int c[5][5]={{999,1,2,7,5},{1,999,4,4,3},{2,4,999,1,2},{7,4,1,999,3},{5,3,2,3,999}}; void main (void) { clrscr(); cost=0; printf("\nIntroduceti numarul virfurilor: "); scanf("%d",&n); for (k=1; k<n+1; k++) { p[k]=0; } printf("\nDeclarati virful din care incepe constructia ciclului: "); scanf("%d",&i); ciclu[1]=i; nc=1; p[i]=1; v=i; for (k=1; k<n; k++) { cmin=999; for (j=1;j<n+1;j++) { if ((p[j]==0) && (c[v-1][j-1]<cmin)) { cmin=c[v-1][j-1]; w=j; } } ciclu[k+1]=w; cost=cost+cmin; p[w]=1; v=w; } ciclu[n+1]=i; cost=cost+c[v-1][i-1]; printf("\nOrdinea de parcurgere a virfurilor este :\n\n"); for (k=1; k<n+1; k++) { printf(" %d ", ciclu[k]); } printf("\n\nValoarea costului asociat ciclului parcurs este : "); printf("%d", cost); printf("\n\nApasati o tasta pentru terminarea programului "); getch(); }
Tema
Modificati programul de calcul de mai sus pentru a permite: a. construirea automata, pe rand, a ciclurilor incepand din fiecare varf al grafului; b. memorarea ciclului cu cel mai scazut cost; c. preluarea coordonatelor xOy ale varfurilor grafului, calculul automat al distantelor dintre varfuri si apoi rezolvarea problemei ca la punctul anterior.
8