Sunteți pe pagina 1din 7

1.

Functia nordest

Functia nordest utilizeaza modelul coltului de nord-est. Variabile utilizate in functia


nordest sunt:
 elemental de matrice [sol,b]= nordest(f,cer);
 variabila sol repreinta transferurile folosind regula de nord-est pentru dimensiunea
matriceala m x n;
 variabila matriceala b va contine 1 pentru fiecare variabila de baza si 0 pentru
restul variabilelor din matricea (m x n);
 variabila f reprezinta matricea furnizorilor de dimensiunea (m x 1);
 variabila cer reprezinta matricea cererilor de dimensiunea (n x 1);
In conditiile in carea oferta totala nu este egala cu cererea, pe ecran va apare mesajul de
eroare:
disp('EROARE: Oferta totala nu este egala cu cererea totala.');
Variabilelor m si n li se atribuie numarul valorilor furnizorilor, respective numarul
valorilor cererilor:
m=length(f);
n=length(cer);
i=1;
j=1;
sol=zeros(m,n);
b=zeros(m,n);
while ((i<=m) & (j<=n))
if f(i)<cer(j)
sol(i,j)=f(i);
b(i,j)=1;
cer(j)=cer(j)-f(i);
i=i+1;
else
sol(i,j)=cer(j);
b(i,j)=1;
f(i)=f(i)-cer(j);
j=j+1;
end
end
2. Functia coeficienti
Functia coeficienti calculeaza coeficientii Lagrange pentru fiecare element matriceal din
sistem. Variabilele utilizate in aceasta functie sunt:
 elementul matriceal coeficienti[u,v]=(sol,c,b) care contine coeficientii lagrange de
pe fiecare element de matrice;
 variabila matriceala sol ce reprezinta solutia curenta de tipul unei matrice (m x n);
 variabila matriceala b care contine 1 pentru fiecare variabila de baza si 0 pentru
restul variabilelor din matricea de tipul (m x n);
 variabila matriceala c a costurilor reprezentata de matricea de tipul (m x n);
 variabila u care reprezinta coeficientii lagrange pentru linii de tipul (m x 1);
 variabila v care reprezinta coeficientii lagrange pentru coloane de tipul (n x 1);

[m,n]=size(sol);
if sum(sum(b))< m+n-1
disp('Eroare de coeficienti')
return
else
u=Inf*ones(m,1);
v=Inf*ones(n,1);

Se alege apoi alege un coeficient arbitrar = 0


u(1)=0;
nr=1;

In liniile de cod de mai jos, se va efectua bucla pâna când sunt atribuiti toti coeficientii
while nr<m+n
for lin=1:m
for col=1:n
if b(lin,col)>0
if (u(lin)~=Inf) & (v(col)==Inf)
v(col)=c(lin,col)-u(lin);
nr=nr+1;
elseif (u(lin)==Inf) & (v(col)~=Inf)
u(lin)=c(lin,col)-v(col);
nr=nr+1;
end
end
end
end
end
end

3. Functia bucla

Functia bucla calculeaza livrarea maxima pe bucla si matricea costului de transport


pentru fiecare element matriceal si dupa fiecare ciclu de schimbare de tipul (m x n).
Variabile utilizate in functia bucla sunt:
 variabila matriceala sol ce reprezinta solutia curenta intr-o matrice de tipul (m x
n);
 variabila matriceala b care introduce variabilele de baza din matricea de tipul (m x
n);
 variabilele scalare lin, col care reprezinta indexul (linie, coloana) pentru fiecare
element de baza care intra;
 variabila matriceala y care reprezinta solutia dupa fiecare ciclul de schimbare de
tipul (m x n);
 variabila matriceala var_sch care se atribuie noilor variabile de baza dupa fiecare
ciclul de schimbare (m x n).

[m,n]=size(sol);

Ciclul de schimbare este descries in urmatoarea linie de cod:


bucla=[lin col];
In linia de mai jos nu este inclus in cautare indexul lin,cod):
sol(lin,col)=Inf;
b(lin,col)=Inf;

In linia de mai jos se incepe cautarea in aceeasi linie:


cauta_lin=1;
while (bucla(1,1)~=lin | bucla(1,2)~=col | length(bucla)==2),
if cauta_lin, % cauta in linie
j=1;
while cauta_lin
if (b(bucla(1,1),j)~=0) & (j~=bucla(1,2))
Urmatoarea linie adauga la bucla indiciile elementului gasit:
bucla=[bucla(1,1) j ;bucla];
Apoi se va incepe cautarea in aceeasi coloana:
cauta_lin=0;
In linia de cod de mai jos, nu intereseaza niciun element din acest rand:
elseif j==n,
b(bucla(1,1),bucla(1,2))=0;

Se va realiza regresia:
bucla=bucla(2:length(bucla),:);
cauta_lin=0;
else
j=j+1;
end
end
else

Altfel, se face cautare de coloana:


i=1;
while ~cauta_lin
if (b(i,bucla(1,2))~=0) & (i~=bucla(1,1))
bucla=[i bucla(1,2) ; bucla];
cauta_lin=1;
elseif i==m
b(bucla(1,1),bucla(1,2))=0;
bucla=bucla(2:length(bucla),:);
cauta_lin=1;
else
i=i+1;
end
end
end
end

In urmatoarele linii de cod se calculeaza livrarea maxima pe bucla:


l=length(bucla);
theta=Inf;
minindex=Inf;
for i=2:2:l
if sol(bucla(i,1),bucla(i,2))<theta,
theta=sol(bucla(i,1),bucla(i,2));
minindex=i;
end;
end;

In urmatoarele linii de cod se calculeaza noua matrice de transport:


y(lin,col)=theta;
for i=2:l-1
y(bucla(i,1),bucla(i,2))=y(bucla(i,1),bucla(i,2))+(-1)^(i-1)*theta;
end
var_sch(lin,col)=1;
var_sch(bucla(minindex,1),bucla(minindex,2))=0;

4. Functia transport

Functia transport este functia principala prin intermediul careia se rezolva problema de
transport si in interiorul careia se apeleaza functiile prezentate anterior. Variabile utilizate
in functia transport sunt:
 variabila matriceala f care cuprinde valorile furnizorilor intr-o matrice de
dimensiunea m x 1;
 variabila matriceala cer cuprinde valorile cererilor intr-o matrice de dimensiunea
n x1;
 variabila matriceala c, a costurilor, care cuprinde valorile costurilor intr-o matrice
de dimensiunea m x n;
 variabila matriceala sol ce reprezinta solutia optima exprimata printr-o matrice de
tipul m x n;
 variabila cost care reprezinta costul minim de transport;

In primele linii de cod ale functiei, utilizatorul va putea introduce de la tastatura matricile
ce cuprind valorile furnizorilor,f , valorile cererilor cer, si matricea costurilor c:

fprintf(' Introduceti valorile furnizorilor(exemplu: [110; 130; 100]), f = ');


f=input('');
nrfurnizori=length(f);

fprintf(' Introduceti valorile cererilor (exemplu: [100; 50; 80; 110]), cer = ');
cer=input('');
nrcereri=length(cer);

disp('Numarul furnizorilor este:');


disp(nrfurnizori)
disp('Numarul cererilor este:');
disp(nrcereri)

Utilizatorul este atentionat asupra dimensiunilor cererilor si furnizorilor, pentru a putea


introduce correct matricea costurilor:

display(['Matricea costurilor va trebui sa aiba nr linii = nr furnizori si nr coloane =


nr cereri']);
fprintf(' Introduceti matricea costurilor (exemplu: [5 4 7 6;10 7 11 5;7 8 1 4]), c = ');
c=input('');
disp(c)
[ln,cl]=size(c);
disp('Numarul liniilor ln:')
disp(ln)
disp('Numarul coloanelor cl:')
disp(cl)

La o introducere eronata a matricei costurilor, utilizatorul va fi atentionat, iar programul


ofera reintroducerea matricei costurilor:

while cl~=nrcereri
disp(' Matricea costurilor este introdusa gresit. Reluati')
pause
fprintf(' Introduceti matricea costurilor (exemplu: [5 4 7 6;10 7 11 5;7 8 1 4]), c
= ');
c=input('');
[ln,cl]=size(c);
end;

Se introduce b ca o matrice cu una din variabilele de baza si zerouri pentru restul


variablelor

disp(' Matricea de Transport [sol f;cer'' 0]')


[sol,b]=nordest(f,cer);
[sol f;cer' 0]
disp(' ')
pause

In linia urmatoare de cod se va afisa costul de transport:

disp([' Costul de Transport = ',num2str(sum(sum(c.*sol)))]);


disp(' ')
while 1
[u,v]=coeficienti(sol,c,b);

Matricea costurilor este afisata prin linia urmatoare:

disp(' Matricea costurilor [c u;v'' 0]');


[c u;v' 0]
pause
disp(' ')
disp(' Costurile reduse')
r=c-u*ones(size(v'))-ones(size(u))*v'
if any(any(r<0))
disp(' ')

Prin liniile de cod de mai jos, utilizatorul va introduce de la tastatura linia si coloana
corespunzatoare elementului de matrice al variabilei de baza:

disp(' Alege linia si coloana pentru a intoduce baza.')


i=input('Linia = ');
j=input('Coloana = ');
else
break
end;

Matricea de transport este afisata prin linia urmatoare de cod:

disp('Matricea de Transport [sol f;cer'' 0]');


[sol,b]=bucla(sol,i,j,b);
[sol f;cer' 0]
disp(' ')
pause
cost=[cost ; sum(sum(c.*sol))];

In final se vor afisa costurile de transport pentru toate iteratiile de tipul m x n:

fprintf('Costul de Transport = %g\n\n',cost(length(cost)));


end
disp(' ')
pause
fprintf('Costul de Transport pentru toate iteratiile:\n');
cost