Esempio n. 1
0
void breadtl(bintree tree) {
	cirqueue treequeue = initqueue(MAXTREE_TMP);
	btnode tr =  tree->root;
	if (tr)
		enqueue(treequeue, tr);

	while (qlength(treequeue) > 0) {
		tr = dequeue(treequeue);
		visit(tr->data);
		if (tr->lsubtr)
			enqueue(treequeue, tr->lsubtr);
		if (tr->rsubtr)
			enqueue(treequeue, tr->rsubtr);
	}
}
//=============================================================================
//==  Function to generate Poisson customers                                 ==
//==   - Random split to queue1() and queue2()                               ==
//=============================================================================
void generate(double lambda, double mu)
{
  double   interarrival_time;    // Interarrival time to next send
  double   service_time;         // Service time for this customer
  double   rv;                   // Random Value
  int      queue_len[5];         // Number of customers in system
  int      ties[5];              // Tied queue values
  int      select_q;             // Queue Chosen
  int      short_val;            // Shortest Queue value
  int      num_ties;             // Number of ties
  int      i;                    // Iteration value

  create("generate");

  // Loop forever to create customers
  while(1)
  {
    // Pull an interarrival time and hold for it
    interarrival_time = exponential(1.0 / lambda);
    hold(interarrival_time);

    // Pull a service time
    //service_time = exponential(1.0 / mu);
    service_time = mu;

    // Get # customers in each system
    queue_len[0] = qlength(Server1) + num_busy(Server1);
    queue_len[1] = qlength(Server2) + num_busy(Server2);
    queue_len[2] = qlength(Server3) + num_busy(Server3);
    queue_len[3] = qlength(Server4) + num_busy(Server4);
    queue_len[4] = qlength(Server5) + num_busy(Server5);

    // Calculate shortest queue
    short_val = queue_len[0];
    for(i=1; i<5; i++)
    {
      if(queue_len[i] < short_val)
        short_val = queue_len[i];
    }

    // Determine ties
    num_ties = 0;
    for(i=0; i<5; i++)
    {
      if (short_val == queue_len[i])
      {
        select_q = i;
        ties[num_ties] = i;
        num_ties++;
      }
    }

    // Randomly select queue if tie occurs
    if(num_ties > 1)
    {
      rv = uniform(0.0,(double)num_ties);

      for(i=1; i<=num_ties; i++)
      {
        if(rv <= i)
        {
          select_q = ties[i-1];
          break;
        }
      }
    }

    // Send the customer to shortest queue
    if(select_q == 0)
      queue1(service_time, clock);
    else if(select_q == 1)
      queue2(service_time, clock);
    else if(select_q == 2)
      queue3(service_time, clock);
    else if(select_q == 3)
      queue4(service_time, clock);
    else
      queue5(service_time, clock);
  }
}