Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Matematica-Informatica
Specializarea Tehnologia Informatiei
ALGORITMUL
SIMPLEX
Jerca Vlad
anul I gr. 152
Cuprins
1. Definitie.......................................................................................................... 3
2. Exemple......................................................................................................... 4
3. Codarea in limbajul C...................................................................................... 6
4. Executarea programului................................................................................ 10
1. Definitie
A. Formulare
fj(x1...xn) bj
x1,...,xn 0
f
fj
xi
- functia obiectiv
- restrictiile problemei
- nivele la care se desfasoara activitatea
Notam XB = B-1 * b
CB B XB
ci1
ci2
ai1
ai2
xi1
xi2
aie
xie
aim
B-1 A
cie
cim
xim
fB
Cj-fj
f1
f 2 ..................
fm
..................
fj
.................. f n
Se aplica testul de optimalitate asupra solutiei curente XB care consta in urmatoarea rezolvare:
a) Daca pentru orice j apartie lui J, cj - fj 0 problema are oftim finit, XB solutie optima si max f = fB
.
x
aik
xil il
= min {
xij
ajk | oricare j apartine lui I pentru care ajk > 0 }
2. Exemple:
a) max f = 3x1 + 4x2 + 1x3
CB
XB
a1
a2
a3
a4
a5
a6
a4
10
a5
-1
a6
a2
1/2
3/2
1/2
a5
3/2
3/2
1/2
a6
20
-5
-2
a2
7/3
1/3
-1/3
a1
16/3
1/3
2/3
a6
2/3
-1/3
-2/3
76/3
7/3
2/3
-6
-7/3
-2/3
107
CB
XB
a1
a2
a3
a4
a5
a6
a4
7/3
14/3
1/3
-1/3
a5
16
1/2
-2
a6
107
a4
7/3
-14/9
1/3
-1/3
a5
-16/3
1/2
-2
107
a1
1/3
107/3
107
-107/3
3. Codarea in limbajul C
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//intarzie
void timp(int n)
{
for(int t=1;t<=n*100000;t++);
}
void afisez(char c[])
{
int i=0;
while(c[i])
{
putchar(c[i]);
timp(75);
i++;
}
}
//face pasul pentru inversa matricii
void pas(float a[255][255], int n,int n1, int poz1, int poz2)
{
int i, j;
float pivot;
pivot=a[poz1][poz2];
for(i=1;i<=n1;i++)
if(i!=poz1)
for(j=0 ;j <= n+n1; j++)
if(pivot!=0&&j!=poz2)
a[i][j]=a[i][j]-(a[poz1][j]*a[i][poz2])/pivot; // are loc
pasul
for (i=0 ; i <= n+n1; i++)
if(pivot!=0)
a[poz1][i]=a[poz1][i]/pivot; // impartim linia pivotului la pivot
for(i=1; i <= n1; i++)
if(i!=poz1)
a[i][poz2]=0; // elementele pe coloana pivotului iau valoarea 0
}
//calculeaza produsul scalar
void produsScalar(float a[255][255], float c[255], float f[255], int n,int n1)
{
for(int j=0;j<=n+n1;j++)
{
f[j]=0;
for(int i=0;i<=n;i++)
f[j]=f[j]+(a[i][j]*c[i]);
}
}
if(iese>n+n1)
// daca nu exista nici un termen > 0 pe coloana de iesire ->
//programul se opreste fiindca nu are optim finit
{
daca=1;
afisez(\n\n\t\t\tNu exista optim finit !);
}
else
{
c[iese]=a[0][intra];
printf(\n\n\t\t\tIese a%d ; Intra a%d, b[iese], intra);
b[iese]=intra;
printf(\tPozitia pivotului %d %d, iese, intra);
afisez(\n\t\t\tApasati orice tasta pentru urmatorul pas...);
getch();
}
}
pas(a,n,n1,iese,intra);
}
int main ()
{
float matA[255][255], vectCb[255], vectF[255];
int nr_term, nr_termf, vectB[255], daca=0;
printf(Numarul de termeni in max f: ); scanf(%d, &nr_term);
printf(Numarul de ecuatii: ); scanf(%d, &nr_termf);
//se incarca datele
incarcDate(matA, vectCb, vectB,nr_term, nr_termf);
while(!daca)
{
produsScalar(matA, vectCb, vectF, nr_term, nr_termf);
afisezTabel(matA, vectCb, vectF, vectB, nr_term, nr_termf);
verificIntrareIesire(matA, vectCb, vectF,vectB,nr_term, nr_termf, daca);
}
afisez(\n\n\t\t\tCodat de Jerca Vlad gr. 152 sectia TI);
getch();
}
4. Executarea programului
Exemplul a.
10
Exemplul b.
11