java

时间:2015-07-25 14:05:29

标签: java netbeans scheduling

我正在寻找一个加权公平排队的调度方法的例子。我找到了这段代码,但它没有运行。而且我不理解“QueueElem”。我应该在课堂上添加什么?谁能帮我?

P.S:我使用netbeans。

由于

import java.util.Scanner;
import java.io.IOException;
import java.util.ArrayList;


public class WFQ
{

   public static double compute_VT_Rate(ArrayList<QueueElem>[] Q,
                    double[] w)
   {
      double r = 0.0;

      for (int i = 0; i < Q.length; i++)
         if ( Q[i].size() > 0 )
        r += w[i];

      if ( r > 0 )
         return(1/r);
      else
         return(0.0);
   }

   public static void printArrivals(double [] arrTime, int[] flowID, 
                double[] packetLen)
   {
      for (int i = 0; i < arrTime.length; i++)
     System.out.println(" T = " + arrTime[i] 
            + ", flow " + (flowID[i]+1)
            + ", length " + packetLen[i]);
   }

   public static void printFFS_State(ArrayList<QueueElem>[] Q)
   {
//    System.out.println("----------------------------------------");
//    System.out.println("FFS State:");

      int flag = 1;

      for (int i = 0; i < Q.length; i++)
      {
     if ( Q[i].size() > 0 )
     {  flag = 0;

        System.out.println("   Packet from flow " + i 
        + " has remaining VIRTUAL length = " 
        + Q[i].get(0).remaining_Virt_len);

//          System.out.println("   Q[" + i + "].get(0).remaining_Virt_len = "
//                      + Q[i].get(0).remaining_Virt_len);
     }
      }

      if ( flag == 1 )
     System.out.println("   -- empty");

//    System.out.println("----------------------------------------");
   }


   public static void main(String[] args) throws IOException
   {

      int Ordering = 1;

      Scanner in = new Scanner(System.in);
      int i, j, k;

      int nFlows;       // # Flows 
      double[] w;       // w[i] = weight of flow i
      ArrayList<QueueElem> Q[]; // Queue[i] = packet queue of flow i

      int nArrs;        // # Arrivals
      double [] arrTime;    // arrTime[i] = arrival time of packet i
      int[] flowID;     // flowID[i] = ID of the flow of packet i
      double[] packetLen;   // packetLen[i] = Norm. length of packet i


      double new_t = 0.0;
      double new_vt = 0.0;

      System.out.print("# flows = ");
      nFlows = in.nextInt();

      w = new double[nFlows];
      Q = new ArrayList[nFlows];

      for (i = 0; i < nFlows; i++)
      {
         System.out.print("Weight of flow " + i + " = ");
         w[i] = in.nextDouble();
         Q[i] = new ArrayList<QueueElem>();
      }

      System.out.print("# Arrivals = ");
      nArrs = in.nextInt();

      arrTime = new double[nArrs];
      flowID = new int[nArrs];
      packetLen = new double[nArrs];

      for (i = 0; i < nArrs; i++)
      {
         System.out.print("Arrival time " + i + " = ");
         arrTime[i] = in.nextDouble();

         System.out.print("Flow ID " + i + " = ");
         flowID[i] = in.nextInt();
         flowID[i]--;

         System.out.print("Packet len " + i + " = ");
         packetLen[i] = in.nextDouble();
      }


      printArrivals(arrTime, flowID, packetLen);

      System.out.println("\n\nBegin WFQ computation");
      /* ***********************************************
     WFQ Begins here
         *********************************************** */

      double t = 0.0;       // = Now, real time clock
      double vt = 0.0;      // = Now, virtual time clock
      double vt_rate = 0.0; // = speed of virtual time clock
      QueueElem PacketQ = null;

      // ----------------------------------------
      // Variables for packet Arrival
      // ----------------------------------------
      int nextArrIndex = 0;
      double nextArrTime = arrTime[0];
      int nextFlowID = -1;
      double nextPacketLen = -1.0;
      QueueElem q;

      // ----------------------------
      // Next packet departure
      // ----------------------------
      double nextDepartureTime = 0.0;


      // ----------------------------------------
      // Variables for Flow's virtual clocks
      // ----------------------------------------
      double[] VT_flow = new double[nFlows]; // Max flow TS
      double   next_FFS_service_end_time;
      double last_update_time = 0.0;             // Last real time rem len updated

      for (i = 0; i < nFlows; i++)
      VT_flow[i] = 0.0;

      next_FFS_service_end_time = -1.0;

      // ------------------------
      // Help variables
      // ------------------------


      /* ---------------------------------------------------------------
     Main loop
         --------------------------------------------------------------- */
      while (true)
      {
     System.out.println("\n\n\n");
     System.out.println("==========================================");
     System.out.println("last_update_time = " + last_update_time);
     System.out.println("(1)  Current packet Queue:");
     List.print(PacketQ);
     System.out.println("(2)  Fluid Flow Server State:");
     printFFS_State(Q);
     System.out.println("------------------------------");

     System.out.println("BEGIN processing");
     System.out.println("t = " + t + " , vt = " + vt);

/**********************************************************************/

     // ----------------------------------------------------------
     // Determine next arrival time
     // ----------------------------------------------------------
     if ( nextArrIndex < nArrs )
     {
        nextArrTime = arrTime[nextArrIndex];
     }
     else
     {
        nextArrTime = 9999999.0;
     }

     // ----------------------------------------------------------
     // Determine next departure time
     // ----------------------------------------------------------
         if ( PacketQ != null )
         {
            nextDepartureTime = t + PacketQ.remaining_TransTime;
         }
     else
     {
        nextDepartureTime = 9999999.0;
     }


     // ----------------------------------------------------------
     // Determine next FFS finish time
     // ----------------------------------------------------------

     vt_rate = compute_VT_Rate(Q, w);
     // System.out.println("vt_rate = "  + vt_rate );

     next_FFS_service_end_time = 9999999.0;  // Cheap trick

     for ( i = 0; i < nFlows; i++ )
         {
        double h;
        double transmit_rate;

        if ( Q[i].size() > 0 )
        {
           h = Q[i].get(0).remaining_Virt_len;

//         System.out.println("Flow " + i 
//              + " Rem. virt len = " + h);

           h = h / w[i];

//         System.out.println("Flow " + i 
//              + " Rem. virtual transmit time = " + h);

           if ( h < next_FFS_service_end_time )
          next_FFS_service_end_time = h;
        }
     }
     next_FFS_service_end_time += t;

//   System.out.println("+++ Next FFS service end time = " 
//          + next_FFS_service_end_time);

/**********************************************************************/

    // ******************************************************************
    // Print timing information
    // ******************************************************************
     System.out.println("+++ Next packet arrival time   = " + nextArrTime 
        + "   (flow ID = " + nextFlowID 
        + ", packet len = " + nextPacketLen + ")");

     System.out.println("+++ Next packet departure time = " 
            + nextDepartureTime);

     System.out.println("+++ Next FFS service end time  = " 
            + next_FFS_service_end_time);

     System.out.println();
     System.out.println("------------------------------------------");
     System.out.println("----- Find out Next Event in WFQ ---------");

/**********************************************************************/

         // **************************************
     // Test first !!!
         // **************************************

     boolean Arrival, Departure, FFS_fin;

     Arrival = Departure = FFS_fin = false;

         if ( nextArrTime < 10000 &&
         (nextArrTime <= nextDepartureTime) &&
         (nextArrTime <= next_FFS_service_end_time) &&
        nextArrIndex < nArrs )
     {
        System.out.println("Next event: packet arrival");
        Arrival = true;

        new_t = nextArrTime;
         }

         if ( nextDepartureTime < 10000 &&
         (nextDepartureTime<= nextArrTime) &&
             (nextDepartureTime <= next_FFS_service_end_time) )
     {
        System.out.println("Next event: packet departure (real)");
        Departure = true;

        new_t = nextDepartureTime;
         }

         if ( next_FFS_service_end_time < 10000 &&
         (next_FFS_service_end_time <= nextArrTime) &&
             (next_FFS_service_end_time <= nextDepartureTime) )
     {
        System.out.println("Next event: FFS finishes a packet (virtual packet departure)");
        FFS_fin = true;

        new_t = next_FFS_service_end_time;
         }

     System.out.println("------------------------------------------");

     vt_rate = compute_VT_Rate(Q, w);

         if ( vt_rate > 0 )
        new_vt = vt + vt_rate * (new_t - t);


//  System.out.println("@@@@@@@@@@@@@@@@ DEBUG: new_t = " + new_t);
//  System.out.println("@@@@@@@@@@@@@@@@ DEBUG: new_vt = " + new_vt);

/**********************************************************************/
// PROCESS !!!
/**********************************************************************/

//  System.out.println(" + + + + PROCESSING !!! + + + + + +");

     // *******************
     // Virtual progress
     // *******************

//   System.out.println("********************************");
//   System.out.println("Processing VIRTUAL progress\n");
//   System.out.println("********************************");
//   System.out.println("vt_rate= " + vt_rate);

     for (i = 0; i < nFlows; i++)
     {
        if ( Q[i].size() > 0 )
        {
           QueueElem x = Q[i].get(0);
           x.remaining_Virt_len -= w[i] * vt_rate *
                  (new_t - x.last_update_time);
           x.last_update_time = new_t;

//         System.out.println("Flow " + i + " remaining_Virt_len = " 
//                  + x.remaining_Virt_len);

//         System.out.println("Flow " + i + " remaining_Virt_len/w = " 
//                  + x.remaining_Virt_len/w[i]);
        }
     }

     // *******************
     // Real progress
     // *******************
//   System.out.println("********************************");
//   System.out.println("Processing REAL progress\n");
//   System.out.println("********************************");

     if ( PacketQ != null )
     {
        PacketQ.remaining_TransTime -= (new_t - last_update_time);

//      System.out.println("!!!! Packet Q, remaining trans time = " 
//                  + PacketQ.remaining_TransTime);
     }

         // ********************************
     // Remember the current time and compute curret VT rate
         // ********************************
     last_update_time = new_t;

         // **************************************
     // Check if next event = packet arrival
         // **************************************
         if ( Arrival )
     {
        System.out.println("***** Processing packet arrival");

        // Packet arrival

//      System.out.println("nextArrIndex = " + nextArrIndex);
//      System.out.println("nextArrTime = " + nextArrTime);

            nextFlowID = flowID[nextArrIndex];
            nextPacketLen = packetLen[nextArrIndex];

            q = new QueueElem();

            q.flowID = nextFlowID;
            q.packetLen = nextPacketLen;

            q.remaining_TransTime = q.packetLen;
            q.remaining_Virt_len = q.packetLen;
            q.last_update_time = new_t;

            q.virtualFinTime = ( (VT_flow[nextFlowID] > new_vt) ?
                                    VT_flow[nextFlowID] : new_vt ) +
                                       q.remaining_Virt_len/w[nextFlowID];
            VT_flow[nextFlowID] = q.virtualFinTime;

            Q[nextFlowID].add(q);


            // *********************************
            // Insert in Packet Q
            // *********************************
            PacketQ = List.insert(PacketQ, q);


        nextArrIndex++;     // go to Next arrival
     }

         // **************************************
         // Check if next event = packet departure
         // **************************************
         if ( Departure )
         {
        System.out.println("***** Processing packet departure");

        System.out.println(">>>>>> Output order " + Ordering
            + " --> flow ID = " + (PacketQ.flowID +1)
            + " (packet len = " + PacketQ.packetLen + ")");
        Ordering++;

        PacketQ = List.delete(PacketQ);

        if ( PacketQ != null )
            {
               PacketQ.remaining_TransTime = PacketQ.packetLen;
               PacketQ.last_update_time = new_t;
        }

//      System.out.println("--- PacketQ after processing packet departure");
//      if ( PacketQ != null )
//      {
//         List.print(PacketQ);
//      }
     }


         // **************************************
         // Check if next event = FFS fin packet 
         // **************************************
         if ( FFS_fin )
         {
        System.out.println("***** Processing FFS Finish");


            for ( i = 0; i < nFlows; i++ )
            {

               if ( Q[i].size() > 0 )
               {
                  if ( Q[i].get(0).remaining_Virt_len < 0.00001 )
          {
             Q[i].remove(0);

             if ( Q[i].size() > 0 )
             {
                Q[i].get(0).remaining_Virt_len =
                           Q[i].get(0).packetLen;
             }
          }
               }
            }


         }



     /* --------------------------------------------

        t ------------> new_t
            vt_rate
        -------------------------------------------- */
     vt_rate = compute_VT_Rate(Q, w);

     if ( vt_rate > 0 )
        new_vt = vt + vt_rate * (new_t - t);

     t = new_t;
     vt = new_vt;

     if ( nextArrTime > 10000 &&
          nextDepartureTime > 10000 &&
          next_FFS_service_end_time > 10000 )
     {
        System.out.println("t = " + t + " ----- END");
        break;
     }

     System.out.println();
     System.out.println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
     System.out.println("END processing: result");
     System.out.println("t = " + t);
     System.out.println("vt = " + vt);


     System.out.println("(1)  Current packet Queue:");
     List.print(PacketQ);
     System.out.println("(2)  Fluid Flow Server State:");
     printFFS_State(Q);
     System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");

     System.out.println("\n\n");
      }
   }
}

0 个答案:

没有答案