Sunteți pe pagina 1din 8

Etapa a II a

Realizarea unui program de simulare pentru rezolvarea


problemei de interferență cînd un muncitor deservește mai multe
sisteme.

Se urmareste determinarea disponibilitatii sistemelor (D) si a gradului de


ocupare a muncitorului de deservire.

1. Modelarea problemei de interfata studiata

Sistemul in ansamblu, compus din S masini automate si din muncitorul de


deservire poate fi modelat printr-un sistem de servire cu o statie in care muncitorul
joaca rolul unitatii de prelucrare.
Sistemele oprite constituie cereri adresate muncitorului de deservire. Figura
urmatoare ilustreaza acest lucru:

Figura 1: Model de servire pentru probleme de interferenta

Fata de un sistem de deservire studiat la curs ,rata medie a fluxului de cereri


nu mai este o constanta intrucat depinde de numarul de sisteme in functiune.
Probabilitatea cea mai mare de apariție a unei întreruperi accidentale într-un
interval de timp specificat este cea mai mare cînd toate sistemele sunt în
funcțiune. Evenimentul nu poate apărea atunci cînd toate sistemele sunt oprite.

I. Analiza detaliată a modelului

De la Etapa 1, stim ca cele doua variabile aleatoare T FA si TFB au repartitii


exponential negative de parametru λA respective λB. Prin urmare pentru o mașină
în funcțiune fluxul întreruperilor accidentale care afectează modulul A sau B este
un flux Poisson-ian de rată medie λA respectiv λB. Prin suprapunerea efectelor
celor 2 cauze independente de intrerupere accidentală, prin reunirea celor 2
fluxuri rezultă că fluxul orpririlor pentur un sistem cît este în funcțiune este un flux
Poisson-ian de rată medie λA + λB
Atunci cand sunt nf sisteme in functiune ,rata medie a opririlor va fi asadar
λ=nf (λA +λB ).

Figura aceasta ilustreaza acest lucru:

Figura 2. Fluxul opririlor – flux Poisson-ian rezultat din reunire mai multor fluxuri
Poissoniene
Fie Tpo – Timpul pana la urmatoarea oprire sau intervalul dintre doua opriri consecutive.
Desi cele nf sisteme nu sunt puse simultan in functiune, pe baza proprietatii variabilei
aleatoare exponential negativa de a fi fara memorie ,deducem faptul ca Tpo є Exp( nf (λA+
λB)).Asadar,fluxul reunit este un flux Possonian.

● Deservire
Timpul de remediere pentru un sistem oprit depinde de modulul afectat de intreruperea
accidentala ,A sau B. De la Etapa1 a
rezultat ca ca cele doua variabile aleatoare primare T rA si TrB au repartitii exponential
negative de repartitii μA si μB.
Fie pA si pB probabilitatea ca la un sistem oprit,modulul care necesita interventia pentru
remediere sa fie de tipA ,respectiv tipB.

II. Algoritmul de simulare


Semnificatia variabilelor:

● nf si no – variabile de stare;

● Variabile cu semnificatie de timp:


Tpo- Timpul pana la o noua oprire accidentala; Tr –
timpul necesar terminarii remedierii in curs;

●Statistici construite:
STF = suma timpilor de functionare pentru ele S sisteme in perioada simulata;
STR= suma timpilor de remediere;

La sfarsitul simularii,marimile de interes se determina cu relatile:

Precizari:
Stabilirea duratei de simulare(DS)
Durata de simulare trebuie sa asigure tratarea unui numar de intreruperi accidentale de
ordin 105 sau 107.
Intre numarul de opriri(NO) si durata simularii exista relatia:

○ Durata de simulare depinde de S, fiind mai mica pentru valori mai mari ale lui S;
○ Durata de simulare nu poate fi cunoscuta de la inceput cu exactitate, intrucat depinde de
D, tocmai necunoscuta problemei. In aceste conditii,cel mai simplu este ca sa se exprime
criteriul de stop direct in functie de numarul de opriri.

Codul Sursa:

//header.h
#pragma once
double genExp(double l);
double genGauss(double medie, double sigma);
double genTr(double uA, double uB, double pA);
double Simularea(int S);

//functii.cpp
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include"Header.h"
using namespace std;

double genExp(double l)// fct pt gen random a unei variabile aleatoare cu repartitie exp neg

{
double u = (double)rand() / (RAND_MAX + 1);
return -1 / l*log(1 - u);
}
double genGauss(double medie, double sigma) //functia normala
{
double s = 0;int i;
for (i = 1;i <= 12;i++)
{
s += (double)rand() / RAND_MAX;
}
return medie += sigma*(s - 6);
}
double genTr(double uA, double uB, double pA)
{
double Tr;
double U;
U = (double)rand() / (RAND_MAX + 1);
if (U<pA)
{
Tr = genExp(uA); // repartitie exponentiala
//Tr=genGauss(1/uA,1/(3.5*uA)); //repartitie normala
}
else
{
Tr = genExp(uB);
//Tr=genGauss(1/uB,1/(3.5*uB));
}
return Tr;
}

double Simularea(int S)
{
double lamA = 0.2451;//tfa Rezultatul lamFinal din partea I
double lamB = 0.1897;//tfb Rezultatul lamFinal din partea I
double miuA = 4.6105;//tra Rezultatul lamFinal din partea I
double miuB = 4.3957;//trb Rezultatul lamFinal din partea I
double DS; //durata

double Stf = 0;//suma timpilor de functionare pentru cele S sisteme in perioad simulata
double Str = 0;//suma timpilor de remediere

int nf = S; // nr sisteme in functionare


int no = 0; // nr sisteme oprite

double NO = 0;//Numarul opririlor


double NR = 0;
double ceas = 0;
double Tpo; // timpul pana la o noua oprire
double Tr; // timpul necesar terminarii remedierii in curs;

double D = 0;
double O = 0;//grad de ocupare

double pA = lamA / (lamA + lamB);


//double pB=lamB/(lamA+lamB);

Tpo = genExp(S*(lamA + lamB));


do
{
if ((S == nf) || ((nf>0) && (Tpo<Tr))) // OPRIRE
{
ceas += Tpo;
if (no>0)
{
Tr -= Tpo;
}
NO++;
Stf += (nf*Tpo);
nf--;
no++;
if (no == 1)
{
Tr = genTr(miuA, miuB, pA);
Str += Tr;
}
}
else // repornire
{
ceas += Tr;
if (nf > 0)
{
Tpo -= Tr;
}
Stf += (nf*Tr);

nf++;
no--;
if (no>0)
{
Tr = genTr(miuA, miuB, pA);
Str += Tr;
}
NR++;
}
if (nf>0)
{
Tpo = genExp(nf * (lamA + lamB));
}
} while (NO<1e+6);

DS = ceas;//durata simularii
D = (Stf / (DS*S)) * 100;
O = (Str / DS) * 100;

cout << "Numarul opririlor accidentale " << NO << endl;


cout << " Numarul remedierilor " << NR << " in perioada simulata " << DS << endl;
cout << "Str/NR=" << Str / NR << endl;
cout << "(1 / (lamA + lamB))*((lamA / miuA) + (lamB / miuB)) = " << (1 / (lamA +
lamB))*((lamA / miuA) + (lamB / miuB)) << endl;
cout << "Disponibilitatea sistemului=" << D << endl;
cout << "Gradul de ocupare=" << O << endl;
cout << "NO=" << DS*S*(D / 100)*(lamA + lamB) << endl;
return O;
}
//main.cpp
#include"Header.h"
#include<iostream>
using namespace std;
int main(void)
{
int S = 1;
cout << endl << "SISTEM " << S << endl;
double O = Simularea(S);
while (O <= 90)
{
S++;
cout << endl << "SISTEM " << S << endl;

O = Simularea(S);
}
system("pause");
return 0;
}

Etape:
Pentru cazul S=1 folosim repartitia exponentiala
1.Se verifica programul pentru valori cat mai mari ale lui S pana cand gradul
de ocupare ajunge la aproximativ 90%.

Tabelul 1. Rezultatele Simularii

NR.Sist.(S) Disponibilitatea STr/NR Gradul de


Sistemelor(D) ~=TRm Ocupare%(O)
1. 91.2251 0.221581 ~= 0.22152 8.7749
2. 90.5045 0.221877 ~= 0.22152 17.4575
3. 89.7168 0.221312 ~= 0.22152 25.9204
4. 88.8196 0.22137 ~= 0.22152 34.1764
5. 87.7817 0.221535 ~= 0.22152 42.2515
6. 86.6074 0.221326 ~= 0.22152 49.9326
7. 85.1555 0.221843 ~= 0.22152 57.5064
8. 83.5988 0.221682 ~= 0.22152 64.4164
9. 81.7786 0.221796 ~= 0.22152 70.9850
10. 79.8655 0.221429 ~= 0.22152 76.7111
11. 77.5266 0.221180 ~= 0.22152 81.9436
12. 74.8868 0.221452 ~= 0.22152 86.5096
13. 72.1180 0.221363 ~= 0.22152 90.2596

4. Verificarea Rezultatelor Simularii


Se disting doua cazuri:
● S=1;
● S=2;
In cazul cel mai simplu cu S=1,cand nu intervine fenomenul de interferenta,marimile de
interes pot fi determinate pe cale analitica in urma unui rationament intuitive.In acest
caz,perioadele de functionare alterneaza cu cele de remediere.

Sa completam programul de simulare pentru a contoriza numarul opririlor (NO) in


perioada de simulare. Pentru un singur program ,perioada de functionare se
determina cu relatia:

Valorile parametrilor:
�A= 0.2451;
�B=0.1897;
�A=4.6105;
�B=4.3957;

T r m≌0.22079;

Pentru cazul cand S=2 folosim repartitia normala:


Tabelul 1. Rezultatele Simularii

NR.Sist.(S) Disponibilitatea STr/NR Gradul de


Sistemelor(D) Ocupare%(O)
1. 91.2241 0.221502 8.7759
2. 90.8101 0.221604 17.4988
3. 90.3381 0.22161 26.1171
4. 89.7932 0.221485 34.5784
5. 89.1065 0.221526 42.9251
6. 88.3433 0.221533 50.983
7. 87.3267 0.221634 58.8682
8. 86.1465 0.221492 66.3646
9. 84.6813 0.221494 73.3528
10. 82.8713 0.221562 79.768
11. 80.6989 0.221423 85.3849
12. 77.9737 0.221592 90.1863

Concluzia
Remarcăm în ambele cazuri că o dată cu creșterea numărului de
sisteme(S), scade treptat disponibilitatea sistemului, însă crește gradul de
ocupare. Observăm de asemenea că am atins gradul de ocupare(90%) cu 13
sisteme atunci când am utilizat repartiția exponențială, și 12 sisteme când am
utilizat repartiția normală, de aici putem concluziona că e mai bine să utilizăm
repartiția exponențială, deoarece cu același grad de ocupare muncitorul va
deservi mai multe sisteme.

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