Documente Academic
Documente Profesional
Documente Cultură
Proiect Optimizări
Găsirea soluției optime – metoda
programării liniare
Noțiuni introductive...........................................................................................................3
Tema proiectului................................................................................................................4
Prezentarea problemei........................................................................................................5
Structura algoritmului........................................................................................................6
1. Citirea datelor...........................................................................................................6
2. Prelucrarea datelor....................................................................................................7
3. Modelarea graficului...............................................................................................10
4. Interpretare grafică..................................................................................................12
Cod:..................................................................................................................................14
Concluzie..........................................................................................................................17
Teste pentru aplicația de proiect......................................................................................17
Bibliografie:.....................................................................................................................19
2
Metoda programării liniare
Modelul bazat pe două variabile
Noțiuni introductive
Programarea liniară constă într-un set de tehnici matematice care permit obținerea
beneficiului maxim din sistemele economice, sociale, tehnologice, etc, a căror funcționare este
posibilă dacă se descrie în mod adecvat de un model matematic. Modelele de programare
liniară ocupă un loc deosebit de important, atât în teoria cât și în practica economică.
Structura modelului general de programare liniară se constituie în primul rând prin
mulțimea de activități {A1, A2, ... An} care compun sistemul economic analizat, mulțimea de
resurse utilizate {R1, R2, ... Rm}
O problemă de programare liniară este o problemă de optimizare în care:
Se încearcă maximizarea sau minimizarea unei funcții ce are o expresie
liniară numită funcția obiectiv, dependentă de variabilele de optimizare;
Valorile variabilelor de optimizare trebuie să satisfacă o mulţime de restriicţii;
Fiecare restricţie de egalitate sau inegalitate trebuie să aibă o expresie liniară.
O restricție de semn este asociată fiecărei variabile de optimizare.
Notând cu xj (j = 1,...,n) rezultatul activităţii Aj într-o perioadă dată şi cu b i (i = 1,...,m)
cantităţile disponibile din resursele Ri (i = 1,...,m), se pot scrie matematic următoarele restricţii
tehnico-economice:
3
(propoziție de logică economică)
Consumul total Rij din resursa Rj pentru efectuarea activității Aj este proporțională
cu intensitatea acesteia ( xj).
Sistemul de inecuații (1) realizează legătura dintre resurse și activități prin intermediul
celor m restricții liniare.
Modelul problemei de programare liniară este alcătuit din restricţii de tipul (1) precum
şi un criteriu de "performanţă" care să permită evaluarea eficienţei fiecărei activităţi. În funcţie
de scopul urmărit, putem alege drept criteriu de eficienţă un indicator care măsoară efortul,
unul care măsoară rezultatul sau un indicator exprimat ca raport între rezultat şi efort sau efort
pe rezultat.
Eficienţa maximă înseamnă minimizarea efortului şi maximizarea rezultatului, iar
conceptul de optim se defineşte, în acest caz, ca un program x Є Rn care minimizează sau
maximizează o funcţie obiectiv şi, în acelaşi timp, satisface toate restricţiile tehnico-economice.
Metodele grafice de rezolvare a problemelor de programare liniară sunt aplicabile
numai pentru modelele de programare liniară cu două variabile. În general, soluţia grafică a
unui sistem liniar de inecuaţii cu două necunoscute (variabile) este un domeniu de valori (un
semiplan) denumit domeniu (sau regiune) admisibil(ă) sau acceptabil(ă).
Rezolvarea problemei de optimizare începe cu stabilirea domeniului de admisibilitate, în
care soluția este posibilă sau realizabilă. Acesta este un domeniu în spațiul variabilelor
independente și este dat de restricțiile structurale și de pozitivitate. Dacă domeniul de
admisibilitate este vid, soluția nu există cu alte cuvinte nu avem optim. Altfel, soluția există
putând fi unică sau multiplă. Optimul se caută în vârfurile domeniului de admisibilitate.
Tema proiectului
Prezentarea problemei
4
RMA- radioreceptor cu modulație în amplitudine
RMF- radioreceptor cu modulație de frecvență
Cererea zilnică de RMA nu poate depăși pe cea de RMF cu mai mult de 1000 de
bucăți.
Cererea maximă a radioreceptoarelor de tip RMF este limitată la 2000 zilnic.
Prețul unui RMA este de 40 lei
Prețul unui RMF este de 50 lei.
5
Structura algoritmului
Pentru a rezolva problema de optimizare, am conceput un algoritm cu ajutorul
programului de dezvoltare Scilab. Acesta permite introducerea de la tastatură:
o a numărului de restricții;
o a coeficienților restricțiilor;
o a coeficienților funcției obiectiv.
În urma introducerii acestor date, algoritmul prelucrează și trasează dreptele de frontieră, iar cu
ajutorul lor, calculează punctul de optim.
1. Citirea datelor
6
denumiți a,b,c,d. Unde a,b,c sunt coeficienții restricției, iar d este semnul de inegalitate al
restricției.
2. Prelucrarea datelor
Odată cu citirea primului set de date, acestea vor fi prelucrate în vederea trasării pe grafic a
dreptelor de frontieră și a calculării punctului optim.
7
soluțiilor admisibile.
- Pasul 1
8
Punctul găsit nu trebuie să depășească granițele “sus”, “jos”, “stanga”, “dreapta”. Dacă
condiția este îndeplinită, punctul găsit se va reține cu ajutorul vectorilor “0x”, “Oy”. Acești
vectori reprezentând coordonatele unui punct pe grafic (x,y).
- Pasul 2
Punctul găsit la pasul anterior trebuie să satisfacă pe rând ecuațiile restricțiilor .
La acest pas m-am folosit de un flag “verifica” în sensul că, dacă punctul respectă fiecare
condiție atunci flagul rămâne incrementat.
Dacă punctul găsit se află în situația în care nu respectă una din restricții atunci flagul se
decrementează.
3. Modelarea graficului
Următorul pas este de afișare a zonei fezabile și trasare a dreptelor de frontieră totodată și
calcularea punctului de optim.
9
Cu ajutorul unei matrici am salvat coordonatele x și y ale punctelor de intersecție ce au trecut
prin testele anterioare. Matricea ”matrice2” este doar matricea ”matrice” din care am eliminat
dublurile cu ajutorul funcției ”unique” și am ordonat crescător elementele cu ajutorul funcției
”gsort”.
Într-o structură ”for” se calculează rezultatul funcției obiectiv pentru fiecare punct calculat, și
se salvează în vectorul ”opt”, soluția fiind maximul vectorului, salvată în variabila ”soluție”.
Pentru trasarea conturului, finalul matricei matrice2 trebuie să fie egal cu începutul acesteia.
10
După aceste operații, putem trasa conturul zonei fezabile, folosind funcția ”plot”, ce are ca
parametri coloanele matricei matrice2, culoarea r pentru roșu, și ”LineWidth 3” pentru
grosimea segmentului.
Ultima parte a algoritmului am rezervat-o pentru trasarea punctului optim dar și pentru afișarea
rezultatului.
11
Variabila m1 este pentru stocarea pantei dreptei punctului optim, folosind în esență aceeași
metodă de trasare a unei drepte.
Funcția ”plot2d” permite trasarea unui segment având posibilitatea de a alege o culoarea dorită.
Structura repetitivă for ce începe de la 0 și ajunge până la “maxim*5” realizează trasarea mai
multor segmente cu o distanță foarte mică între ele astfel încât să pară a fi trasat un singur
segment.
4. Interpretare grafică
După rularea programului, utilizatorul va introduce datele de la tastatură, iar algoritmul
va afișa date atât prin intermediul consolei cât și prin intermediul ferestrei grafice. Graficul
obținut din dreptele de frontieră va fi afișat în fereastra grafică iar optimul , punctele în care a
fost găsit vor fi afișate în consolă.
12
13
Cod:
//Info-Autor
//Student: Ilau Daniel
//Specializarea/Grupa: Automatica si Informatica Aplicata 3241B
clf
clear
clc
h=gca();
xgrid()
h.x_location="origin"
h.y_location="origin"
dreapta=9999
sus=9999
jos=0
stanga=0
maxim=0
//-----Introducere date tastatura-----/
n=input("Introduceti numarul de restrictii: ");
for i=1:n
disp(string(i)+' set de restrictii');
a(i)=input("a = ");
b(i)=input("b = ");
d(i)=input("<= sau >= Semnul atribuit ecuatiei este ","string");
c(i)=input("c = ");
copie_a(i)=b(i)
copie_b(i)=a(i)
copie_c(i)=-1*c(i)
if a(i)~=0 & c(i)/a(i)>maxim then
maxim=c(i)/a(i)
elseif b(i)~=0 & c(i)/b(i)>maxim then
maxim=c(i)/b(i)
end
14
if c(i)/b(i)<dreapta & c(i)/b(i)>0 & strcmp(d(i),"<=")==0 then
dreapta=c(i)/b(i)
end
if a(i)~=0 & b(i)==0 & strcmp(d(i),"<=")==0 & c(i)/a(i)<sus then
sus=c(i)/a(i)
end
if a(i)~=0 & b(i)==0 & strcmp(d(i),">=")==0 & c(i)/a(i)>jos then
jos=c(i)/a(i)
end
if a(i)==0 & b(i)~=0 & strcmp(d(i),">=")==0 & c(i)>stanga then
stanga=c(i)
end
end
disp('Setul de restrictii impus este');
for i=1:n
disp(string(a(i))+'*'+'x1'+' + '+string(b(i))+'*'+'x2 '+string(d(i))+string(c(i)));
end
maxim=maxim*2
h.auto_scale="off";
h.data_bounds = [-1*maxim -1*maxim; maxim maxim]
pas=maxim/10
disp('Introduceti parametrii functiei obiectiv');
obiectiv(1)=input("Parametrul a al functiei obiectiv: ");
obiectiv(2)=input("Parametrul b al functiei obiectiv: ");
//----Calculam punctele de intersectie----//
punct_corect=1
for i=1:n
for j=i:n
if copie_a(i)*copie_b(j)~=copie_a(j)*copie_b(i) then //verificam pantele dreptelor
Ox(punct_corect)=(copie_b(i)*copie_c(j)-copie_b(j)*copie_c(i))/(copie_a(i)*copie_b(j)-copie_a(j)*copie_b(i))
Oy(punct_corect)=(copie_c(i)*copie_a(j)-copie_c(j)*copie_a(i))/(copie_a(i)*copie_b(j)-copie_a(j)*copie_b(i))
if Ox(punct_corect)>=stanga & Ox(punct_corect)<=dreapta & Oy(punct_corect)<=sus & Oy(punct_corect)>=jos then
verifica= 1
for ju=1:n
if copie_a(ju)*Ox(punct_corect)+copie_b(ju)*Oy(punct_corect)+copie_c(ju)>0 & copie_a(ju)*copie_b(ju)~=0 then
verifica= 0
end
end
if verifica== 1 then
Ox(punct_corect)=(copie_b(i)*copie_c(j)-copie_b(j)*copie_c(i))/(copie_a(i)*copie_b(j)-copie_a(j)*copie_b(i))
Oy(punct_corect)=(copie_c(i)*copie_a(j)-copie_c(j)*copie_a(i))/(copie_a(i)*copie_b(j)-copie_a(j)*copie_b(i))
punct_corect=punct_corect+1
end
end
end
end
end
//-----TRASARE GRAFIC-----//
for i=1:n
if a(i)~=0 then
a(i)=c(i)/a(i);
end
if b(i)~=0 then
b(i)=c(i)/b(i);
end
ax=b(i)
ay=0
bx=0
by=a(i)
m1=(ay-by)/(ax-bx)
x=-maxim:pas:maxim
y=m1*(x-ax)
if a(i)*b(i) ~=0 then
15
plot(x,y)
end
if a(i)~=0 & b(i) ==0 then
for j=1:length(x)
yy(j)=a(i)
end
plot(x,yy)
end
if a(i)==0 & b(i) ~=0 then
for j=1:length(x)
hh(j)=b(i)
end
plot(hh,x)
end
end
matrice(:,1)=Ox
matrice(:,2)=Oy
matrice2=unique(matrice,'r')
matrice2=gsort(matrice2,'lr','i')
h.foreground = 15;
xfpoly(matrice2(:,1),matrice2(:,2));
for i=1:length(matrice2(:,1))
opt(i)=obiectiv(1)*matrice2(i,2)+obiectiv(2)*matrice2(i,1)
end
solutie=max(opt)
for i=1:length(matrice2(:,1))
if max(opt)==obiectiv(1)*matrice2(i,2)+obiectiv(2)*matrice2(i,1) then
xmax=matrice2(i,1)
ymax=matrice2(i,2)
end
end
matrice2(length(matrice2(:,1))+1,1)=matrice2(1,1)
matrice2(length(matrice2(:,1)),2)=matrice2(1,2)
plot(matrice2(:,1),matrice2(:,2),'r','LineWidth',3)
m1=obiectiv(2)/obiectiv(1)
x=-maxim:pas:maxim
y=ymax-m1*(x-xmax)
plot2d(x,y,color('purple'))
for i=0:maxim*5
y=ymax-i/2000-m1*(x-(xmax-i/2000))
plot2d(x,y,color('purple'))
end
disp('Optimul este ',solutie,' obtinut in punctul de coordonate ',xmax,ymax)
16
Concluzie
Algoritmul conceput are un total de 140 linii de cod, realizând citirea de la tastatură,
prelucrarea informațiilor citite, afișarea în fereastra grafică a dreptelor de frontieră și a zonei
fezabile al cărui interior va conține soluții admisibile ale problemei de optimizare. În același
timp calculat punctul de optim în care profitul zilnic al producției devine maxim, coordonatele
în care este obținut iar toate aceste calcule vor fi de această dată afișate în consolă.
Algoritmul prezentat a calculat precis soluția optimă dar a și desenat corect graficul a mai
multor astfel de probleme.
{
x 1+ x 2≥ 4
1,5 x 1−x 2 ≥3
−2 x 1+2 x 2≥ 2
x1≥0
x2≥0
{
x 1+ x 2=4
1,5 x 1−x 2=3
−2 x 1+ 2 x 2=2
x 1=0
x 2=0
{
1 1
x 1+ x 2=1( D1)
4 4
1,5 1
x 1− x 2=1(D 2)
3 3
−x 1+ x 2=1( D 3)
x 1≥ 0( D 4)
x 2 ≥ 0(D5)
17
Bibliografie:
18
Mahalu George, Introducere în optimizarea sistemelor, Editura MATRIX-ROM,
Bucureşti, 2013
http://gheorghe-grigoras.ieeia.tuiasi.ro/SDOE/5_Programarea%20LINIARA.pdf
http://automation.ucv.ro/Romana/cursuri/optimizari42/Capitolul%201.pdf
https://help.scilab.org/doc/5.5.2/en_US/plot2d.html
19