Sunteți pe pagina 1din 8

P r o b l e m a C o m i s- Voiajorului

Punerea problemei

Problema Comis-Voiajorului timp, caz in care costul unei


este definita astfel [1]: muchii este egal cu timpul

Fie G = (V,E) un graf necesar parcurgerii sale).

neorientat in care oricare Fie astfel graful conex


doua varfuri diferite ale neorientat G(V,E) definit de
grafului sunt unite intre multimea varfurilor V si de
ele printr-o muchie careia i multimea muchiilor E. Daca

V ' = {v i | i = 1,...,n − 1}
se asociaza un cost strict
notam cu
pozitiv. Se cere sa se
multimea varfurilor asociate
determine un ciclu care sa
oraselor de vizitat iar cu v0
inceapa dintr-un varf
oarecare al grafului, sa varful asociat orasului de

treaca exact o data prin plecare initial (baza), vom

toate celelalte varfuri si avea V = V ' ∪ {v0 } . De regula


sa se intoarca in varful notam cu lij lungimea muchiei
initial, ciclul indeplinind
dintre varfurile vi si vj sau
in plus conditia de a avea
cu cij costul asociat
un cost minim. Costul unui
parcurgerii muchiei dintre
ciclu este definit ca suma a
varfurile vi si vj.
costurilor atasate muchiilor
componente. In [1] si [2] este prezentat

Numele problemei provine de urmatorul algoritm euristic de

la analogia cu un comis- tip ”greedy” care furnizeaza o

voiajor care pleaca dintr-un solutie a problemelor de tip

oras, trebuie sa viziteze un comis-voiajor intr-un interval

numar de orase date si apoi de timp polinomial. Astfel,

sa se intoarca in orasul de daca (v0,v1,...,vk) este

plecare cu minim de efort lantul deja construit, atunci


(de exemplu in minim de

1
- daca {v0,v1,...,vk}=V, muchie (vk,vk+1) care
atunci se adauga este de cost minim si
muchia (vk,v0) si pentru care
constructia ciclului vk+1∉{v0,v1,...,vk}.
este incheiata;

- daca {v0,v1,...,vk}≠V,

atunci se adauga acea

Reprezentarea grafului G

Fie: - variabila COST, care va


- N = |V|, numarul contine costul lantului
varfurilor grafului G; deja construit;
- C = matrice patrata de - vectorul P avand N
ordinul N, C(N,N), in componente
care elementul c(i,j)≥0 1, dacã vârful i apartine

reprezinta costul P(i)=  lantului deja construit ;
0, dacã nu ;
asociat muchiei (i,j); 
Elementele de pe - vectorul CICLU, avand N+1
diagonala principala, componente, in care se
c(i,i), vor avea valori memoreaza in ordine
mult mai mari decat varfurile lantului deja
celelalte elemente construit;
nediagonale, pentru a
- variabila NC, care va
evita aparitia unor
contine numarul
muchii cu ambele capete
varfurilor existente in
incidente la un acelasi
CICLU la pasul curent.
varf;

2
Procedura de calcul Comis-Voiaj

Procedura PCV (N, C, i, CICLU, COST)


/* i este varful din care incepe constructia ciclului */

integer CICLU(N+1), P(N)


real C(N,N)
for k = 1,N
P(k) = 0
CICLU(1) = i
NC = 1
P(i) = 1
COST = 0
v = i
for k = 1, N-1 /* se adauga pe rand N-1 varfuri; */
CMIN = ∞ /* se identifica o muchie (v,w) de */
for j = 1, N /* cost minim cu w varf neparcurs; */
if (P(j) = 0) ∧ (C(v,j) < CMIN) then CMIN = C(v,j)
w = j
endif
repeat
CICLU(k+1) = w
COST = COST + CMIN
P(W) = 1
v = w
repeat
CICLU(N+1) = i
COST = COST + C(v,i)
return
end

3
Aplicand acest algoritm 1

pentru graful din figura 1, 5 7 2 1


3
graf avand n = 5 varfuri si 5 2
2 4
m = 10 muchii, si pornind
3 4
din varful 1, se obtine
4 3
ciclul din figura 2, avand 1

costul egal cu 14. Costul Fig. 1. Graf complet


individual al muchiilor este 1

marcat pe fiecare dintre 1


7
ele, fiind trecut de 3
5 2
2
asemenea si in matricea C.

4 3
1

Fig. 2. Ciclu posibil

∞ 1 2 7 5

1 ∞ 4 4 3

C = 2 4 ∞ 1 2

7 4 1 ∞ 3

5 3 2 3 ∞

Acest ciclu nu este insa obtin cicluri de cost 10. In


optim (nu are lungimea cea figura 4 este reprezentat
mai mica dintre toate ciclul de cost 10 considerand
ciclurile posibile in graf), varful 3 drept varf initial.
existand de exemplu ciclul
din figura 3 pentru care se
obtine costul 13 pornind din
varful 5. Daca se porneste
din varfurile 2, 3 sau 4, se

4
1 1

5 1 1
2
3
5 2 5 2
2 4

4 3 4 3
1 1

Fig. 3. Ciclu de cost 13 Fig. 4. Ciclu de cost 10

Observatii

1. Algoritmul euristic deci ca reluarea cu mici


prezentat respecta conditia modificari a unui algoritm
necesara de a obtine un euristic poate compensa
ciclu pornind din varful intr-o oarecare masura
v0, trecand exact o data neajunsurile sale.
prin fiecare din celelalte 3. In cazul grafelor care nu
varfuri si intorcandu-se sunt complete (exista
apoi in varful v0 , dar in perechi de varfuri neunite
locul conditiei ca ciclul prin muchii datorita
sa fie de cost minim se obstacolelor naturale din
accepta compromisul teren), algoritmul poate fi
alegerii la fiecare pas a aplicat prin fixarea unor
muchiei de cost minim. valori mult mai mari ale
costurilor muchiilor
2. Rezultatul obtinut cu
inexistente fata de cele
algoritmul prezentat mai
ale muchiilor existente.
sus poate fi imbunatatit
daca se efectueaza rulari 4. Daca pentru un varf initial
succesive pentru un numar M din cele alese se ajunge la
∈ { 2, ... , N} de varfuri un moment dat la un lant de
distincte, retinand dintre cost mai mare decat cel al
toate solutiile obtinute pe ciclului de cost minim
cea de cost minim. Rezulta obtinut prin aplicarea

5
procedurii pentru varfurile c(i,j) ≠ c(j,i). Este cazul
deja tratate, se poate rutelor aeriene din Statele
intrerupe completarea Unite, unde, datorita
acestui lant si se va trece directiei predominante ale
la varful initial urmator. vanturilor, durata unui

5. In exemplul prezentat, zbor intre doua orase in

matricea C are o structura sensul de la est la vest

simetrica, respectiv c(i,j) difera de durata zborului

= c(j,i). In realitate, pot de la vest la est intre


exista situatii in care aceleasi orase.

Exemple de aplicatii tehnice


a) Determinarea configuratiei conectate printr-o muchie,
traseelor retelelor traseul cautat corespunde
electrice buclate: unuia din cele (N-1)! cicluri

Cunoscand amplasamentele posibile ce se pot forma intre


varfurile grafului, N fiind
consumatorilor si pe cel al
numarul total al varfurilor
sursei de alimentare, avem
grafului.
de determinat un traseu care
pornind de pe bara sursei de b) Determinarea configuratiei
alimentare sa treaca exact o traseelor conductelor de
data pe la fiecare termoficare;
consumator si sa se intoarca c) Determinarea rutelor pentru
la sursa, traseul mijloace de transport:
indeplinind si conditia de a - transport aerian;
avea o lungime minima. - transport urban
Considerand consumatorii si public;
sursa de alimentare drept - transport de marfa
varfuri ale unui graf
neorientat conex in care
oricare doua varfuri sunt

6
Bibliografie
1. L.Livovschi, Editura Intact,
H.Georgescu: Sinteza si Bucuresti, 1994.
analiza algoritmilor. 3. O.Patrascoiu, Gh.Marian,
Editura Stiintifica, N.Mitroi: Elemente de
Bucuresti, 1986. grafuri si
2. I. Odagescu, C. Copos, combinatorica. Metode,
D. Luca, F. Furtuna, I. algoritmi si programe.
Smeureanu: Metode si Editura All, Bucuresti,
tehnici de programare. 1994.

7
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.

S-ar putea să vă placă și