Str. Calea Mărășești, nr. 157, Bacău, 600115 [618322]
1
UNIVERSITATEA „VASILE ALECSANDRI” DIN
BACĂU
Facultatea de Științe
Str. Calea Mărășești, nr. 157, Bacău, 600115
Tel. ++40 -234-542411, tel./ fax ++40 -234-571012
www.ub.ro ; e-mail: [anonimizat]
PROGRAMUL DE STUDII INFORMATIC Ă
LUCRARE DE LICENȚĂ
Coordonator științific:
Conf . Univ Dr. Crișan Cerasela Absolvent: [anonimizat]
2020
2
UNIVERSITATEA „VASILE ALECSANDRI” DIN
BACĂU
Facultatea de Științe
Str. Calea Mărășești, nr. 157, Bacău, 600115
Tel. ++40 -234-542411, tel./ fax ++40 -234-571012
www.ub.ro ; e-mail: [anonimizat]
PROGRAMUL DE STUDII INFORMATIC Ă
OPTIMIZARE DISCRETĂ PENTRU O
REȚEA DE TRANSPORT
Coordonator științific:
Conf. Univ Dr. Crișan Cerasela Absolvent: [anonimizat]
2020
3
Cuprins
INTRODUCERE ………………………….. ………………………….. …………………….. 4
ARGUMENT ………………………….. ………………………….. ………………………….. 4
CAPITOLUL I. NOȚIUNI TEORE TICE ………………………….. ……………….. 8
1.1. CLASIFICARE ………………………….. ………………………….. ……………………….. 8
1.1.1. Problema clasică de transport ………………………….. ……………………….. 9
1.1.2. Problema drumului de cost minim ………………………….. ………………. 12
1.1.3. Problema fluxului maxim ………………………….. ………………………….. . 14
1.1.4. Problema transferului ………………………….. ………………………….. ……. 15
1.1.5. Problema afectării ………………………….. ………………………….. ………… 16
1.1.6. P roblema comis -voiajorului ………………………….. ……………………….. 17
1.2. REPREZENTAREA GRAFICĂ SIMPLIFICATĂ A UNEI REȚELEI DE TRANSPORT . 19
CAPITOLUL II. APLICAȚIE ………………………….. ………………………….. …. 22
2.1. ENUNȚUL PROBLEMEI ………………………….. ………………………….. ………….. 22
2.2. LIMBAJELE DE PROGRAMARE FOLOSITE ȘI MEDIUL DE LUCRU UTILIZAT ….. 24
2.2.1. HTML ………………………….. ………………………….. ……………………….. 24
2.2.2. PHP ………………………….. ………………………….. ………………………….. . 25
2.2.3. CSS ………………………….. ………………………….. ………………………….. .. 26
2.2.4. SQL ………………………….. ………………………….. ………………………….. . 26
2.2.5. Xampp ………………………….. ………………………….. ……………………….. 26
2.2.6. Sublime Text 3 și Atom ………………………….. ………………………….. … 27
2.3. CODUL SURSĂ ………………………….. ………………………….. ……………………. 27
2.3.1. Documentul index.php ………………………….. ………………………….. ….. 27
2.3.2. Documentul paginaprezentare.php ………………………….. ………………. 28
2.3.3. Documentul magazine.php ………………………….. …………………………. 30
2.3.4. Documentul gasestemagapropiat.php ………………………….. …………… 32
2.3.5. Documentul functie -calcul.php – Formula Haversine ………………….. 36
2.3.6. Documentul bazadedate.php ………………………….. ………………………. 38
2.3.7. Documentul stiluri.css ………………………….. ………………………….. ….. 39
CONCLUZII ………………………….. ………………………….. …………………………. 45
BIBLIOGRAFIE ………………………….. ………………………….. ……………………. 46
DECLARA ȚIE DE AUTENT ICITATE ………………………….. ………………… 47
4
Introducere
Cu toții știm cât de important este în zilele de astăzi transportul – dintr -o stradă în altă
stradă, dintr -un oraș în altul, dintr -un județ în altul , dintr -o regiune în alta, dintr -o țară în alta,
dintr -un continent în altul și această listă poate continua cu exemple .
Întrebarea pe care ne -o punem este: Putem oare să găsim un drum mai bun? O soluție mai
bună ? O cale mai exact ă? Un traseu mai eficient, mai rapid de parcurs?
Toate lucrurile iau mai mult sau mai puțin timp. Toate călătoriile contează. Indiferent
că mergi la o plimbare, într -o excursie, că stai în trafic în drum spre serviciu, că ai o mic ă
afacere și vrei să scutești drum și bani, sau că ești unul dintre cei mai mari antreprenori ai
lumii, pentru toți dintre noi, fiecare secundă contează.
De aceea, tra nsportul nostru, sau al lucrurilor noastre, al mărfii și așa mai departe ,
trebuie să fie cât mai eficient, m ai exact, mai corect calculat, dar în același timp și sigur.
În zilele de azi, în care toate lucrurile sunt într -o evoluție continu ă foarte accelerat ă,
este foarte important ă eficiența, viteza realizării obiectivelor noastre.
Se pune foarte mare accent pe cât mai puțin timp pierdut și pe cât mai multe reușite, cât mai
multă muncă . O productivitate pe măsura așteptărilor nu poate fi atinsă decât dacă se lucrează
foarte atent la toate caracteristicile ce țin de transport. Trebuie să se ia în calcul, din punct de
vedere matematic, informatic , logic și cronologic fiecare mic detaliu , astfel încât rezultatul în
ansamblu să fie cel mai bun, cel mai potrivit, cel mai eficient pentru problema în cauză.
Argument
Am ales spre a realiza această lucrare de licență în primul rând pentru că mă consider
tipul de om care aspiră spre ideal, care dorește în fiecare zi să realizeze tot mai mult și tot mai
bine, tot mai corect și tot mai optimizat. Tema optimizării discrete într -o rețea de transport se
potrivește perfect gândirii mele.
În al doilea rând, un motiv în plus ar fi deoarece lucrez în domeniu, și anume în
IT+baze de date pentru transport, unde știm cu toții că timpul și resursele sunt cele mai
prețioase lucruri. Deși rețelele de transport aparți n sau se află în gestiunea retailerilor din
comerț, din transport, spre exemplu marile lanțuri de magazine ale lumii, companiile de
curierat, mijloacele de transport în comun și așa mai departe, este evident că fie care din
categoriile enumerate anterior ar e nevoie de un departament specializat pentru mentenanța,
administrarea și gestionarea bazelor de date a rutelor, traseelor, punctelor de plecare, a
zonelor intermediare și, nu în ultimul rând a destinațiilor.
5
Așadar, optimizarea, după părerea mea, este un principiu foarte important care stă la
baza majorității lucrurilor/ acțiunilor/ proceselor/ fenomenelor/ serviciilor.
Enumerăm, pe scurt, câteva probleme / situații , de la lucruri simple la lucruri
complexe, probleme care necesită o medie/mare/ foar te mare atenție în ceea ce privește
optimizarea/ eficientizarea traseului/ drumului/ itinerarului/ rețelei de transport stabilite/
definite/ alese.
Exemplu l 1:
Vrei să ieși să duci coșul. Traseul ales în proporție de 99% este cel direct și înapoi
(doar dac ă nu cumva dorești să ieși după la plimbare, dar asta e altă problem ă).
Este evident că nu îți dorești să pierzi timpul cu acest lucru, ci să te întorci acasă cât mai
repede.
Exemplu l 2:
Mergi la cumpărături. Cu siguranță nu vei sta mai mult decât te ține răbdarea.
Chiar dacă te mai oprești pe la vreun raion să te uiți de câte ceva în plus , ai traseul cât de cât
spre bine stabilit, mai ales dacă nu ești la prima ta experiență de a face cumpărături.
Și așa durează mult și te grăbești. Deci e destul de i mportant să îți faci un plan de dinainte
stabilit .
Exemplu l 3:
Ești student și mergi la ore la facultate. Ai programul bine ales, știi destul de bine când
vii, pe unde vii, la ce laboratoare, cursuri te duci, și când te întorci acasă (asta dacă nu ți-ai
stabilit între timp alte planuri) . Mai ales când te grăbești la ore, cum fac majoritatea
studenților, nu îți dorești să pierzi timpul, ci mai mult, vrei să ajungi și să termini cât mai
repede. Deci, ai nevoie să fii eficient.
Exemplu l 4:
Te duci la s erviciu. Indiferent că mergi pe jos, cu bicicleta, cu trotineta electrică,
biciclet a electrică, scooter, mașina personală, că te aduce un coleg, că folosești un mijloc de
transport în comun , cu atât mai mult, când depinzi de alții , trebuie să ai traseul/ p lanul/
programul foarte bine stabilit, să știi exact când pleci, pe unde mergi, cam cât timp faci și ce
alegeri dobândite din experiența ta, te aștepți a fi bune sau mai puțin bune .
Oricum e aglomerat la prima oră, și de asemenea atunci când te întorci, în trafic , sigur (dacă
nu ești la primul drum) că știi pe ce străzi să o iei și pe care nu, pentru că sunt prea
aglomerate, pentru că ai face prea mult timp, de asemenea sigur nu alegi trasee în care să
parcurgi Km suplimentari nejustificați .
Exemplu l 5:
6
Călătorești . Locuiești în Bacău și vrei să mergi în Germania. Dar singura plecare
săptămâna aceasta este vineri, din București, la ora 21:30 .
Trebuie s ă mergi cu un mijloc de transport în comun de la Bacău la București. Trebuie să fii
gata exact când ți-ai stabilit, luându -ți, eventual, o marjă de eroare , o rezervă de timp , în caz
că ceva nu merge bine.
Ajungi în București, trebuie să mergi spre aeroport. Trebuie să parcurgi toate
formalitățile logice și cronologice acolo. Ai urcat în avion. Ajungi în Berlin. Trebuie să iei un
taxi, și să ajungi în intervalul orar stabilit la hotel. După cum se poate observa, nu ai cum să
nu îți planifici acest t raseu, itinerar . Trebuie să fii foarte eficient în ce ți -ai planificat, trebuie
să știi exact la ce să te aștepti. Așa este, nu totul se întâmplă mereu cum ne -am planificat, dar
învățăm din experiențe și aspirăm întotdeauna spre ideal, spre ceva mai bun, m ai optimizat .
Exemplu l 6:
Ești un mic spre mediu antreprenor, și vrei să cumperi niște marfă de la un furnizor .
Firește că totul costă. Îți vei stabili traseul pe care să îl parcurgi, marfa de încărcat și
programul pe ziua respectivă. Doar nu vrei să perz i bani, timp și buna dispoziție.
Combustibilul costă, mai ales la o mașină de transportat marfă, unde se simte foarte ușor
diferența între un drum bine și altul mai puțin bine ales.
Exemplu l 7:
Coordonezi mutarea/ transportarea unei elice foarte mari (de o rdinul zecilor de metri),
deja asamblată, ce trebuie dusă din New York în Chicago (distanța dintre cele două zone este
de ~ 1200 de km) . Ai alături de tine armata și un ordin dat de guvern, străzile pe care le vei
traversa sunt închise în momentele în care ajungi în dreptul lor și cât te deplasezi pe direcția
lor, închise pentru cetățeni și disponibile exclusiv pentru transportul foarte i mportant pe care
îl realizezi . Viteza ta este de doar 10 km/h, astfel încât elicea necesară imensului proiect
stabilit să fie transportată în deplină siguranță . Transportul tău durează 2 săptamâni. Se
cheltuie milioane de dolari pentru acest proiect. Probl ema optimizării rețelei de transport,
alegerea drumului cel mai scurt, cel mai bun și cel mai sigur, este o problemă critică.
Exemplu l 8:
Ești unul dintre cei mai mari antreprenori ai lumii .
Ți-ai dezvoltat o rețea de magazine, o rețea imensă de transport pentru marfa ta, de la
furnizori la tine, între magazinele tale și mai ales de la tine către clienți. Cât de important ar fi
pentru calculele tale, având în vedere că trebuie să plătești zeci de mii de salarii și impozite
lunar , dacă s -ar produce o modificare/ schimbare neașteptată la baza de date a rețelei de
transport? Cât de mult te -ar afecta o decizie nepotrivită sau nesuficient de bună în ceea ce
7
privește rețeaua ta de transport ? Cât de importantă este și cât de serios trebuie abordată
aceast ă idee vagă, am putea spune , la început , a optimizării unei rețele de transport?
Având în vedere cele menționate mai sus, într -o ordine total nealeatoare a exemplelor
alese , pornind, cu alte cuvinte, de la mic la mare , putem cădea de acord că optimizarea, în
general vorbind, dar mai punctual, optimizarea discret ă pentru o rețea de transport este
esențială și este direct propor țional ă cu tot ce se va desfășura pe acea rețea de transport.
8
CAPITOLUL I. NOȚIUNI TEORETICE
1.1. Clasificare
Dacă punem în discuție problema generală/ comună/ clasică de transport, putem spune
că aceasta face parte dintr -o categorie mult mai largă și anume cea de probleme modelate prin
rețele/ circuite de transport. O rețea de transport pune în lumină o situație de natură
economică în care, având un anumit număr de puncte, care se mai numesc și surse, trebuie să
transportăm o cantitate dintr -o anumită substanță, într -un alt număr de puncte, sau, cu alte
cuvinte – destinații.
Dacă dorim să concretizăm situația generală amintită anterior, o putem face într -un
număr foarte mare de mare de feluri, specificând dacă avem sau nu avem puncte/ locații
intermediare între sursele și destinațiile noastre, specificând modul în care s -a ales să se facă
transportul ( ce rute posibile există, costul pentru transport, limite între care ne putem încadra
(minime și maxime) pentru cantitatea aleasă spre a fi transportată pe fiecare rută în parte,
timpul necesar fiecărui transport), scopurile care se urmăresc și așa mai dep arte.
Din acest motiv există foarte multe feluri/ tipologii de probleme care implică rețele de
transport, dintre care putem aminti în lista ce urmează:
1. Problema clasică de transport
2. Problema drumului de cost minim
3. Problema fluxului maxim
4. Problema fluxului maxim de cost minim
5. Probleme de flux dinamic
6. Problema transferului
7. Problema de afectare
8. Problema cuplajului maxim
9. Problema de ordonanțare
10. Problema arborelui de cost minim
11. Problema comis voiajorului
9
1.1.1. Problema clasică de transport
Caracteristicile , în general, ale unei probleme de transport sunt:
1. fiecare sursă trebuie să aprovizioneze cel puțin o destinație , iar fiecare destinație trebuie să
fie aprovizionată de cel puțin o sursă;
2. pot să exist e perechi sursă -destinație între care nu p utem să facem transfer ( poartă
denumirea de rute blocate);
3. nu avem limitări dacă discutăm despre cantitatea pe care o transport ăm pe fiecare rută în
parte ;
4. cunoaștem cantitățile pe care le avem disponibile în fiecare sursă și cantitățile ce sunt
necesare pentru fiecare destinație;
5. pentru fiecare rut ă asoci em un cost c e nu depin de de sensul de parcurgere.
Scopul acestei probleme este să găsim cantități le pe care trebuie să le transport ăm pe fiecare
rută în parte în așa fel încât să putem asigur a necesarul pentru fiecare destinați e, și să fim în
limitele cantităților pe care le avem la surse, cu cel mai mic cost posibil.
Datele problemei în cauză sunt:
1. m pe care îl considerăm numărul de surse ( sau furnizori);
2. n în care alegem numărul de destinatari ( ori consumatori);
3. {Ai, i = 1,…,m} reprezin tă cantitățile disponibile din fiecare sursă;
4. {Bj, j = 1,…,n} sunt cantitățile necesare la fiecare sursă;
5. {cij, i = 1,…,m; j = 1,…,n} reprezintă costurile unitare p entru fiecare rută în parte
(costul transport ului unei unități de măsură aleasă de la o sursă i până la o
destinați e j).
În continuare, organizăm aceste date în următorul tabel:
Surse Des tinații C1 C2 … C n
F1
F2
.
Fn c11 c12 … c 1n
c21 c22 … c 2n
. … .
cn1 cn2 … c nn
A1
A2
.
An
B1 B2 … B n Necesar Disponibil
Dacă vom nota cu x i j cantitatea ce va fi transportată de la sursa noastră i la destinația aleasă j
atunci vom avea de rezolvat următoarea problemă:
10
Min(f) = ∑∑Cijm
j=1m
i=1⋅xij
{ ∑xijn
j=1≤Ai i=1,…,m
∑xijm
i=1≤Bj j=1,…,n
xij≥0 i=1,…,m,j=1,…,n
Acesta este un caz particular de problemă de programare liniară .
Dacă facem o primă analiză a problemei, vedem imediat ca aceasta nu are soluții admisibile în
situa ția în care disponibilul total este mai mic decât cererea totală.
Din punct de vedere matematic, această afirmație de mai de vreme se poate justifica prin
relațiile ce le obținem dacă adunăm primele m restricții și apoi ultimele n.
Disponibilul total = ∑Aim
i=1 >= ∑∑xijm
j=1m
i=1 >= ∑Bjn
j=1 = cererea total ă
Xi j = Ai⋅Bj
∑Aim
i=1
De asemenea, condiția ∑Aim
i=1 > = ∑Bjn
j=1
este de asemenea și o condiție suficientă întrucât, în cazul de față se poate verifica ușor că
soluția este o soluție admisibilă .
Pe de altă parte , chiar și dacă disponibilul nostru total este mai mare decât cererea totală, este
evident că vom transporta n umai cantitatea necesară, deoarece dacă transportăm mai mult
decât trebuie vom avea costuri suplimentare (la combustibil și așa mai departe) , fapt ce este
contrar a ceea ce ne dorim .
Unei soluții pentru care pentru una dintre ultimele n restricții este verificat ă strict , i se
asociază o soluție pentru care am scăzut cantitatea suplimentară din valorile acelor variabile
care sunt implicate în restricție, care, și ea, este admisibilă de asemenea ( variabilele aceastea
nu apar în alte restricții dintre ultimele cele n restricții, și primele nu vor fi cu atât mai mult
contorizate în condițiile în care x i j scad ) și care este în mod cert mai bună, pentru că avem
un cost mai mic.
Ca o concluzie, dacă avem o soluție optimă , vom trans porta exact cantitatea care se cere.
Asta ar fi teoretic, dar în lumea înconjurătoare se întămplă întotdeauna una dintre cele 3
situații pe care le enumerăm mai jos :
11
1.∑Ajm
i=1 > ∑Bjn
j=1
Sau
2. ∑Ajm
i=1 < ∑Bjn
j=1
Sau
3. ∑Ajm
i=1 = ∑Bjn
j=1
În situația 1, problema noastră are soluție optimă , iar cantitatea care este în exces față de
cerere o să rămână în stocul furnizorilor .
Aceasta e reprezentată de variabilele de abatere din primele noastre m restricții .
Cantitățile acestea le putem privi ca pe niște cereri pentru un consumator, să spunem, fictiv,
iar dacă ținem cont că aceste cantități nu le transportăm nicăieri, costurile pentru rutele dintre
furnizori și acest, între ghilimele, consumator (fictiv) sunt costuri zero .
Dacă adaugăm acest consumator în tabel, care are cererea egală cu ∑Ajm
i=1 – ∑Bjn
j=1
se va ob ține o problemă de tipologia 3 .
La fel , în al ultimul (al treilea) caz, chiar și dacă disponibilul nostru e mai mic decât cantitatea
necesară, asta nu înseamnă că nu v om mai transporta nimic, ci înseamnă că pentru unii dintre
consumatori nu se va mai satisface toată cererea. Putem privi acest lucru ca de exem plu pe
disponibilul unui furnizor fictiv și , dacă ținem cont că, defapt, cantitate a aceasta nu există
fizic, costurile unitare alocate pentru rutele care leagă consumatorii de furnizor ul acesra sunt
nule. Dacă vom adăuga acest furnizor în tabel ul nostru , având disponibilul egal cu
∑Bjn
j=1 – ∑Ajm
i=1
vom obține o problemă de tipologia 3 .
Concluzionând, putem transforma orice problemă într -una de tipul cu numărul 3.
Chiar dacă această situație nu se prea întâlnește în practică , ea este cea mai simplă dacă ne
referim din punct de vedere matematic și se va alege pentru a formaliza problema în cauză .
Problemele de acest gen se numesc probleme de transport echilibrate.
În plus, se vede ușor faptul că , dacă avem o problemă de transport echilibrată , atunci toate
soluțiile admisibile vor verifica toate restricțiile cu egal.
Deci, dacă avem măcar o restricție din primele m care se verifică cu “ < “ atunci vom avea,
prin însumare :
12
∑Ajm
i=1 > ∑∑xijm
j=1m
i=1 > = ∑Bjn
j=1 care e în contradicție cu ∑Ajm
i=1 = ∑Bjn
j=1 .
Analog și pentru >, și anume:
dacă avem măcar o restricție din ultimele n care se va verifica cu > , atunci avem, dacă
însumăm : ∑Ajm
i=1 >= ∑∑xijm
j=1m
i=1 > ∑Bjn
j=1 , fapt ce este în contradicție cu
∑Ajm
i=1 = ∑Bjn
j=1 .
Deci, în concluzie, orice fel de problemă de transport este echivalentă cu o problemă care are
următoarea formă:
Min(f) = ∑∑Cijm
j=1m
i=1⋅xij
{ ∑xijn
j=1≤Ai i=1,…,m
∑xijm
i=1≤Bj j=1,…,n
xij≥0 i=1,…,m,j=1,…,n
unde avem
∑Ajm
i=1 = ∑Bjn
j=1 .
Aceasta definit ă mai devreme poartă denumirea de forma standard a unei rețele de transport.
Până acum am discuta t despre p roblema clasică pentru o rețea de transport, acum să tr ecem la
a detalia problema drumului de cost minim .
1.1.2. Problema drumului de cost minim
Problema celui mai scurt drum este o problemă destul de des întâlnită. Să presupunem
că avem un graf și pentru fiecar e arc (i, j) al acestui graf avem asociat un cost ori o lungime a i
j . Lungimea pentru drum (i, i 1, …, ik, j) de la n odul i la nodul j , având arcele (i, i 1), …, (ik, j) o
defini m ca suma lungimii arcelor a i i1 + … + a ik j . Problema este aceea să găsim drumul cu
lungime a minim ă de la nodul i la nodul j.
Câteva aplicații pentru problem a drumului de lungime minim ă ar fi:
– Problemele de căutare ;
– Problemele de control optim ;
– Subrutine pentru rezolvarea altor probleme mai mari.
13
Problema pentru drumul minim reprezintă un caz particular din programar ea dinamic ă ce
se axează pe probleme le de decizie optim ă. Dacă pornim din nodul i, prima decizie care va fi
luată va fi de a alege un arc (i, i 1), ulterior, de a alege un arc (i 1, i2),
si tot așa până la nodul 1. Pentru decizi a întâi vom face o balan ță și anume trebuie să alegem
un arc cu lungime mic ă și vom evita să alegem un nod j prea depărtat de destinatie. Problema
aceasta se rezumă în ecua ția:
xi* = min j (a ij + x j* ), i = 2 , … , n .
x1* = 0.
Aceasta va fi satisfăcută de drumul minim xi* , i = 1, …, n .
Iar, algoritmul de programare dinamică în cazul problemei de drum minim are următoarea
formă:
xi = min j (a ij + x j ), i = 2, … , n
unde x 1 = 0.
Acest algoritm este potrivit pentru o implementare distribuită sau paralelă întrucât
minimizarea peste j se poate implementa para lel pentru orice nod i diferit de 1.
Problema celui mai scurt drum:
Să presupunem faptul că avem un graf c are are n noduri pe care le numerotăm de la 1
la n. Să notăm cu A(i) mul țimea nodurilor j pentru care exist ă arcul (i, j) de la nodul i. Nodul
1 îl considerăm nod special mai precis nodul destina ție.
Acum, presupunem că A(1) este vidă.
Pentru fiecare arc (i, j) avem scalarul a ij care este re prezentat de lungimea arcului .
Lungimea drumului nostru { (i, i 1), … (i, i k) } care are începutul în nodul i și sfârșitul în nodul
j, prin suma formată din ai i1 + … + a ik j .
Ni se pune problema să găsim cel mai scurt traseu/drum ori a unui drum cu lungimea minimă,
considerând că pornim din fiecare nod i.
Să presupunem că avem un drum de la orice nod i = 2, …, n la nodul de destinație 1 și fiecare
ciclu are lungime > 0 .
Drumul cu lungimea minimă este soluția sistemului (și se obține astfel ecuația cu numele
Bellman) :
Avem x i* = min
j∈A(i)(aij +xj*), unde i = 2, …, n.
x1* = 0 .
Iterația noastră
xi* = min
j∈A(i)(aij +xj*), unde i = 2, …, n.
14
este cunoscută având denumirea de algoritmul Bellman -Ford și aceasta converge la o soluție
dacă considerăm un vector inițial arbitrar.
Algoritmul Bellman -Ford
Iterația k a algoritmului Bellman -Ford are următoarea formă:
xik = min
j∈A(i)(aij +xjk-1), unde i = 2, …, n.
Și x1k = 0.
În ceea ce privește condițiile inițiale, să considerăm că:
x10 = 0 și x i0 aparține R pentru i =2 ,… n.
Algoritmul se va termina după iterația cu numărul k dacă x ik = x ik-1 cu i = 1, …, n.
Având date nodurile i diferit de 1 și j diferit de 1, putem defini :
wijk – să fie drumul de lungime dintre nodurile i respectiv j și care are un număr de k arce .
Avem relația următoare :
xik = min
j∈A(i)(wijk +xj0), oricare ar fi i = 2, …, n, și k <=1.
Teorem ă:
Există un cel mai scurt drum de la fiecare nod cu numărul i la nodul cu numărul 1 care are cel
mult n -1 arce.
Pentru orice set de condiții inițiale, acest algoritm Bellman -Ford se opreș te după un număr
finit de k repetiții/ iterații.
Dacă xi0 <= xi*, algoritmul Bellman -Ford se va opri în maximum m* iterații ,
unde m* = max
i=2,…nmi >= n-1 iar m i reprezintă cel mai mic număr de arce care poate fi conținut
într-un drum minim de la i la 1.
Cea mai mică distanță x i* este soluția unică a ecuației Bellman.
1.1.3. Problema fluxului maxim
Un graf orientat poate s ă fie utilizat de către noi pentru a pune în evidențiă și pentru a
modela un proces de transport într-o rețea, referindu -ne la un produc ător pe care îl numim s și
la un consumator pe care îl vom numi t.
Destinația nu poate să consume mai mult decât poate fi produs, iar cantitat ea ce este trimisă
pe o cale nu poate să depășească capacitatea sa de transport.
Rețelele de transport pot să modeleze de exemplu: curgerea lichidului în sisteme de țevi,
deplasarea pieselor pe benzile rulante, ori deplasarea curentului prin rețelele elect rice, ori
transmiterea informațiilor prin rețele de comunicare și așa mai departe.
Descrierea problemei de flux maxim:
15
Una dintre problemele des întâlnite pentru rețelele de transport este cea în care trebuie
să găsim fluxul maxim care poate trece prin arcele rețelei în așa fel încât:
În primul rând, să nu se depașească capacitătile corespunzătoare arcelor, iar în al doil ea rând,
fluxul trebuie să fie conservat în drumul lui de la sursă (s) la destinație (t).
Știm faptul că o rețea de transport se conturează sub imaginea și sub definiția unui graf
orientat G=(V,E) care are următoarele proprietăti:
1. În graf, există două noduri speciale în V: și anume s care este nodul sursă (ori producătorul)
respectiv t, care este nodul terminal (ori consumatorul).
2. Se definește o functie totală cu capacitatea
c :V×V → R , în așa fel încât:
c(u,v) = 0 dacă (u,v) nu aparține E
c(u,v) >=0 dacă (u,v) aparține E.
și pentru orice nod v din V fără {s,t} avem cel puțin o cale s → v → t .
Numim fluxul în rețeaua noastră G= (V,E), funcția totală f :V×V →R ce are proprietățile :
1. Restricția de capacitate, adică
f(u,v) ≤ c(u,v) , oricare ar fi (u,v) din V
(adică fluxul dintr -un arc nu poate să depășească capacitatea pe care acesta o are)
2. Antisimetria, și anume
3. f(u,v) = – f(v,u) , oricare ar fi u din V și oricare ar fi v din V
și
4. Conservarea fluxului, și anume
∑f(u,v)v∈V=0, oricare ar fi u din V mai puțin {s,t} .
1.1.4. Problema transferului
Dacă în problema clasică de transport pe care o aveam, sursele se conectau/ legau
direct de destinații, rutele fiind orientate de la surse către destinații și nu se putea efectua nici
un transport între două surse ori un transport între două destinații , problema de transfer este
defapt o generalizare pentru problem a clasic ă de transport în următoarele sensuri :
În rețeaua noastră asociată știm există și centre/ locuri intermediare sau altf el zis, de tranzit
(exemplul perfect ar fi rutele curierilor din țară, ei au foarte multe locuri/ zone de tranzit, nu
pleacă direct de la expeditor către destinatar, ci se mai opresc pe la mijloc, în HUB -uri);
pot să exist e legături între surse le noastre ori între destinații; așadar , se poate întâmpla ca o
sursă ( sau o destinație , după caz ) să aibă rolul / să funcționeze , într-un anumit moment și ca
punct de tranzit / mijloc/ punct temporar pentru unităț ile de flux ce vin de la o altă sursă ( ori
care trebuie să meargă către o altă destinație) .
16
Pe unele rute , transportul poate să se efectueze în ambele sensuri, costul pentru fiecare
transport în parte putând să depind ă de sensul de parcurgere al traseului .
Problema de transfer poate fi descris ă în următor arele idei .
Avem n localități, pe care le notam cu 1, 2, …., n și se pune problema să organizăr m
transportul pentru un produs omogen anume , între aceste localități / puncte la un cost total
minim. Între unele localități /zone avem legături directe numite rute. Pe ntru fiecare rută avem
precizat un cost pentru transportul unei unități de produs de la o extremitate la cealaltă
extremitate . Se poate ca aceste costuri în parte (pe care le putem exprima în bani, în timp sau
în distanță) să depindă direct de sensul în care se parcurge ruta respectiv ă.
Pentru a uniformiza expuner ea vom considera că pentru oricare două localități alese i
și j avem o legătură directă care se poate accesa în ambele sensuri, convenind că dacă această
rută ori sens ales de a parcurge traseul nu există în realitate, costul asociat să fie ales cu
valoarea de +∞.
Mulțimea localităților , respectiv a rutelor de legătură are numele de rețea de transport
și poate fi vizualizată / poate fi reprezentată printr -un graf finit, mai mult decât atât, neorientat
ori parțial orientat, simplu ori conex. Nodurile din rețea sunt difere nțiate în:
– surse: și anume – de exemplu acele locali tăți unde produsul este disponibil pentru a se
transporta și în alte locuri;
– destinații: și anume localitățile în care produsul este cerut pentru a fi dat spre consum,
cererea neputând fi acoperită din producția internă/ locală;
– centre le intermediare ( sau centrele de tranzit): sunt localitățile în care produsul se
găsește doar în tranzit / ca punct intermediar , eventualul consum este asigurat din
producția local ă.
1.1.5. Problema afectării
Avem un set de lucrări (de exemplu – operatii, proiecte, sarcini de serviciu și așa mai
departe)
L1, L2, L3, …, Lm sunt propuse spre a fi executa te de către agenții A 1, A 2, A 3, … An – aceștia
pot fi persoane, instituții specializate și așa mai departe .
Fiecare dintre acești agenț i poate executa una sau mai multe lucrări din cele propuse.
Într-un mod constant , presupunem că numărul de agen ți este măcar egal cu num ărul de lucrări
ofert ate.
Iar întrebarea/ problema afectării este :
Care este num ărul maxim al lucrărilor c are se pot atribui tuturor agen ților si cum vor fi
repartizate acestea , în așa fel încât :
17
– O lucrare să fie asociată cel mult unui agent
și
– Un agent să primească cel mult o lucrare. …?
Noțiunea de cuplaj maxim o vom vedea în curând :
Dacă ne gândim la un cuplaj dintr-un graf , acesta reprezintă o submulțime a muchiilor
grafului , având proprietatea de a nu exist a două care să aibă o extremitate în comun.
Cunoaștem algoritmi în timp polinomial pentru multe probleme de tip cuplaj, inclusiv
cuplajul maxim (care se referă la găsirea unui cuplaj care poate utiliz a cât mai multe muchii
posibil), cuplajul de pondere maximă, respectiv căsnicia stabilă.
În multe cazuri, problemele care se referă la potrivire sunt mai ușor de rezolvat pe ntru
grafurile bipartite decât pe ntru cele nebipartite, de asemenea, mulți algori tmi de cuplaj,
precum algoritmul Hopcroft –Karp pentru cardinalitatea maximă a cuplajelor poate funcțio na
corect numai dacă avem intrări bipartite.
Ca exemplu ales, am putea presupune că avem o mulțime P cu oameni care sunt în
căutare de locuri de muncă di ntr-o mulțime de J a locuri lor de muncă, dar nu toate persoanele
se potrivesc pentru toate joburile de acolo.
Situația aceasta se poate contura ca un graf bipartit (P,J,E) unde avem o muchie care
conectează fiecare doritor de loc de muncă cu fiecare loc de muncă din listă .
Un cuplaj perfect ar descrie un mod prin care se vor satisface simultan toate
solicitările de locuri de muncă și prin care se vor ocupa toate locurile de muncă;
teorema căsătoriilor a lui Hall ne poate oferi o caracterizare despre grafuril e bipartite care
permit cuplaje le perfecte.
National Resident Matching Program aplică metodele de cuplaje pe grafuri pentru a
încerca să rezolv e această problemă dintre studenții americani înscriși la medicină și ,
respectiv posturile de medic rezident din spitale .
Descompunerea Dulmage –Mendelsohn este o descompunere structurală care se referă
la grafuril e bipartite, și care ne este utilă în găsirea de cuplaje maxime.
1.1.6. Problema comis -voiajorului
Problema comis -voiajorului (se mai prescurtează și PCV) pune în lumină următoarea
întrebare: Având o listă cu orașe , respectiv distanțele între oricare două orașe, care poate fi cel
mai scurt traseu posibil care să vizite ze/ să treacă/ să parcurgă fiecare oraș numa i o dată și s ă
se întoarc ă în orașul de inițial/ origine?
Spunem că aceasta e o problemă NP -dură din optimizarea combinatorie, având o
importanță în domeniul cercet ării operațional e, respectiv în cel al informatic ii teoretic e.
18
Problema comis -voiajorului reprezintă un caz particular/ special al problemei
cumpărătorului ambulant , respectiv a problemei rutării vehiculelor.
Problema cumpărătorului ambulant
Amintind, p roblema cumpărătorului ambulant este acea problemă care tratează un
client /cumpărător care are sarcina/scopul de a achizițion a un număr/ o mulțime de
produse /servicii . Acesta poate să cump ere aceste produse din mai multe zone/ orașe, dar cu
prețuri diferite și , de asemenea, nu toate orașele ii oferă aceleași produse. Obiectivul sau țelul
său este să găsească o rută / un drum/ un traeu între o submulțime de orașe, care să îi
minimize ze costul său total (costuri de călătorie / drum + costul cumpăr ăturilor ) și care să îi
permit ă achizițion eze toate produsel e pe care și le -a trecut în listă .
Problema rutării vehiculelor
Problema rutării vehiculelor (se abreviază în limba engleză cu VRP) este acea
problemă din optimizarea combinatorială și acea problemă de programare cu numere
întregi care ne răspunde la următoarea întrebare:
Care este acea mulțime optimă de rute care trebuie traversat ă de către o flotă de
vehicule / automobile pentru a se efectua livrări către o mulțime anume dată de clienți?
Aceast ă problemă ne generalizează arhicunoscuta noastră problemă a comis –
voiajorului . Ea a apărut pentru întâia oară într-un articol realizat de către George Dantzig și de
către John Ramser în anul 1959, în care a fost publicată și aplicată pentru livrăril e de benzină
prima abordare algoritmică.
De foarte multe ori , contextul nostru este cel de livrare de servicii / bunuri care se află
într-un depozit logistic/ central către acei clienți care transmit solicitări/ comenzi pentru astfel
de bunuri. Obiectivul problemei se rezumă la minimizarea costului total însumat al rutei. De
asemenea, în anul 1964, Clarke , respectiv, Wright au adus o îmbunătăți re abord ării anterioare
a lui Dantzig și Ramser , utilizând o abordare am putea spune lacomă și eficace care poartă
denumi rea de algoritmul economisirilor.
Raportându -ne la teoria complexității, versiunea de decizie a problemei comis –
voiajorului (unde, avem dată o lungime notată cu L, sarcina noastră e de a dec ice/ vedea dacă
graful are un ciclu complet de lungime mai mică decât L) aparține clasei așa numitelor
problemelor NP -complete. A șadar , se poate ca timpul necesar de rulare în situația cea mai
defavorabilă pentru orice algoritm pentru problema comis -voiajorului să se mărească
superpolinomial (dar n edepășind ideea de exponențial) cu numărul de orașe.
Problema a fost pusă în lumină prima dată în anul 1930 și este o problemă dintre cele
mai intens studiate / cercetate probleme de optimizare. Aceasta se folosește ca test pentru
multe metode de optimizare. Chiar și în sit uația în care problema este dificilă din punct de
19
vedere computațional, se știu numeroși algoritmi exacți și euristici , în așa fel încât încât unele
cazuri cu orașe ce au numărul la ordinul zecilor de mii se pot rezolva complet și chiar
probleme le cu mil ioane de orașe le putem aproxima cu o eroare de 1%.
PCV are foarte multe aplicații, chiar și dacă vorbim de cea mai pură formulare, cum ar
fi, de exemplu în planificare, în logistică, ori la fabricarea de microcipuri.
Puțin modificată, aceasta apare ca o subproblemă în foarte multe domenii, printre care putem
menționa secvențierea ADN -ului.
În aplicații le acestea , noțiunea de oraș este reprezentată , de exemplu, de clienți , ori de
puncte de sudură, ori de fragmente de ADN, iar ideea de distanță e repreze ntată de durata de
deplasare, de costul de realizare, sau de o măsură a similarității între fragmente de ADN.
PCV se regăsește , de asemenea, și în astronomie, mai exact când astronomii observă
mai multe surse , aceștia dorind să minimizeze timpul pe care îl petrece telescop ul în mișcare
între surse.
Se pot impune în multe aplicații constrângeri suplimentare, spre exemplu resursele
limitate sau ferestre de timp.
1.2. Reprezentarea grafică simplificată a unei rețelei de t ransport
Așadar, revenind la probleme de optimizare din re țele de transport și distribu ție,
prezentăm mai jos și o reprezentare grafică simplificată a rețelei.
Considerăm o rețea de transport în sens general, în care produsul ales a fi transportat este un ul
omogen și generic, pentru această reprezentare vom folosi ideea de graf.
Ca subcapitol de discuție, facem referire la modelarea problemelor de transport și
distribuție.
Având o bogată varietate de situații/ contexte ne pune m problema deplasării cantități i
generice Q care poate fi spre exemplu materie sau energie sau informație și așa mai departe ,
20
din anumite locuri care poartă denumirea, după cum am mai precizat – de surse către alte
locuri / zone care se intitulează puncte de destinați e, deplasare a aceasta realizându -se numai pe
anumite rute de legătură.
Unitățile cantității Q despre care vorbim sunt indivizibile și se deplasează pe
traiectoria rutelor și vor avea denumirea de unități de flux.
Pentru domeniul cercetării operațional e, problema care va fi enunțată ne va prezenta interes
doar dacă sunt respect ate ipoteze le următoare :
1. Măcar o sursă poate să aprovizio neze mai multe destinații și măcar o destinație
poate să prim ească unități le în c auză de flux de la mai multe surse. Rutele noastre de legătură
pot să aibă , de asemenea , și alte puncte , care sunt în comun , în afar ă de surse și destinații,
așadar, acestea se vor intitula puncte de tranzit sau puncte intermediare. Nu vom exclu de
legăturile care sunt directe între surse sau între destinații. În principiu, oric are rută se poate
parcur ge în ambele sensuri, dar p utem avea cazuri în care rutele sunt cu sens unic.
Ansamblul format din surse, destinații , puncte intermediare și, respecti v, rutele de
legătură va purta denumirea de rețea de transport; acesta se identifică , după cum am prezentat
în figura 1 de mai sus, cu un graf neorientat ori parțial orientat.
2. Unele dintre rutele noastre de legătură pot să aibă limitări inferioare sau limitări
superioare în ceea ce privește volumul unităților de flux , care se pot depla sa într-un sens sau
într-un alt sens . Limitările a ceste a se numesc capacități (inferioare sau superioare) . Mai mult ,
putem să avem în vedere doar cazul particular în care toate capacitățile inferioare sunt nule,
iar capacitățile superioare se vor exprima folosind numere strict pozitive.
3. De asemenea, știm că avem un cost pentru deplas area unei unități de flux d intr-un
punct al rețelei într-un alt punct , cost c e se poate exprima de exemplu în timp, în bani, în
distanță și așa mai departe. Există situații în care ace l cost poate să semnific e spre exemplu,
profitul care se obține în urma deplasării. Pe aceeași rută în cauză , costurile , respectiv
capacitățile pot să difer e depinzând de sensul în care se va parcurge drumul .
Ipoteza 1. va fi mereu presupusă , pe când ipotezele 2., respectiv 3. pot să existe simultan sau
separat .
I. În prezența ipotezei 3. și în lipsa condiției de la 2. , ne pune m problema deplasării
pentru cantit atea de flux Q de la surse le noastre către destinații , cu un cost total care să fie
minim.
Dacă aceste surse sunt în corelație directă cu destinațiile noastre , vom obține problema
clasică de transport, care va fi obiectul ideilor care urmează. Dacă vom considera cazul
general, unde exisă și puncte le intermediare, acesta va purta denumirea de problema
transferulu i. Dacă vom considera cazul particular și anume acela cu o singur ă sursă denumită
21
s, de asemenea cu o singur ă destinați e denumită t și cu o singur ă unitate de flux se va obține
problema drumului de cost minim de la sursa s la destin ația t.
II. În prezența ipotezei 2. și lipsa ipotezei 3., ne vom pune problema următoare, și
anume dacă rețeaua, a vând rutele capacitate, poate fi capabilă să ne permită acoperirea
integrală pentru cereri le din punctele de destinație.
Pentru ace st lucru , se va soluționa problema de determin are a volumului maxim notat
cu Q* de unități de flux , care pot să fie deplasate de la surse înspre destinații. În cazul în care
Q* < Q , cu siguranță vor exista destinații pentru care cerere a este acoperită doar parțial , iar
atunci ne punem problema de a mări capacit atea de transfer a rețelei. Așadar, a m descris , pe
scurt, problema fluxului maxim.
III. În prezența simultană și a ipotezei 2. , și a ipotezei 3., ne pune m problema de a
satisface cereri le din punctele de destinație , cu un cost de transport minim.
Ca și în cazul de mai devreme , noi vom avea în vedere o problemă puțin modificată:
va trebui să determin ăm prima dată cantitatea maximă de flux c are poate să fie deplasată de la
surse le noastre către destinații , iar abia apoi modul de organizare pentru deplas are, în așa fel
încât să avem costul operației minim.
Aceasta va fi problema fluxului (maxim) de cost minim.
22
CAPITOLUL II. APLICAȚIE
2.1. Enunțul problemei
Problema aleasă spre a fi rezolvată este următoarea:
Să se găsească cel mai scurt drum dintre un retailer ce deține o rețea de magazine
extinsă în toată România și un client care locuiește la o adresă aleasă la întâmplare de pe
teritoriul țării.
Cu alte cuvinte, această situație , care este extrem de des întâlnită , este ceea ce îl
interesează pe orice client care dorește să achiziționeze un produs/ serviciu dintr -un magazin
anume, care are mai multe filiale în țară .
Pentru problema aleasă și care va fi prezentată și ilustrată în paginile ce urmează, vom
consideră cazul ideal, și anume o rețea de transport simplă, formată doar din surse și
destinații, fără puncte in termediare și fără restricții de flux pentru fiecare drum, rețea ce are
magazinele identice ca suprafață și să considerăm că toate au aceleași produse și stoc pentru
produsul ce îl interesează pe client. Pe noi ne va intere sa doar cel mai scurt drum dintr e sursă
și destinație.
Deci , ne punem problema de cost minim, acest cost va fi numărul de kilometri dintre
magazin și client ( care este, bineînțeles direct proporțional cu suma necesară transportului ) .
Fie graful de mai jos ( Figura 2.1 ), unde avem nodurile 0, 1, 2, 3 … n, n este un număr
finit și îl vom fixa mai târziu. După câte se poate vedea, avem de a face cu un graf neorientat
cu n+1 noduri.
Pentru a soluționa această problemă a găsirii drumului de cost minim, vom considera
lanțul de magazine Papară Cezar -Marian S.R.L. care are 5 1 de astfel de magazine identice,
23
răspândite în toată țar a, în general câte unul în fiecare județ, dar existând și cazuri în care
avem mai multe magazine în teritoriul aceluiași județ .
Vom conveni că fiecare magazin în parte va fi identificat în mod unic printr -un ID, iar
pe lângă acesta, va mai avea și o adresă, inregistrată prin stradă, număr, oraș, județ, latitudine,
respectiv longitudine.
Produsul/ serviciul ce îl intereseză pe client va fi produsul X de care vom face
abstracție , singurul lucru pe care se va pune accent și pentru care se va căuta soluționarea
problemei noastre va fi drumul cel mai scurt dintre oricare din cele 5 1 de magazine și adresa
clientului , așadar numărul de kilometri de la client la cel mai apropiat magazi n.
Dacă procesul de cumpărare se poate face online, livrarea se va efectua prin
intermediul unei flote proprii sau prin intermediul unei firme de curierat.
Reprezentarea grafică simplificată ( Figura 2.2) , va fi în acest caz, un graf orientat
conex și fără cicluri, în care nodul 0 este reprezentat de domiciliul clientului, iar nodurile 1, 2,
3 … 51 vor fi reprezentate de adresele filialelor din lanțul de magazine al comerciantului
respectiv.
De precizat este că direcția de parcurgere a muchiilor sau mai bi ne zis a arcelor este
doar de la / dinspre magazine către client ( pentru că i se va livra produsul/ serviciul direct
acasă ).
Obiectul discuției noastre va fi procesul de cumpărare offline, și anume situația în care
clientul trebuie să meargă în magazin ul fizic pentru a -și găsi ce are nevoie.
În acest caz, este evident că acel client va dori să găsească cel mai apropiat magazin de
locația de domiciliu a sa.
24
Reprezentarea grafică simplificată ( Figura 2.3) , va fi un graf orientat conex și fără
cicluri, în care nodul 0 este reprezentat de domiciliul clientului, iar nodurile 1, 2, 3 … 51 vor fi
reprezentate de adresele filialelor din lanțul de magazine al comerciantului respectiv.
De precizat este că direcț ia de parcurgere a muchiilor / arcelor este doar de la/ dinspre
client către magazine / cel mai apropiat magazin .
2.2. Limbajele de programare folosite și mediul de lucru utilizat
Pentru a putea soluționa și implementa această problemă, am decis să realizez un site
WEB. Pentru a -l putea realiza, am utilizat HTML, PHP, CSS, SQL.
2.2.1. HTML
Limbajul de programare HTML se referă la HyperText Markup Language și este
un limbaj de programare folosit pentru a crea pagini web c are pot fi expuse/ afișate / deschise
într-un navigator (sau browser ). Scopul acestuia este mai mult pentru a prezenta informaț iile –
ca de exemplu paragrafe, tabele, fonturi și așa mai departe .
HTML se definește ca o formă de marcare orientată pentru prezentarea documentelor
de tip text pe o singur ă pagină, folosind un soft specializat pentru redare, ce poartă denumirea
de agent utilizator HTML, exemplul cel mai bun pentru astfel de software fiind reprezentat
de browserul web.
Limbajul HTML ne furnizează mijloace prin intermediul cărora conținutul unui fișier/
document va putea fi adnotat având tipuri diverse de metadate , respectiv indicații pentru
25
redare. Indicațiile pentru redare pot să varieze începând cu decorațiuni le minore ale textului,
de exemplu precizarea faptului că un cuvânt anume trebuie să fie subliniat sau că trebuie să
fie introdusă o imagine , și până la scripturi le complexe , hărți le de imagini , respectiv
formulare le. Metadatele pot să includă informații referitoare la titlul , la autorul fișierului/
documentului, informații de structur ă în legătură cu împărți rea docu mentul ui în segmente
diferite , în paragrafe, în titluri, în liste și așa mai departe, și informații le cruciale c e ne permit
să legăm documentul de alte le, formând astfel hiperlink -uri.
HTML reprezintă un format de tip text care este proiectat pentru a putea să fie citit și
să fie editat de către utilizatori folosind orice editor de text. Cu toate acestea, scrierea /
completarea și modificarea paginilor în acest caz necesită cunoștințe avansate în acest
domeniu și ia timp.
HTML poate fi generat direct folosind tehnologii de codare din partea serverului de
exemplu PHP, ASP sau JSP . Foarte multe aplicații precum sistemele de gesti une a
conținutului , forumurile web sau wiki-urile generează pagini de tip HTML.
HTML este , în plus, folosit și în e-mail. Cele mai multe aplicații de e -mail utilizează
un editor de tip HTML care este încorporat , pentru a putea compune e -mail-uri și un motor
pentru prezentare a e-mail-urilor de tipul acest a.
2.2.2. PHP
PHP reprezintă un limbaj de programare . Numele acest uia provine din engleză și e o
abreviere de la : Php: Hypertext Preprocessor. Acesta a fost f olosit inițial pentru a produce
pagini web de tip dinamic, se folosește pe scară largă pentru dezv oltarea paginilor și a
aplicațiilor web. Se utilizează în general inclus în codul HTML , dar de la versiunea 4.3.0
poate fi folosi t și singur în mod ul de tip linie de comandă, care permite crearea aplicații lor
independente. Acesta e unul din tre cele mai importante limbaje din programare a web de tip
server -side și open -source , există versiuni care sunt disponibile pentru cele mai multe servere
web și pentru orice sistem de operare. După statistici , acesta e instalat pe 1 milion de servere
web și pe 20 de milioane de site -uri web. E disponibil sub Licen ța PHP ṣi Organizația Free
Software Foundation îl consideră un software liber sau gratis.
La început , acest limbaj a fost dezvoltat de către inventatorul său, intitulat Rasmus
Lerdorf . Pe parcursul creșter ii numărului de oameni care îl utiliz ează, dezvoltarea acestuia a
fost preluată de către Grupul PHP.
Limbajul PHP este ușor de folosit , deoarece este un limbaj de progr amare structurat ,
cum sunt de altfel și Perl, și C și Java, începând de la versiunea 5, sintaxa acestui limbaj
26
reprezintă o combinație a celor enunțate mai devreme . Mulțumită modularității lui, el poate fi
utilizat și pentru a dezvolta aplicații independente , spre exemplu în combinație cu PHP-
GTK ori poate fi utilizat ca Python sau Perl, în linia de comandă. Cu siguranță unul dintre cele
mai importante beneficii ale limbajului este repre zentat de posibilitatea conlucr ării cu
majoritatea bazelor de date relaționale , începând cu MySQL , până la Oracle , PostgreSQL , MS
Sql Server , sau DB2 .
PHP poate să ruleze pe cele mai multe sisteme de operare, de la Windows , UNIX ,
Mac OS X și poate să interacțion eze cu cele mai multe servere web . Codul PHP va fi
interpretat de către serverul WEB și va gener a un cod de tip HTML ce poate fi văzut de
utilizator în cauză .
2.2.3. CSS
CSS provine de la abrevierea cuvintelor Cascading Style Sheets și reprezintă un
standard în ceea ce privește formatarea elementelor dintr -un document de tip HTML . Putem
să atașăm s tiluri pentru elementel e HTML , folosind fișiere externe ori chiar în cadrul aceluiași
document, scriind structura <style> sau atributul style . CSS poate fi utiliza t, de asemenea și
pentru a formata elementel e XML , XHTML , SVGL .
2.2.4. SQL
SQL provine de la abrevierea cuvintelor Structured Query Language .
Acesta este un limbaj de interogare structurat , este un l imbaj de programare folosit
pentru manipularea de date din sistemele de manipulare din bazel e de date relaționale și la
origine acesta este considerat un limbaj care se bazează pe algebra relațională. El are scopul
de a insera datel e, de interoga re, de ștergere și de actualizare, de modificare și de creare a
schemelor, de asemenea și de a control a accesul la date.
El a ajuns un standard în acest domeniu, și este cu siguranță cel mai cunoscut limbaj
folosit pentru crearea, regăsirea, modificarea, respectiv manipularea datelor de către sistemele
de gestiune a bazelor de date relaționale. În afară de versiunile standardizate ale acestui
limbaj, sunt foarte multe variante și dialecte, unele sunt proprietare și specifice anumitor
SGBD -uri și conți n extensii pentru a putea să supor te sistemele de baze de date obiectuale
(sau obiectual -relaționale).
SQL ne permite atât accesul la structura bazelor de date, cât și la conținutul acestora.
2.2.5. Xampp
Pentru a putea realiza site -ul WEB și pentru a crea și administra baza de date am
utilizat programul Xampp. Acesta reprezintă un pachet de produse gratuite de tip software,
27
cross -platform web server și open -surce , ce constă în MySQL database , Apache HTTP
Server , respectiv interpret oare de scripturi realizate în limbaje de programare precum Perl și
PHP.
2.2.6. Sublime Text 3 și Atom
Pentru a putea scrie, modifica și gestiona codul și implicit site-ul, care a fost realizat in
localhost, am utilizat edito arele text Sublime Text 3 și, ulterior, Atom .
2.3. Codul sursă
Site-ul WEB a fost realizat în localhost, conține 4 pagini, respectiv 7 documente și un
fișier cu elementele media (imaginea de fundal, poza și CV -ul).
2.3.1. Documentul index.php
Acest document reprezintă pagina de pornire a site -ului, pagina care se va deschide în
mod implicit și în mod evident este pagina principală.
Codul sursă aferent este următorul :
<!DOCTYPE htm l>
<html>
<head>
<?php require "bazadedate.php" ?> <! – Avem nevoie de baza de date –>
<meta http -equiv="content -type" content="text/html; charset=UTF -8" />
<link rel="stylesheet" type="text/css" href="stiluri.css"> <! – Avem nevoie de pagina de
stiluri ca re este stiluri.css –>
<title> Papară Cezar -Marian S.R.L. </title>
</head>
<body>
<div class="btn -group"> <! – Aici asezam grupul de butoane care comuta intre pagini –>
<button onclick="window.location.href ='index.php';" >Pagina principală</button>
<button onclick="window.location.href ='paginaprezentare.php';" >Pagina de
prezentare</button>
<button onclick="window.location.href ='magazine.php';"> Magazine</button>
<button onclick="window.location.href ='gasestemagapropiat.php';"> Magazinul
apropiat</button>
</div>
<h1>Bine ai venit! </h1>
<div class="paragrafe_prima_pg"> <! – Aici asezam chenarul informativ –>
28
<h1>Optimizarea discretă într -o rețea de transport</h1>
<h3>Lucrarea mea de licență a constat în găsirea și aplicarea unei soluții în ceea ce privește
problemele de optimizare din rețelele de transport.</h3>
<h3>Problema în cauză a fost identificarea celui mai scurt drum de la o adresă aleatoare
completată de către un client către filialele unui la nț de magazine. </h3>
<h3>Acest lanț de magazine l -am intitulat generic "Papară Cezar -Marian S.R.L." având 51 de
filiale cu adrese reale din toată țara.</h3>
<h3>Problema de transport a fost considerată în cazul general, având doar sursă și destinație,
fără puncte intermediare.</h3>
<h3>Subdomeniul tratat din domeniul optimizării rețelelor de transport a fost problema
drumului de cost minim (problema celui mai scurt drum).</h3>
</div>
</body>
</html>
Această pagină va arăta ca în Figura 3.
2.3.2. Documen tul paginaprezentare.php
Acest document reprezintă pagina de prezentare a site -ului, unde am trecut câteva
informații despre mine, o poză, respectiv un CV.
Codul sursă aferent este următorul :
<!DOCTYPE html>
<html>
29
<head>
<meta http-equiv="content -type" content="text/html; charset=UTF -8" />
<link rel="stylesheet" type="text/css" href="stiluri.css"> <! – Avem nevoie de pagina de
stiluri care este stiluri.css –>
<title> Despre noi </title>
</head>
<body>
<div class="btn -group"> <! – Aici asezam grupul de butoane care comuta intre pagini –>
<button onclick="window.location.href ='index.php';" >Pagina principală</button>
<button onclick="window.location.href ='paginaprezentare.php';" >Pagina de
prezentare</button>
<button onclick="wi ndow.location.href ='magazine.php';"> Magazine</button>
<button onclick="window.location.href ='gasestemagapropiat.php';"> Magazinul
apropiat</button>
</div>
<h1> Date de contact</h1>
<div class="paragrafe_pag_prezentare"> <! – Aici asezam chenarul informa tiv–>
<h3> Papară Cezar -Marian, Mobil: 0753 754 567, "Universitatea Vasile Alecsandri" din
Bacău, Facultatea de Științe, Informatică</h3>
</div>
<div class="imagine -si-cv"> <! – Aici asezam imaginea si cv -ul–>
<img src="fisiere_media/eu.jpg" alt="Poza cu mine" style="width:250px; height:441px;
margin:10px 25px";>
<iframe src="fisiere_media/CV.pdf" alt="Curriculum Vitae" style="width:700px;
height:441px; margin:10px 25px";>
</iframe>
</div>
</body>
</html>
Această pagină va arăta ca în Figura 4.
30
2.3.3. Documentul magazine.php
Acest document reprezintă pagina care cuprinde tabelul cu toate filialele lanțului de
magazine, strada, numărul, orașul și județul unde se vor putea regăsi.
Codul sursă aferent este următorul :
<!DOCTYPE html>
<html>
<head>
<?php require "bazadedate.php" ?> <! – Avem nevoie de baza de date –>
<meta http -equiv="content -type" content="text/html; charset=utf -8" />
<link rel="stylesheet" type="text/css" href="stiluri.css"> <! – Avem nevoie de pagina de
stiluri care este stiluri.css –>
<title> Rețea Magazine </title>
</head>
<body>
<div class="btn -group"> <! – Aici asezam grupul de butoane care comuta intre pagini –>
<button onclick="window.location.href ='index.php';" >Pagina principală</button>
<button onclick="win dow.location.href ='paginaprezentare.php';" >Pagina de
prezentare</button>
<button onclick="window.location.href ='magazine.php';"> Magazine</button>
<button onclick="window.location.href ='gasestemagapropiat.php';"> Magazinul
apropiat</button>
31
</div>
<h1> Rețeaua noastră de magazine</h1>
<?php
// Creem un tabel pe pagina Magazine cu toate datele din tabela magazine
$sql = "SELECT * FROM magazine";
$result = $conn ->query($sql);
if ($result ->num_rows > 0) {
//afisam prima linie din tabelul cu magazine, aceast a va cuprinde: Nr., Nume, Strada, Numar,
Oras, Judet
echo "<table class='magazine'> <tr><th>Nr.</th><th>Nume</th> <th>Strada</th>
<th>Număr</th> <th>Oraș</th> <th>Județ</th></tr>";
// pe urmatoarele linii, afisam inregistrarile din tabela magazine
while($r ow = $result ->fetch_assoc()) {
echo "<tr><td>". $row["id"]. "</td><td>".$row["nume"]. "</td><td>". $row["strada"]."
</td><td>". $row["numar"].
"</td><td>".$row["oras"]."</td><td>".$row["judet"]."</td></tr>";
} echo "</table>";
} else {
echo "0 results";
}
$conn ->close();
?>
</body>
</html>
Această pagină va arăta ca în Figura 5.
32
2.3.4. Documentul gasestemagapropiat.php
Acest document, care este și ultima pagină a site -ului web, reprezintă în fond aplicația
problemei, și anume aceea de a identifica cel mai apropiat magazin fizic de adresa introdusă
de către client.
De precizat este faptul că, neexistând nici un script/ ap i open -source pentru a putea
face conversia dintr -o adres ă în geocoordonate (latitudine și longitudine), pentru adresa
clientului , vor fi, în mod evident, necesare și câmpurile latitudine, respectiv longitudine.
După completarea datelor și apăsarea butonului AFLĂ MAGAZINUL , aplicația va
afișa nu numai cel mai apropiat magazin fizic de adresă, ci va crea și un tabel sortat crescător
în funcție de distanță, care cuprinde toate filialele lanțului de magazine (inclusiv adresa lor
completă), distanța și , mai mult decât atât , pe ultima coloană a fiecărui magazin va fi un
hiperlink care va trimite utilizatorul la Google Maps, unde vor fi completate automat pentru
traseu adresa clientului și adresa magazinului , acesta putând vizualiza direct drumul/
drumurile către destinație.
Codul sursă aferent este următorul :
<?php
error_reporting(0);
ini_set('display_errors', 0);
require "bazadedate.php"; /*Avem nevoie de baza de date*/
require "functie -calcul.php"; /*Avem nevoie de functia de calcul*/
?>
33
<!DOCTYPE html>
<html>
<head>
<meta http -equiv="content -type" content="text/html; charset=UTF -8" />
<link rel="stylesheet" type="text/css" href="stiluri.css"> <! – Avem nevoie de pagina de
stiluri care este stiluri.css –>
<title> Magazinul apropiat </titl e>
</head>
<body>
<div class="btn -group"> <! – Aici asezam grupul de butoane care comuta intre pagini –>
<button onclick="window.location.href ='index.php';" >Pagina principală</button>
<button onclick="window.location.href ='paginaprezentare.php';" >Pagin a de
prezentare</button>
<button onclick="window.location.href ='magazine.php';"> Magazine</button>
<button onclick="window.location.href ='gasestemagapropiat.php';"> Magazinul
apropiat</button>
</div>
<h1>Găsesște cel mai apropiat magazin de adresa ta</h1 >
<div class="paragraf_inf_gaseste_mag">
<h2>Introdu adresa ta curentă</h2> <! – Aici asezam primul chenar de pe pagina –>
<h2>Completează latitudinea și longitudinea</h2>
</div>
<div class="container1"> <! – Aici asezam al doilea chenar de pe pagina, cu f ormularul de
completare –>
<form method="post">
<input type="text" id="adresa" name="adresa" placeholder="Adresa ta">
<input type="text" id="latitudine" name="latitudine" placeholder="Introdu latitudinea"
required>
<input type="text" id="longitudine" name= "longitudine" placeholder="Introdu longitudinea"
required>
<input name="formular_strada_1" type="submit" value="Află magazinul">
</form>
</div>
<?php
if (isset($_POST['formular_strada_1'])) { // daca se apasa butonul afla magazinul
34
$adresa = $_POST['adresa'];
$lat = floatval($_POST['latitudine']); // variabila latitudine ia valoarea din inputul introdu
latitudine
$long = floatval($_POST['longitudine']); // variabila longitudine ia valoarea din inputul
introdu longitudine
$finalAdress = $lat . ',' . $long; // variabila finalAdress este concatenarea din cele 2 de mai sus
cu virgula intre ele
$sql = "SELECT * FROM magazine"; // facem o selectie din baza noastra de date
$rezultat = $conn ->query($sql);
$dateComparate = []; // folosim vectorul dateComparate
if ($rezultat ->num_rows > 0) { // daca avem rezultate
$rezultate = $rezultat ->fetch_all(MYSQLI_ASSOC);
foreach ($rezultate as $numarRand => $dateRand) { // calculam pentru fiecare magazin din
baza de date distanta fata de adresa clie ntului
$dateComparate[$dateRand['id']] = [
'dateMagazin' => $dateRand,
'distanta' => getDistanceBetweenPointsNew(
$lat,
$long,
$dateRand['latitudine'],
$dateRand['longitudine'],
'Km'
)
];
}
array_multisort(array_column($dateComparate, 'distanta'), SORT_ASC, $dateComparate); //
sortam vectorul de mai devreme dupa distanta
}
$conn ->close(); // inchidem conexiunea cu baza de date
}
?>
35
<?php if (!empty($dateComparate) && isset($rezultate)): ?> < !– Daca vectorul nostru nu este
gol si daca avem rezultate –>
<table class="magazine">
<tr> <! – Creem un tabel cu toate magazinele sortate in ordine dupa distanta absoluta fata de
coordonatele adresei clientului –>
<th>Nr.</th>
<th>Nume</th>
<th>Strada </th>
<th>Număr</th>
<th>Oraș</th>
<th>Județ</th>
<th>Distanța</th>
<?php if (isset($finalAdress)): ?>
<th>Traseu</th>
<?php endif; ?>
</tr>
<?php foreach ($dateComparate as $key => $value): ?>
<?php $dateMagazinTmp = $value['dateMagazin']; ?>
<tr>
<td> < ?php echo $dateMagazinTmp['id'];?> </td>
<td> <?php echo $dateMagazinTmp['nume'];?> </td>
<td> <?php echo $dateMagazinTmp['strada'];?> </td>
<td> <?php echo $dateMagazinTmp['numar'];?> </td>
<td> <?php echo $dateMagazinTmp['oras'];?> </td>
<td> <?php echo $dateMagazinTmp['judet'];?> </td>
<td> <?php echo $value['distanta']; ?> km </td>
<?php if (isset($finalAdress)): ?> <! – Daca variabila finalAdress e setata –>
<?php
$storeAdress = $dateMagazinTmp['latitudine'] . ',' . $dateMagazinTmp['longitudine'];
/* concatenam latitudinea si longitudinea adresei magazinului cel mai apropiat cu virgula intre
ele*/
$finalAdressLink =
'https://www.google.com/maps/dir/?api=1&travelmode=driving&origi n=';
// partea de inceput din hyperlinkul care duce la google maps
$finalAdressLink .= $finalAdress . '&destination=' . $storeAdress;
36
/* concatenam in ordine tot si obtinem un api care conduce la google maps avand originea
adresa clientului
si destinatia adresa celui mai apropiat magazin*/
?>
<td> <a href="<?php echo $finalAdressLink; ?>" target="_blank"> Vezi traseu </a> </td>
<!– pe ultima coloana afisa m pt fiecare magazin hyperlink ul la google maps –>
<?php endif; ?>
</tr>
<?php endforeach; ?>
</table >
<?php endif; ?>
</body>
</html>
Această pagină va arăta ca în Figura 6. ( după ce va se introduce o adresă)
2.3.5. Documentul functie -calcul.php – Formula Haversine
În acest document se regăsește funcția care stă la baza aplicației lucrării mele de
licență.
Funcția care a fost implementată în PHP are următoarea proveniență matematică și istorică.
37
Formula Haversine :
Formula haversine determină ce mai scurtă distanț ă dintre două puncte de pe o sferă,
având date coordonatele acestora , și anume, latitudinea, respectiv longitudinea .
Importan tă în naviga ție, aceasta reprezintă un caz special din mulțimea formul elor
trigonometrice din trigonometria sferică .
Legea haversin elor prezintă laturile și unghiurile triunghiurilor sferice.
Primul tabel în limba engleză al haversinelor a fost publicat de către James Andrew în
1805, dar Florian Cajori îi acordă creditele pentru o utilizare mai timpurie lui José de
Mendoza y Ríos în 1801.
Termenul haversine a fost inventat în 1835 de către James Inman .
Aceste denumiri provin de la funcția haversină, dată de hav (θ) = sin2 (θ/2).
Formulele pot fi scrise în mod egal în termenii oricărui multiplu al haversinei, cum ar
fi funcția haversine mai veche (de două ori mai mare decât haversine).
Înainte de apariția calculatoarelor, eliminarea împărțirii și înmulțirii cu factori de doi s -a
dovedit suficient de convenabilă încât tabelele de valori haversine și logaritmii au fost incluse
în navigația și în textele trigonometrice ale secolului XIX și începutul secolului XX .
În zilele noastre, forma haversine este de ase menea convenabilă prin faptul că nu are
coeficient în fața funcției sin2.
Încă un lucru care trebuie precizat, deoarece funcția, care va fi prezentată mai
jos, folosește o formulă matematică care calculează distanța dintre două puncte în linie
dreaptă, (și NU un API care să țină cont și de străzi, trasee etc. , deoarece nu există nici
un API Open -Source pentru acest lucru ) există posibilitatea ca în momentul calculării
distanțelor și sortării pentru a afla cel mai scurt drum, să existe diferențe între numărul
de Km afișați prin calcul și numărul real de Km afișat de Google Maps.
Codul sursă aferent este următorul :
<?php
/**
*Aceasta functie calculeaza distanta absoluta (nu si cea reala folosind strazile, din pacate)
*dintre doua puncte
*
* @param latitude1 latitudinea clientului
* @param longitude1 logitudinea clientului
* @param latitude2 latitudinea magazinului
* @param longitude2 logitudinea magazinului
*
38
* @return float Distance in Kilometers.
*/
function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2,
$unit = 'Mi') {
$theta = $longitude1 – $longitude2;
$distance = sin(deg2rad($latitude1)) * sin(deg2rad($latitude2)) + cos(deg2rad($latitude1)) *
cos(deg2rad($latitude2)) * cos(de g2rad($theta));
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
$distance = $distance * 1.4;
switch($unit)
{
case 'Mi': break;
case 'Km' : $distance = $distance * 1.609344;
}
return (round($distance,2));
}
?>
2.3.6. Documentul bazadedate.php
În acest document am creat conexiunea cu baza de date care poartă denumirea de retea
de magazine.
Codul sursă aferent este următorul :
<?php
// Aici facem conexiunea cu baza de date
$servername = "localhost"; /*folosim localhost*/
$username = "root"; /*nume user este root*/
$password = ""; /*nu completam parola deoarece nu avem*/
$dbname = "retea de magazine";/*ne conectam la baza de date care are denumirea de retea de
magazine*/
// Creaza conexiunea
$conn = new mysqli($servername, $username, $password, $dbname);
// Verificam conexiunea
if ($conn ->connect_error) {
39
die("Connection failed: " . $conn ->connect_error);
}
?>
Baza de date a fost creată în PHPmyAdmin , după cum a m zis, are denumirea de retea
de magazine, având o singură tabelă intitulată magazine, unde se vor regăsi toate cele 51 de
magazine, având fiecare câte un id, nume, stradă, număr, oraș și județ, latitudine, respectiv
longitudine.
Aceast a poate fi văzută în Figura 7.
2.3.7. Documentul stiluri.css
Nu în ultimul rând, în ceea ce privește aplicația, vom discuta despre fișierul CSS.
Aici am stilizat toate paginile, pentru a putea arăta în forma lor finală, după cum au
fost prezentate și ilustrate mai sus.
Pe langă fiecare pagină în parte, pe lângă funcția de calcul a distanței de mai devreme,
scheletul CSS joacă un rol important în ceea ce privește orice site WEB.
Precizez că absolut toate stilizările au fost construite de la zero, neexistând un șablon
de la care am început sau referințe la site -uri ce oferă link -uri de stilizare open -source.
Codul sursă aferent este următorul :
/*stilizam tot corpul site -ului*/
body {
height: 100%; /*inaltime de 100% pe ecarn*/
margin: 0; /*margini fata distanta de extrewmitatile ecranului*/
background -image: url("fisiere_media/Fundalsite.jpg"); /*aici setam imaginea de fundal*/
40
background -repeat: no -repeat; /*imaginea va aparea doar o singura data*/
background -attachment: fixed;/*imaginea va sta fixata pe ecran*/
background -size: cover; /*imaginea va fi asezata pe tot ecranul*/
font-family: "Trebuchet MS", Arial, Helvetica, sans -serif; /*stilizare pentru font*/
}
/*aici aliniem parag rafele h1 – ceke mai mari – la centru*/
h1 {
color: black;
text-align: center;
}
/*de asemenea si pentru paragrafele h2*/
h2{
text-align: center;
}
/*cele de dimensiunea h3 le aliniem la stanga*/
h3 {
text-align: left;
}
p {
color: black;
}
/*Aici vom stiliza toate paragrafele din prima pagina index.html*/
div.paragrafe_prima_pg {
color: white;/*textul va avea culoarea alba*/
border -radius: 10px; /*bordura chenarului sa fie rotunjita*/
margin -top: 50px; /*distanta de 50 de pixeli in partea de sus*/
margin -bottom: 50px; /*distanta de 50 de pixeli in partea de jos*/
margin -left: 350px;/*distanta de 350 de pixeli in stanga*/
margin -right: 350px;/*distanta de 350 de pixeli in dreapta, asadar se va pozitiona pe centru*/
background -color: blue; /*fundal al bastru*/
padding: 20px;/*20 de pixeli distanta dintre fiecare paragraf si colturile chenarului*/
opacity: 0.8; /*facem putin mai transparent chenarul*/
}
/*Aici vom stiliza toate paragraful din prima pagina de prezentare*/
div.paragrafe_pag_prezentare {
41
color: white; /*textul va avea culoarea alba*/
border -radius: 10px; /*bordura chenarului sa fie rotunjita*/
margin -bottom: 10px;/*distanta de 50 de pixeli in partea de jos*/
margin -left: auto;
margin -right: auto;/*aliniere la centru automat*/
width:1067px; / *aici setam latimea chenarului paragrafului*/
background -color: blue;/*fundal albastru*/
opacity: 0.75;/*facem putin mai transparent chenarul*/
padding: 5px;/*5 pixeli distanta dintre fiecare paragraf si colturile chenarului*/
}
/*aici vom stiliza imaginea si Cv -ul pe care le -am reunit intr -o singura entitate*/
div.imagine -si-cv{
border -radius: 10px;
margin -bottom: 10px; /*distanta de 10 pixeli in partea de jos*/
margin -left: auto;
margin -right: auto;/*aliniere la centru automat*/
width:1067px;/*aic i setam latimea reunita a celor doua*/
padding: 5px;/*5 pixeli distanta dintre fiecare element si colturile chenarului, care e
invizibil*/
}
/*stilizam tabelele si coloanele lor*/
table, th, td {
border: 1px solid black; /*bordura neagra subtire*/
text-align: left;/*alinierea textului la stanga*/
margin -left: auto;
margin -right: auto;/*aliniere la centru automat*/
}
/*stilizam doar tabelul cu magazinele din pagina magazine*/
.magazine {
border -collapse: collapse; /*lasa cate o singura bordura, in modul defa ult este dubla*/
width: auto; /*latimea tabelului se regleaza automat in functie de text*/
}
/*stilizam coloanele din tabelul din pagina magazine*/
.magazine td, .magazine th {
border: 1px solid #ddd; /*bordura subtire de culoarea gri spre alb */
42
padding: 8px;/* 8 pixeli distanta dintre text si extremitatile tabelului*/
}
.magazine tr:nth -child(even){background -color: #f2f2f2*/;}
/*stilizam sa se vada intr -o nuanta de gri cand trecem cu mouse -ul peste liniile din tabel*/
.magazine tr:hover {background -color: #ccd; }
/*stilizam prima linie a tabelului magazine*/
.magazine th {
padding -top: 12px; /* 12 pixeli distanta dintre text si extremitatea de sus*/
padding -bottom: 12px;/* 12 pixeli distanta dintre text si extremitatea de jos*/
text-align: center;/*aliniem capetele de coloana la mijloc*/
background -color: blue;/*fundalul primei linii are culoarea albastru*/
color: white;/*textul primei linii are culoarea alb*/
}
/*aici vom stiliza grupul de butoane – Pagina principala, Pagina de prezentare , Magazine,
Magazinul Apropiat*/
/*aceste butoane sunt niste hyperlinkuri care trimit la paginile site -ului format din cele 4
pagini*/
/*ele se regasesc in extremitatea de sus a site -ului si apar pe fiecare pagina, pentrua putea fi
usor de comutat intre el e*/
.btn-group button {
width: 25%; /*fiind patru butaone, am setat cate 25 % pentru fiecare din latimea totala a
ecranului*/
opacity: 0.6; /*sunt putin transparente*/
font-size: 16px; /*dimensiunea de 16 pixeli pentru font*/
background -color: blue; /* fun dal albastru */
border -style: groove; /*bordura de tip groove*/
border: 2px solid #464a82; /* bordura gri */
color: white; /* teztul de culoare alba */
padding: 10px 24px; /*10 pixeli in us, 24 in dreapta*/
cursor: pointer; /* mouse -ul devine o mana cand s e trece peste ele */
float: left; /* lipeste butaonele*/
}
/* asezam butoanele aliniate stanga dreapta */
.btn-group:after {
43
content: "";
clear: both;
display: table;
}
.btn-group button:not(:last -child) {
border -right: none; /* Prevenim dublarea bordurilor */
}
/* Cand trecem cu mouse -ul peste ele devin mai profunde, pentru a iesi in evidenta */
.btn-group button:hover {
opacity: 1;
font-weight: bold;
}
input[type=text], .select {
box-sizing: border -box;
padding: 15px;
width: 100%;
margin: 5px;
}
/*stilizam butonul afla magazinul*/
input[type=submit] {
width: 100%; /*latime de 100%*/
padding: 15px; /*cate 15 pixeli distanta de extremitati*/
text-transform: uppercase; /*teztul sa fie cu majuscule*/
font-weight: 700; /* seteam dimensiunea pentru font*/
font-size: 1.25em;
margin: 5px; /*5 pixeli pentru margini*/
outline: none;
}
/*stilizam acest buton de mai sus pentru a fi responsive cand trecem cu mouse -ul peste el*/
input[type=submit]:hover {
background -color: #5500ff; /*fundalul devine o nuanta de mov*/
color: #fff; /*culoarea devine alba*/
border: 0; /*bordura devine 0*/
outline: none;
}
44
/*stilizam container 1 care este chenarul cu adresa ta, introdu latitudinea, introdu longitudinea
si afla magazinul*/
div.container1 {
border -radius: 10px;/*bordura chenarului sa fie rotunjita*/
margin -top: 50px;/*distanta de 50 de pixeli in partea de sus*/
margin -bottom: 50px;/*distanta de 50 de pixeli in partea de jos*/
margin -left: 500px;/*distanta de 500 de pixeli in partea din stan ga*/
margin -right: 500px;/*distanta de 500 de pixeli in partea din dreapta*/
background -color: blue;/*fundal albastru*/
opacity: 0.7;/*patin transparent*/
padding: 25px; /*cate 25 de pixeli distanta de extremitati*/
}
/*iar aici vom stiliza paragraful cu i ntrodu adresa ta curenta*/
div.paragraf_inf_gaseste_mag{
border -radius: 10px;/*bordura chenarului sa fie rotunjita*/
color: white;/*textul are culoarea alb*/
margin -left: 500px;/*distanta de 500 de pixeli in partea din stanga*/
margin -right: 500px;/*distan ta de 500 de pixeli in partea din dreapta*/
background -color: blue;/*fundal albastru*/
opacity: 0.7;/*p utin transparent*/
padding: 20px;/*cate 25 de pixeli distanta de extremitati*/
}
45
Concluzii
O primă concluzie pe care o văd, după finalizarea lucrări i mele de licență , este cât de
mult po t conta munca, studiatul, aprofundarea, dezvoltarea și elaborarea până la forma finală
a unui concept.
Prin comparație, în spatele unui rezultat optim ce poate părea, la prima vedere, simplu,
pot sta săptămâni, luni, chiar și ani de muncă și implicare, dedicar e și devotament, rezultate
bune și mai puțin bune, reușite și eșecuri, însă toate acestea contează în mod egal, de oarece
din greșeli se învață .
O a doua con cluzie este cât de frumos și de complex este acest domeniu – Informatica
– cu toate ramurile și subramurile ei, cât de mult contează pentru lumea înconjurătoare și se
poate constata cu uimire și plăcere în câte și mai câte domenii activează, domenii care
aparent, nu au nici o legătura directă cu IT -ul.
În plus, subiectul lucrării mele m -a făcut să realizez cât de mult contează o administrare
corectă și complexă, având oameni calificați si dedicați, pentru o rețea de transport.
În fond, care ar fi scopul ace stor foarte studii și abordări foarte vaste pentru optimizarea unei
rețele, în afară de bani?
Ca de altfel, și pentru orice alt proces total diferit și ales decât optimizarea într -o rețea
de transport, realizarea acțiunilor într -o ordine cât mai potrivită și cât mai bună ne va aduce un
câștig mult mai prețios decât banii, pe care aceștia nu îl pot cumpăra – TIMPUL.
Ca încheiere, doresc să pun în lumină ideea următoare:
Cu c ât vom face lucrurile mai bine, mai frumos și mai optim, cu atât vom avea mai mult timp
pentru a ne putea bucura de ce contează cu adevărat în viață – famili a și cei dragi.
Vă mulțumesc!
46
Bibliografie
1. Cormen Thomas H., Leiserson Charles E., Rivest Ronald R . – Algoritmi pe grafuri ,
Capitolul VI: Flux maxim .
2. Giumale Cristian A. – Introducere in analiza algoritmilor , Cap. V Algoritmi pr grafuri:
Fluxuri maxime intrun graf.
3. http://www.asecib.ase.ro/Mitrut%20Dorin/Curs/bazeCO/html/27Transport.htm
accesat la data de 10.05.2020 .
4. http://www.asecib.ase.ro/Nica/CO/BCO/capitolul21.pdf
accesat la data de 15.05.2020 .
47
UNIVERSITATEA „VASILE ALECSANDRI” DIN
BACĂU
Facultatea de Științe
Str. Calea Mărășești, nr. 157, Bacău, 600115
Tel. ++40 -234-542411, tel./ fax ++40 -234-571012
www.ub.ro ; e-mail: stiinte@ub.ro
DECLARA ȚIE DE AUTENTICITATE
privind elaborarea lucrării de finalizare studii
Subsemnatul, Papară Gh. -F. Cezar -Marian, declar pe propria răspundere că:
a) lucrarea a fost elaborată personal și îmi aparține în întregime;
b) nu au fost folosite alte surse decât cele menționate în bibliografie;
c) nu au fost preluate texte, date sau elemente de grafică din alte lucrări sau din alte surse
fără a fi citate și fără a fi precizată sursa preluării, inclusiv în cazul în care sursa o
reprezintă alte lucrări ale mele;
d) lucrarea nu a mai fost folosită în alte contexte de examen sau de concurs.
Data, Semnătura,
16.06.2020 Papară Cezar -Marian
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Str. Calea Mărășești, nr. 157, Bacău, 600115 [618322] (ID: 618322)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
