Sunteți pe pagina 1din 8

Problema Comis- Voiajorului

Punerea problemei

Problema Comis-Voiajorului este definita astfel [1]:

graf

neorientat in care oricare

doua varfuri diferite ale grafului sunt unite intre ele printr-o muchie careia i se asociaza un cost strict pozitiv. Se cere sa se determine un ciclu care sa inceapa dintr-un varf

Fie

G

=

(V,E)

un

oarecare

al

grafului, sa

treaca

exact

o

data prin

toate celelalte varfuri si

sa initial, ciclul indeplinind in plus conditia de a avea un cost minim. Costul unui ciclu este definit ca suma a costurilor atasate muchiilor componente.

intoarca in varful

se

Numele problemei provine de la analogia cu un comis- voiajor care pleaca dintr-un oras, trebuie sa viziteze un numar de orase date si apoi sa se intoarca in orasul de plecare cu minim de efort

(de

exemplu

in

minim

de

timp, caz in care costul unei muchii este egal cu timpul necesar parcurgerii sale).

Fie

neorientat G(V,E) definit de multimea varfurilor V si de multimea muchiilor E. Daca

graful conex

astfel

' =

{

v

i

|

i =

1,

1}

notam

multimea varfurilor asociate

oraselor de vizitat iar cu v 0

varful asociat orasului de plecare initial (baza), vom

cu

V

,

n -

. De regula

notam cu l ij lungimea muchiei

dintre varfurile v i si v j sau

cu

parcurgerii muchiei dintre varfurile v i si v j .

asociat

avea V = V »{v

'

0

}

c ij

costul

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

lantul deja construit, atunci

daca (v 0 ,v 1 ,

,v k )

- daca {v 0 ,v 1 ,

,v

k }=V,

muchie (v k ,v k+1 ) care

atunci

se

adauga

este de cost minim si

muchia

(v k ,v 0 )

si

pentru

care

constructia ciclului

este incheiata;

- daca {v 0 ,v 1 ,

,v k } V,

atunci se adauga acea

v k+1 œ{v 0 ,v 1 ,

,v k }.

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

reprezinta costul

asociat muchiei (i,j);

Elementele de pe

diagonala principala,

c(i,i), vor avea valori

mult mai mari decat

celelalte elemente

nediagonale, pentru a

evita aparitia unor

muchii cu ambele capete

incidente la un acelasi

varf;

P(i)=

Ï 1,

Ô Ì lantului deja construit ;

Ô

Ó

dacã vârful i apartine

dacã nu

;

0,

- vectorul CICLU, avand N+1

componente, in care se

memoreaza in ordine

varfurile lantului deja

construit;

- variabila

NC,

care va

contine

numarul

varfurilor existente in

CICLU la pasul curent.

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 i

v

= for k = 1, N-1

CMIN =

for j = 1, N

/* se adauga pe rand N-1 varfuri; */

/* se identifica o muchie (v,w) de */

/* cost minim cu w varf neparcurs; */

if (P(j) = 0) Ÿ (C(v,j) < CMIN) then

CMIN = C(v,j) j

w =

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

Aplicand

pentru graful din figura 1, graf avand n = 5 varfuri si m = 10 muchii, si pornind

se obtine

ciclul din figura 2, avand

algoritm

acest

din

varful

1,

1 5 1 7 2 3 5 2 2 4 3 4 4 3 1
1
5
1
7
2
3
5
2
2
4
3
4
4
3
1
costul egal cu 14. Costul Fig. 1. Graf complet individual al muchiilor este 1 marcat
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

optim

ciclu

(nu

nu are lungimea cea

este insa

obtin cicluri de cost 10. In figura 4 este reprezentat

mai mica dintre toate ciclurile posibile in graf), existand de exemplu ciclul din figura 3 pentru care se

ciclul de cost 10 considerand varful 3 drept varf initial.

obtine costul 13 pornind din

varful 5.

din varfurile 2, 3 sau 4, se

Daca se porneste

1 1 5 1 1 2 3 5 2 5 2 2 4 3 4
1
1
5
1
1
2
3
5
2
5
2
2
4
3
4
3
4
3
1
1

Fig. 3. Ciclu de cost 13

Fig. 4. Ciclu de cost 10

Observatii

1. Algoritmul

euristic

prezentat respecta conditia necesara de a obtine un

ciclu pornind din varful v 0 , trecand exact o data

prin fiecare din celelalte varfuri si intorcandu-se

apoi in varful v 0 , dar in

locul conditiei ca ciclul sa fie de cost minim se

accepta

alegerii la fiecare pas a

muchiei de cost minim.

compromisul

2. Rezultatul obtinut cu algoritmul prezentat mai sus poate fi imbunatatit daca se efectueaza rulari succesive pentru un numar M

, N} de varfuri

distincte, retinand dintre

toate solutiile obtinute pe cea de cost minim. Rezulta

Π{ 2,

deci ca reluarea cu mici modificari a unui algoritm

euristic poate compensa intr-o oarecare masura neajunsurile sale.

3. In cazul grafelor care nu sunt complete (exista

perechi de varfuri neunite prin muchii datorita obstacolelor naturale din teren), algoritmul poate fi aplicat prin fixarea unor

valori mult mai mari ale costurilor muchiilor inexistente fata de cele 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

cost minim

obtinut prin aplicarea

ciclului de

procedurii pentru varfurile deja tratate, se poate 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

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.

Exemple de aplicatii tehnice

a) Determinarea configuratiei traseelor retelelor electrice buclate:

Cunoscand

consumatorilor si pe cel al sursei de alimentare, avem de determinat un traseu care

amplasamentele

conectate printr-o muchie, traseul cautat corespunde unuia din cele (N-1)! cicluri posibile ce se pot forma intre varfurile grafului, N fiind numarul total al varfurilor grafului.

pornind de pe bara sursei de alimentare sa treaca exact o

b) Determinarea configuratiei 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

avea

Considerand consumatorii si sursa de alimentare drept

o

lungime

minima.

varfuri

ale

unui

graf

neorientat

conex

in

care

oricare doua varfuri sunt

- transport aerian;

- transport urban public;

- transport de marfa

Bibliografie

1. L.Livovschi, H.Georgescu: Sinteza si analiza algoritmilor.

Editura Stiintifica, Bucuresti, 1986.

2. I. Odagescu, C. Copos,

D. Luca, F. Furtuna, I. Smeureanu: Metode si tehnici de programare.

Editura Intact,

Bucuresti, 1994.

3. O.Patrascoiu, Gh.Marian, N.Mitroi: Elemente de

si

grafuri

combinatorica. Metode,

algoritmi si programe.

Editura All, Bucuresti,

1994.

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.

b.

c.

construirea automata, pe rand, a ciclurilor incepand din fiecare varf al grafului; memorarea ciclului cu cel mai scazut cost; preluarea coordonatelor xOy ale varfurilor grafului, calculul automat al distantelor dintre varfuri si apoi rezolvarea problemei ca la punctul anterior.

varfurilor grafului, calculul automat al distantelor dintre varfuri si apoi rezolvarea problemei ca la punctul anterior.
varfurilor grafului, calculul automat al distantelor dintre varfuri si apoi rezolvarea problemei ca la punctul anterior.