Sunteți pe pagina 1din 19

Universitatea „Ştefan cel Mare” din Suceava, Facultatea

de Inginerie Electrică și Știința Calculatoarelor

Proiect Optimizări
Găsirea soluției optime – metoda
programării liniare

Student: Ilău Daniel-Constantin


Profesor Îndrumător: Conf. Dr. Ing. George Mahalu
Cuprins

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.

Pentru fiecare variabilă xi, avem (xi ≥ 0).

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:

Fiecare inecuație sau restricție înglobează următoarele afirmații:


 Cantitatea consumată dintr-o resursă nu poate depăși volumul disponibil

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

Să se creeze un algoritm ce rezolvă problemele de optimizare pentru datele introduse de


la tastatură de un utilizator, prin metoda grafică.

Prezentarea problemei

O întreprindere producătoare de radio-receptoare realizează două tipuri de aparate:

4
 RMA- radioreceptor cu modulație în amplitudine
 RMF- radioreceptor cu modulație de frecvență

Interactivitățile existente la nivelul de bază al problemei de optimizare sunt exprimate


prin intermediul următorului tabel:

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.

Setul de expresii ce exprimă problema de extremizare sunt:

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

Citirea se realizează în următorul mod:


În primă instanță citim de la tastatură o valoare n. Valoare ce reprezintă numărul de
restricții dorit. Apoi printr-o structură repetitivă for se va citi de n iterații parametrii restricțiilor

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.

În codul scris a,b și c reprezintă vectori ce permit stocarea elementelor introduse de la


tastatură de tip număr iar d reprezintă un vector ce stochează date de tip șir de caractere definit
de clasa “string”.

Citirea coeficienților funcției obiectiv se realizează prin introducerea și stocarea datelor în


vectorul “obiectiv”.

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.

Cu ajutorul vectorilor „copie_a”, „copie_b”, „copie_c” am realizat copii ale parametrilor


restricțiilor ce ne vor fi de folos în calcularea pantei și eventual pentru a trasa un segment pe
grafic, fără a deteriora datele introduse inițial de la tastatură.
Variabilele ”sus”, ”jos”, ”stanga” și ”dreapta” au rolul de a stoca granițele zonei

7
soluțiilor admisibile.

Pentru a găsi punctele de intersecție a dreptelor am folosit următorul cod scilab:

Incrementăm variabila “punct_corect” cu valoarea 1 ce crește de fiecare dată cu o unitate


atunci când este găsit un punct ce satisface condițiile. Ca un punct de intersecție determinat să
fie bun, acesta trebuie să treacă prin doi pași:

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

Prin declarația ”h.foreground=15” se setează fundalul zonei fezabile la culoarea numărul


15 (verde).

Cu ajutorul funcției ”xfpoly(matrice2(:,1),matrice2(:,2))” se trasează zona soluțiilor


admisibile folosind coloanele matricei matrice2.

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

În următorul ”for” se salvează coordonatele x și y a punctului optim în variabilele ”xmax” și


”ymax”.

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 “plot” permite trasarea pe graphic a unui segment.

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.

Teste pentru aplicația de proiect:


1. Fie setul de resticții:

{
x 1+ x 2≥ 4
1,5 x 1−x 2 ≥3
−2 x 1+2 x 2≥ 2
x1≥0
x2≥0

Trecem sistemul de restrictii de la o reprezentare de domeniu la una de frontiera.

{
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

Aducem acest sistem de ecuatii la forma canonica:

{
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)

Trasam dreptele de frontiera :

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

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