Èìèòàöèîííîå ìîäåëèðîâàíèå íà îñíîâàíèè ïðåäâàðèòåëüíî óñòàíîâëåííûõ çàâèñèìîñòåé
do
{
printf(
"\n█\tÂâåäèòå ïàðàìåòð ðàñïðåäåëåíèÿ Ïóàññîíà äëÿ"
"
îïðåäåëåíèÿ" );
printf(
"\n█\t\tâðåìåíè ìåæäó âõîäàìè ïàññàæèðîâ â çàë:" );
scanf( "%f", &lambda );
}while( lambda<=0 );
clrscr();
//Âûâîä ðàìêè
printf("\n████████████████████████████████████████████████████████████████████████████████");
for(i=1;i<=21;i++)
printf("█
█");
printf("████████████████████████████████████████████████████████████████████████████████");
gotoxy(5,3);
do
{
printf( "\n█\n█\tÂâåäèòå ìèíèìàëüíóþ ïðîäîëæèòåëüíîñòü îáñëóæèâàíèÿ " );
printf( "\n█\t\t\tó êàññàìè:" );
scanf(
"%f", &tau_min );
}while( tau_min<=0 );
do
{
printf(
"\n█\tÂâåäèòå ìàêñèìàëüíóþ ïðîäîëæèòåëüíîñòü îáñëóæèâàíèÿ " );
printf( "\n█\t\t\tó êàññ:" );
scanf(
"%f", &tau_max );
}while( tau_max<=tau_min
);
do
{
printf(
"\n█\tÂâåäèòå âðåìÿ ìîäåëèðîâàíèÿ ðàáîòû çàëà(â ÷.):" );
scanf( "%d", &hours );
}while( hours<=0 );
do
{
printf("\n█\tÂâåäèòå
ìàòåìàòè÷åñêîå îæèäàíèå âðåìåíè îáñëóæèâàíèÿ");
printf( "\n█\t\tó êàññ:");
scanf(
"%f", &MO );
}while( MO<=0 );
do
{
printf(
"\n█\tÂâåäèòå ñðåäíåêâàäðàòè÷åñêîå îòêëîíåíèå âðåìåíè ");
printf(
"\n█\tîáñëóæèâàíèÿ ó êàññ:");
scanf( "%f", &SKO );
}while( SKO<=0 );
massive();
// ñîçäàíèå è îáíóëåíèå ìàññèâà
minutes=floor(
hours*60 ); // ïåðåâåäåì âðåìÿ ðàáîòû â ìèíóòû
enter=0;
// íèêòî íå âõîäèë
serve=0;
// íèêîãî íå îáñëóæèëè
refuse=0;
// íèêîìó íå îòêàçàëè
t_free=0;
// êàññû åùå íå ïðîñòàèâàëè
current_time=0;
// íà÷àëî îòñ÷åòà âðåìåíè ñ íóëÿ
enter_time_=time_to();
// êîãäà çàéäåò ñëåäóþùèé
/*
Öèêë ìîäåëèðîâàíèÿ ðàáîòû çàëà
for( current_time=0;
current_time<=minutes; current_time++ )
{
/*
Êîððåêò-êà âðåìåíè îáñë-ÿ ó êàæäîé êàññû */
if( current_time )
for( i=1;
i<=m ;i++)
if( tau[i]
) //Åñëè êàññà çàíÿòà, òî óìåíüøèì
âðåìÿ îáñë-ÿ
tau[i]--;
// â íåé íà 1 ìèí.
else
// Åñëè êàññà ñâîáîäíà, íàðàùèâàåì îáùåå âðåìÿ
t_free++; // ïðîñòîÿ êàññ.
if(
enter_time_<=current_time )
{
enter++;
// Åñëè âõîäèò ïàññàæèð, îòìå÷àåì ýòî
enter_time_=time_to();
// Óçíàåì, êîãäà çàéäåò ñëåäóþùèé?
i=1;
// Âîøåäøèé ïîäõîäèò ê 1-é êàññå
INDPAS=1;
// Åãî åùå íå îáñëóæèâàþò
do
{
if(
tau[i]<=0 ) //Åñëè êàññà ñâîáîäíà, ñòàâèì ïàññàæèðà íà
{
//îáñë-å è óçíàåì, ñêîëüêî åìó ñòîÿòü ó êàññû
tau[i]=_tau();
INDPAS=0;
//Óêàæåì, ÷òî ïàññàæèðà îáñëóæèâàþò
}
i++;
// Ïîäõîäèì ê ñëåäóþùåé êàññå
}while((i<=m)
&& (INDPAS==1));
if(
INDPAS==1 ) // Åñëè êëèåíò íå îáñëóæåí,
îòìå÷àåì ýòî
refuse++;
if(
INDPAS==0) // Åñëè êëèåíò îáñëóæåí,
îòìå÷àåì ýòî
serve++;
}
}
stand=0; //
Ïîêà â î÷åðåäè íèêòî íå ñòîèò
i=1;
// Íà÷èíàåì ñ ïåðâîé êàññû
do
{
if(
tau[i]>0 ) // Åñëè âðåìÿ îáñë-ÿ
íå ðàâíî íóëþ, çíà÷èò
stand++;
// ó êàññû êòî-òî ñòîèò
i++;
// Ñìîòðèì ó ñëåäóþùåé êàññû
}while( i<=m );
serve-=stand;
// Êîððåêòèðóåì êîë-âî îáñëóæåííûõ
t_free_av=(float)t_free/m;
// Âû÷èñëèì ñð. âðåìÿ ïðîñòîÿ
serve_av=(float)serve/enter;
// Âû÷èñëèì ñð. % îáñëóæåííûõ
refuse_av=(float)refuse/enter;
// Âû÷èñëèì ñð. % íåîáñëóæåííûõ
textcolor(1);
// Óñòàíîâêà ïàðàìåòðîâ òåêñòà
textbackground(2);
clrscr();
_setcursortype(
_NOCURSOR );
/*Âûâîä
ïîëó÷åííûõ ðåçóëüòàòîâ
//Âûâîä
ðàìêè
printf("\n████████████████████████████████████████████████████████████████████████████████");
for(i=1;i<=21;i++)
printf("█
█");
printf("████████████████████████████████████████████████████████████████████████████████");
gotoxy(3,3);
printf( "\n█\n█\t╔════════════════════════════════════════════════════════════╗
");
printf(" \n█\t║
%d æåëåçíîäîðîæíûõ êàññ ðàáîòàëî íà ïðîòÿæåíèè: %d ÷àñîâ.",m,hours );
gotoxy(70,6);
printf("║");
printf(" \n█\t║
 çàë çàøëî %d ïîñåòèòåëåé.", enter );
gotoxy(70,7);
printf("║");
printf(" \n█\t║");
gotoxy(70,8);
printf("║");
printf(" \n█\t║\n█\t║
Áûëî îáñëóæåíî %d ÷åëîâåê(à).", serve);
gotoxy(70,9);
printf("║");
printf(" \n█\n█\t║
Óøëè íåîáñëóæåííûìè %d ÷åëîâåê(à).", refuse);
gotoxy(70,10);
printf("║");
printf(" \n█\n█\t║
 î÷åðåäè îñòàëîñü ñòîÿòü %d ÷åëîâåê(à). ", stand);
gotoxy(70,11);
printf("║");
printf(" \n█\n█\t║
Ñðåäíèé ïðîöåíò îáñëóæèâàíèÿ ïàññàæèðîâ %.2f%%", serve_av*100);
gotoxy(70,12);
printf("║");
printf(" \n█\n█\t║
Ñðåäíèé ïðîöåíò îòêàçîâ â îáñëóæèâàíèè %.2f%%", refuse_av*100);
gotoxy(70,13);
printf("║");
printf(" \n█\n█\t║
Âñåãî êàññû ïðîñòàèâàëè: %.0f÷. %.0f ìèí. ",floor( t_free/60 ),
t_free-floor( t_free/60 )*60
);
gotoxy(70,14);
printf("║");
printf(" \n█\n█\t║
Ñðåäíåå âðåìÿ ïðîñòîÿ 1 êàññû: %.0f÷. %.0f ìèí.",
floor( t_free_av/60 ),
t_free_av-floor( t_free_av/60 )*60);
gotoxy(70,15);
printf("║");
gotoxy(70,16);
printf("║");
printf(" \n█\t╚════════════════════════════════════════════════════════════╝
");
getch();
}
//Ôóíêöèÿ
âîçâðàùàþùàÿ Ñ× â äèàïàçîíå îò 0 äî 1
float RND_DIG (void)
{
float
x; //Ñ×
â äèàïàçîíå îò 0 äî 1
N=(NI*N0);
ND=floor(N/100);
ND=(ND/10000-floor(ND/10000))*10000;
// Îòáðîñèì ïåðâûå 2 öèôðû
N0=NI;
NI=ND;
x=ND/9999;
return x;
}
//Ô-ÿ âûäåëÿåò
ïàìÿòü ïîä ìàññèâ âðåìåíè îáñë-ÿ ó êàæäîé èç êàññ
void massive( void )
{
int i;
tau=(float *)malloc(
(m+1)*sizeof(float) );
/* Îáíóëåíèå ýëåìåíòîâ
ìàññèâà */
for(i=1; i<=m; i++)
tau[i]=0;
}
// Ô-ÿ
âîçâð. âðåìÿ îáñë-ÿ ó êàññû
float _tau( void )
{
float
x,
// Ñëó÷àéíîå ÷èñëî x
y,
// Ñëó÷àéíîå ÷èñëî y
z,
// Ñëó÷àéíîå ÷èñëî z
tau_;
// Âðåìÿ îáñëóæèâàíèÿ
//
Ïðîâåðêà íà ÷åòíîñòü
//---------------------
if( floor ( ( float )i/2
)==ceil( ( float )i/2 ) )
{
x=RND_DIG();
// Çàïðîñ ñëó÷. ÷èñëà îò ÄÑ×
y=RND_DIG();
// Çàïðîñ ñëó÷. ÷èñëà îò ÄÑ×
if(
x>=.0001) // Åñëè õ íå ñëèøêîì ìàëåíüêîå, ñ÷èòàåì z
z=sqrt( -2*log( x ) )*sin( 2*M_PI*y
);
else
{
if( sin(
2*M_PI*y )<=0 )
z=0; // Åñëè îáà
ìíîæèòåëÿ ñëèøêîì ìàëû, òî z=0
else
z=(float)minutes/2;
//Åñëè 2-é ìíîæ-ëü íîðìàëüíûé, òî
}
//âåë-íà z ðàâíà ïîëîâèíå âðåìåíè ðàáîòû çàëà.
tau_=MO+z*SKO;
// Âû÷èñëèì íîðìàëüíî ðàñïðåäåëåííîå âðåìÿ îáñë-ÿ
if(
tau_<0 ) // Åñëè âðåìÿ îòðèöàòåëüíî, îíî ðàâíî 1 ìèí.
tau_=1;
}
else
{
x=RND_DIG();
// Çàïðîñ ñëó÷. âåëè÷èíû îò ÄÑ×
/*
Âû÷èñëèì ðàâíîìåðíî ðàñïðåäåëåííîå âðåìÿ îáñë-ÿ */
//--------------------------------------------------
tau_=floor(
tau_min+x*( tau_max-tau_min )+.5);
}
return
floor( tau_+.5 ); //Âûâåäåì â ìåñòî çàïðîñà
}
// Ô-ÿ
îïðåäåëÿåò âðåìÿ âõîäà ñëåä-ãî êëèåíòà. Ïðîìåæóòêè
// ìåæäó
âõîäàìè ðàñïðåäåëåíû ïî çàêîíó Ïóàññîíà ñ ïàð-ì lambda
//
============================================================
float time_to( void )
{
int
j; // Ïàð-ð çàêîíà ðàñïð-ÿ Ïóàññîíà
float
x, //
Ñëó÷. âåë-íà
tau,
// Âðåìÿ äî âõîäà
a,
// Ïàð-ð çàêîíà ðàñïð-ÿ
n,
// Ïîëîâèíà îáùåãî âðåìåíè ðàáîòû
S;
// Ïàð-ð çàêîíà ðàñïð-ÿ
n=floor( minutes/2+0.5 );
x=RND_DIG();
// Ïðèìåì ñëó÷. ÷èñëî
tau=0;
j=0;
a=exp( (lambda *
(-1)) ); // Ðàñ÷åò íà÷. çíà÷-ÿ ïàð-ðà à
S=0;
do
{
if( S>=x
&& x<S+a ) // Ïðîâåðêà õ íà ïðåíàäë-òü ïðîìåæóòêó [S ; S+a)
break;
tau++;
j++;
S+=a;
a*=lambda/j;
}
while( tau<=n );
return current_time+tau; //
Âîçâðàòèì âðåìÿ äî âõîäà ñëåä-ãî êëèåíòà
}
Ñòðàíèöû: 1, 2
|