Дана такая задача:
читать дальшеСистема массового обслуживания состоит из обслуживающего аппарата (ОА)
и двух очередей заявок двух типов.
T1 ---T--T--T--T--¬
>--------+ ¦ ¦ ¦ ¦ +---¬
L--+--+--+--+--- ¦ -----¬ Т3
+--+ ОА +---
¦ L----- Т4
T2 ---T--T--T--T--¬ ¦
>--------+ ¦ ¦ ¦ ¦ +----
L--+--+--+--+---
Заявки 1-го и 2-го типов поступают в "хвосты" своих очередей по случайному
закону с интервалами времени Т1 и Т2, равномерно распределенными от 1 до 5 и от 0 до 3 единиц времени (е.в.) соответственно. В ОА они поступают из "головы" очереди по одной и обслуживаются также равновероятно за времена Т3 и Т4,
распределенные от 0 до 4 е.в. и от 0 до 1 е.в. соответственно, после чего
покидают систему. В начале процесса в системе заявок нет.
Заявка любого типа может войти в ОА, если:
а) она вошла в пустую систему;
б) перед ней обслуживалась заявка ее же типа;
в) перед ней из ОА вышла заявка другого типа, оставив за собой пустую
очередь (система с чередующимся приоритетом).
Смоделировать процесс обслуживания первых 1000 заявок 1-го типа, выдавая
после обслуживания каждых 100 заявок информацию о текущей и средней длине каждой очереди, а в конце процесса - общее время моделирования и количества вошедших в систему и вышедших из нее заявок обоих типов.
И вот её решение. Но есть проблема, которую не знаю, как исправить - текущее и среднее количества заявок во второй очереди выводятся нулями, хотя такого точно не может и не должно быть. Чего не хватает в коде или что лишнее в нём? :С
код#include
#include
using namespace std;
const int t1min = 1;
const int t1max = 5;
const int t2min = 0;
const int t2max = 3;
const int t3min = 0;
const int t3max = 4;
const int t4min = 0;
const int t4max = 1;
int firstlength(0), secondlength(0), afirst(0), asecond(0), tofirst(0),fromfirst(0), tosecond(0), fromsecond(0);
int last(0), entempt(0),leftempt(0);
double t1(0),t2(0),t3(0),t4(0),tmin(0),totaltime(0);
bool firstcan()
{
return ((firstlength!=0)&&((last == 1)||(entempt==1)||(leftempt==2)));
}
bool secondcan()
{
return ((secondlength!=0)&&((last==2)||(entempt==2)||(leftempt == 1)));
}
void whichevent()
{
tmin=t1;
if (tmin>t3) tmin = t3;
if ((tmin>t2)&&firstcan()) tmin =t2;
if ((tmin>t4)&&secondcan()) tmin = t4;
}
void timer()
{
static bool start(true);
if (start)
{
start = false;
t1 = (rand()*1.0/RAND_MAX)*(t1max-t1min)+t1min;
t2 = (rand()*1.0/RAND_MAX)*(t2max-t2min)+t2min;
t3 = (rand()*1.0/RAND_MAX)*(t3max-t3min)+t3min;
t4 = (rand()*1.0/RAND_MAX)*(t4max-t4min)+t4min;
}
else
{
if (tmin == t1)
{
t1 = (rand()*1.0/RAND_MAX)*(t1max-t1min)+t1min;
}
if (tmin == t2)
{
t2 = (rand()*1.0/RAND_MAX)*(t2max-t2min)+t2min;
}
if (tmin == t3)
{
t3 = (rand()*1.0/RAND_MAX)*(t3max-t3min)+t3min;
}
if (tmin == t4)
{
t4 = (rand()*1.0/RAND_MAX)*(t4max-t4min)+t4min;
}
}
if(t1<0) t1=0;
if(t2<0) t2=0;
if(t3<0) t3=0;
if(t4<0) t4=0;
}
void info()
{
static bool start(true);
if(start)
{
afirst=firstlength;
asecond=secondlength;
}
else
{
afirst = (afirst+firstlength)/2;
asecond = (asecond+secondlength)/2;
}
cout<<"Kol-vo zayavok v pervoy ocheredi - "<(time(NULL)));
while(fromfirst<1000/*i<100*/)
{
/*i++;*/
timer();
whichevent();
/*if(*argv[1] =='d')
{
cout<<"f"<