2012-03-28 2 views
0

食料品店で5行をシミュレートするはずのかなり複雑なプログラムです。 人が行頭にきて、空になっているものを見つけて、チェックアウトに進みます。すべての行がいっぱいになると、その人は最も短い待ち時間で行に参加します。 このプログラムは、私の本にあった別のもの(したがってすべてのコメント)から修正されました。 私はこれを2行で動作させることができましたが、5で正しく動作させることができませんでした。プログラムのヘルプ:Javaでの食料品のラインシミュレーション

// FILE: Carwash.java 
// This program illustrates the use of the lineSimulate method which uses 
// a simple queue to simulate cars waiting at a car wash. 

import java.util.LinkedList; 
import java.util.Queue; 
import java.util.Scanner; 
// import edu.colorado.simulations.BooleanSource; 
// import edu.colorado.simulations.Line ; 
// import edu.colorado.simulations.Averager; 

/****************************************************************************** 
* The <CODE>CarWash</CODE> Java application illustrates the use of 
* the <CODE>lineSimulate</CODE> method. 
* The illustration uses the following values: 
* <CODE> 
* <br>lineTime = 240 
* <br>arrivalTime = 0.0025 
* <br>totalTime = 6000 
* </CODE> 
* 
* <p><dt><b>Java Source Code for this class:</b><dd> 
* <A HREF="../applications/CarWash.java"> 
* http://www.cs.colorado.edu/~main/applications/CarWash.java 
* </A> 
* 
* @author Michael Main 
* <A HREF="mailto:[email protected]"> ([email protected]) </A> 
* 
* @version 
* Jun 12, 1998 
******************************************************************************/ 
public class LineWait 
{ 
    /** 
    * The main method activates <CODE>lineSimulate</CODE> with the values: 
    * <CODE> 
    * <br>lineTime = 240 
    * <br>arrivalTime = 0.0025 
    * <br>totalTime = 6000 
    * </CODE> 
    * <BR>The <CODE>String</CODE> argument (<CODE>args</CODE>) is not used in 
    * this implementation. 
    **/ 
    public static void main(String[ ] args) 
    { 

     final int LINETIME = 100 + (int)(Math.random() * ((400) + 1)); 
     final double ARRIVALPROB = (Math.random() * ((.1) + 1)); 
     final int TOTALTIME = 6000; 

     lineSimulate(LINETIME, ARRIVALPROB, TOTALTIME); 
    } 

    /** 
    * Simulate the running of a car washer for a specified amount of time. 
    * @param <CODE>lineTime</CODE> 
    * the number of seconds required to wash one car 
    * @param <CODE>arrivalProb</CODE> 
    * the probability of a customer arriving in any second, for example 
    * 0.1 is 10% 
    * @param <CODE>totalTime</CODE> 
    * the total number of seconds for the simulation 
    * <dt><b>Precondition:</b><dd> 
    * <CODE>lineTime</CODE> and <CODE>totalTime</CODE> are positive; 
    * <CODE>arrivalProb</CODE> lies in the range 0 to 1. 
    * <dt><b>Postcondition:</b><dd> 
    * The method has simulated a car wash where <CODE>lineTime</CODE> is the 
    * number of seconds needed to wash one car, <CODE>arrivalProb</CODE> is 
    * the probability of a customer arriving in any second, and 
    * <CODE>totalTime</CODE> is the total number of seconds for the 
    * simulation. Before the simulation, the method has written its three 
    * parameters to <CODE>System.out</CODE>. After the simulation, the method 
    * has written two pieces of information to <CODE>System.out</CODE>: 
    * (1) The number of cars washed, and (2) The average waiting time for 
    * customers that had their cars washed. (Customers that are still in the 
    * queue are not included in this average). 
    * @exception java.lang.IllegalArgumentException 
    * Indicates that one of the arguments violates the precondition. 
    **/ 
    public static void lineSimulate 
    (int lineTime, double arrivalProb, int totalTime) 
    { 
     Queue<Integer> arrivalTimes = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes2 = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes3 = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes4 = new LinkedList<Integer>(); 
     Queue<Integer> arrivalTimes5 = new LinkedList<Integer>(); 
     int next; 
     BooleanSource arrival = new BooleanSource(arrivalProb); 
     Line number = new Line(lineTime); 
     Line number2 = new Line(lineTime); 
     Line number3 = new Line(lineTime); 
     Line number4 = new Line(lineTime); 
     Line number5 = new Line(lineTime); 
     Averager waitTimes = new Averager(); 
     Averager waitTimes2 = new Averager(); 
     Averager waitTimes3 = new Averager(); 
     Averager waitTimes4 = new Averager(); 
     Averager waitTimes5 = new Averager(); 
     int currentSecond; 
     // Write the parameters to System.out. 
     System.out.println("Seconds to wait in line " + lineTime); 
     System.out.print("Probability of customer arrival during a second: "); 
     System.out.println(arrivalProb); 
     System.out.println("Total simulation seconds: " + totalTime); 

     // Check the precondition: 
     if (lineTime <= 0 || arrivalProb < 0 || arrivalProb > 1 || totalTime < 0) 
     throw new IllegalArgumentException("Values out of range");   



     //I BELIEVE THE PROBLEM IS BELOW THIS POINT 








     for (currentSecond = 0; currentSecond < totalTime; currentSecond++) 
     { // Simulate the passage of one second of time. 

     // Check whether a new customer has arrived. 
     if (arrival.query()) 
      { 

       //if(number.isBusy() && number2.isBusy() && number3.isBusy() && number4.isBusy() && number5.isBusy()) 
       //{ 

        if(arrivalTimes.size() > arrivalTimes2.size() && arrivalTimes.size() > arrivalTimes3.size() && arrivalTimes.size() > arrivalTimes4.size() && arrivalTimes.size() > arrivalTimes5.size()) 
        { 
         arrivalTimes.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else if(arrivalTimes2.size() > arrivalTimes.size() && arrivalTimes2.size() > arrivalTimes3.size() && arrivalTimes2.size() > arrivalTimes4.size() && arrivalTimes2.size() > arrivalTimes5.size()) 
        { 
         arrivalTimes2.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else if(arrivalTimes3.size() > arrivalTimes.size() && arrivalTimes3.size() > arrivalTimes2.size() && arrivalTimes3.size() > arrivalTimes4.size() && arrivalTimes3.size() > arrivalTimes5.size()) 
        { 
         arrivalTimes3.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else if(arrivalTimes4.size() > arrivalTimes.size() && arrivalTimes4.size() > arrivalTimes3.size() && arrivalTimes4.size() > arrivalTimes2.size() && arrivalTimes4.size() > arrivalTimes5.size()) 
        { 
         arrivalTimes4.add(currentSecond); 
         System.out.println("Test"); 
        } 
        else{arrivalTimes5.add(currentSecond);} 
       //} 

      } 

      // Check whether we can put the person into a line. 
      if ((!number.isBusy()) && (!arrivalTimes.isEmpty())) 
      { 
       next = arrivalTimes.remove(); 
       waitTimes.addNumber(currentSecond - next); 
       number.startMoving(); 
      } 
      if ((!number2.isBusy()) && (!arrivalTimes2.isEmpty())) 
      { 
       next = arrivalTimes2.remove(); 
       waitTimes2.addNumber(currentSecond - next); 
       number2.startMoving(); 
      } 
      if ((!number3.isBusy()) && (!arrivalTimes2.isEmpty())) 
      { 
       next = arrivalTimes2.remove(); 
       waitTimes3.addNumber(currentSecond - next); 
       number3.startMoving(); 
      } 
      if ((!number4.isBusy()) && (!arrivalTimes2.isEmpty())) 
      { 
       next = arrivalTimes2.remove(); 
       waitTimes4.addNumber(currentSecond - next); 
       number4.startMoving(); 
      } 
      if ((!number5.isBusy()) && (!arrivalTimes2.isEmpty())) 
      { 
       next = arrivalTimes2.remove(); 
       waitTimes5.addNumber(currentSecond - next); 
       number5.startMoving(); 
      } 


     // Subtract one second from the remaining time in the current li 
     number.reduceRemainingTime(); 
     number2.reduceRemainingTime(); 
     number3.reduceRemainingTime(); 
     number4.reduceRemainingTime(); 
     number5.reduceRemainingTime(); 
     } 






     //I BELIEVE THE PROBLEM IS ABOVE THIS POINT 



     // Write the summary information about the simulation. 
     System.out.println("\nCustomers served Line1: " + waitTimes.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line1: " + waitTimes.average() + " sec"); 
     System.out.println("\nCustomers served Line2: " + waitTimes2.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line2: " + waitTimes2.average() + " sec"); 
     System.out.println("\nCustomers served Line3: " + waitTimes3.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line3: " + waitTimes3.average() + " sec"); 
     System.out.println("\nCustomers served Line4: " + waitTimes4.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line4: " + waitTimes4.average() + " sec"); 
      System.out.println("\nCustomers served Line5: " + waitTimes5.howManyNumbers()); 
     if (waitTimes.howManyNumbers() > 0) 
     System.out.println("Average wait Line5: " + waitTimes5.average() + " sec"); 

} 
} 
+0

5行ではどのような問題がありますか? –

+0

5行のコードラインではなく、5行の食料品ライン。混乱をおかけして申し訳ありません。 – CoolerScouter

+0

うん、私はそれを得る、あなたは5つの食料品のラインで持っている問題は何ですか?スタックオーバーフローは、あなたのコードの問題を手助けするためのものです。 –

答えて

2

1よりも大きい任意の数の項目がリストに処理する必要があります:仕様に近いあなたのコード設計

List<Queue<Integer>> queues = new ArrayList<Queue<Integer>>(); 
for (int i=1; i<=5; i++) 
    queues.add(new LinkedList<Integer>>()); 

スタート:

Queue<Integer> emptyqueue = GetEmptyQueue(queues); 
if (emptyqueue != null) 
    ... 
else 
    ... 
4

は、一般的なコピー&ペーストのように見えますここのエラー:

if ((!number3.isBusy()) && (!arrivalTimes**2**.isEmpty())) 

... 

if ((!number4.isBusy()) && (!arrivalTimes**2**.isEmpty())) 

... 

if ((!number5.isBusy()) && (!arrivalTimes**2**.isEmpty())) 

... 

Ozanによると、複数のアイテムを持っている場合、リストや配列を使用すると、このようなミスをする可能性が減ります。

編集:追加のアドバイス、私はあなたが1つ以上の最大値を持っている場合、すなわち、 2、2、1、1、1の場合は、1行目または2行目に入れたい場合でも、顧客を5行目にすることになります。