2016-04-06 21 views
1

Temel olarak, soru bir bankada beklemede bekleyen insanlar için bir simülasyon oluşturmaktır. Ortalama bekleme süresi, ortalama dakika sayısı, ortalama en uzun bekleme süresi vb. Gibi belirli kriterler vardır. Aynı zamanda programımı her seferinde 1000 kez (for döngüsünü kullanarak) 3 kez çalıştırmayı ister. Sorun şu ki, kodu her çalıştırdığımda, cevaplar bir sebepten dolayı toplanıyor ve nedenini bilmiyorum. Örneğin, son çalıştırmada, simülasyonun kaç kez çalıştırılacağı, 1000 kez olmalıydı, bunun yerine, önceki tüm koşuları bir araya getirdi ve 3000 kez verdi.Programımı her çalıştırdığımda neden sonuncuya ekleniyor

Ayrıca, while döngüsü dışındaki tüm değişkenler (ortalamaWaitingTime, averageSimulationTime ... vb) bana yanlış cevaplar veriyor. Örneğin, ortalama bekleme süresi için bekleme süresinin aynı değerini eklemeye devam etmesidir. Nedenini anlayamıyorum.

public class QueueSimulation { 
    public static void main(String[] args) { 
    Queue<Customer> q = new LinkedList<Customer>(); 

    int numServed = 0; 
    int averageNumServed = 0; 
    int waitingTime = 0; 
    int maxWaitingTime = 0; 
    int averageLongestWaitingTime = 0; 
    int totalWaitingTime = 0; 
    double averageWaitingTime = 0; 
    int maxQueueSize = 0; 
    int timeDone = 0; 
    int totalSimulationTime = 0; 
    int averageSimulationTime = 0; 
    int numSimulationRan = 0; 
    Random randomGenerator = new Random(); 
    int time = 0; 
    int processingTime = 0; 
    int totalProcessingTime = 0; 

    for (int i = 0; i < 1000; i++) { 

     double arrivalRate = 0.2; 
     int maxProcessingTime = 5; 

     while (time < 8 * 60) { 
      if (Math.random() < 0.2) { 
       System.out.println("A new customer arrives at time " + time); 
       processingTime = randomGenerator.nextInt(maxProcessingTime); 
       totalProcessingTime += processingTime; 
       Customer c = new Customer(time, processingTime); 
       q.add(c); 
       if (q.size() > maxQueueSize) 
        maxQueueSize = q.size(); 
      } 

      if (waitingTime > maxWaitingTime) 
       maxWaitingTime = waitingTime; 

      averageLongestWaitingTime += maxWaitingTime; 

      // serve the next customer 
      if (time > timeDone) // service is available 
       if (!q.isEmpty()) { 
        Customer c = q.remove(); 
        timeDone = time + c.getProcessingTime(); 
        // calculate the waiting time of this customer 
        waitingTime = time - c.getArrivalTime(); 
        // update total waiting time of all customers 
        totalWaitingTime += waitingTime; 
        // service this customer 
        numServed++; 
       } 
      time++; 

      if (time > 8 * 60) 
       while (!q.isEmpty()) { 
        Customer c = q.remove(); 
        timeDone = time + c.getProcessingTime(); 
        // calculate the waiting time of this customer 
        waitingTime = time - c.getArrivalTime(); 
        // update total waiting time of all customers 
        totalWaitingTime += waitingTime; 
        // service this customer 
        numServed++; 
       } 
     } 

     averageWaitingTime += (totalWaitingTime/numServed); 
     totalSimulationTime = timeDone; 
     averageSimulationTime += totalSimulationTime; 
     averageNumServed += numServed; 
     numSimulationRan += 1; 
    } 

    System.out.println(); 
    System.out.println("Average waiting time per customer: " + (double) averageWaitingTime/1000); 
    System.out.println("Average longest waiting time: " + (double) averageLongestWaitingTime/1000); 
    System.out.println("Average number of minutes: " + (double) averageSimulationTime/1000); 
    System.out.println("Longest waiting time: " + maxWaitingTime); 
    System.out.println("Average number of customers " + (double) averageNumServed/1000); 
    System.out.println("Number of times the simulation ran: " + numSimulationRan); 

    for (int j = 0; j < 1000; j++) { 

     double arrivalRate = 0.5; 
     int maxProcessingTime = 3; 

     while (time < 8 * 60) { 
      if (Math.random() < 0.5) { 
       System.out.println("A new customer arrives at time " + time); 
       processingTime = randomGenerator.nextInt(maxProcessingTime); 
       totalProcessingTime += processingTime; 
       Customer c = new Customer(time, processingTime); 
       q.add(c); 
       if (q.size() > maxQueueSize) 
        maxQueueSize = q.size(); 
      } 

      if (waitingTime > maxWaitingTime) 
       maxWaitingTime = waitingTime; 

      averageLongestWaitingTime += maxWaitingTime; 

      // serve the next customer 
      if (time > timeDone) // service is available 
       if (!q.isEmpty()) { 
        Customer c = q.remove(); 
        timeDone = time + c.getProcessingTime(); 
        // calculate the waiting time of this customer 
        waitingTime = time - c.getArrivalTime(); 
        // update total waiting time of all customers 
        totalWaitingTime += waitingTime; 
        // service this customer 
        numServed++; 
       } 
      time++; 

      if (time > 8 * 60) 
       while (!q.isEmpty()) { 
        Customer c = q.remove(); 
        timeDone = time + c.getProcessingTime(); 
        // calculate the waiting time of this customer 
        waitingTime = time - c.getArrivalTime(); 
        // update total waiting time of all customers 
        totalWaitingTime += waitingTime; 
        // service this customer 
        numServed++; 
       } 
     } 

     averageWaitingTime += (totalWaitingTime/numServed); 
     totalSimulationTime = timeDone; 
     averageSimulationTime += totalSimulationTime; 
     averageNumServed += numServed; 
     numSimulationRan += 1; 
    } 

    System.out.println(); 
    System.out.println("Average waiting time per customer: " + (double) averageWaitingTime/1000); 
    System.out.println("Average longest waiting time: " + (double) averageLongestWaitingTime/1000); 
    System.out.println("Average number of minutes: " + (double) averageSimulationTime/1000); 
    System.out.println("Longest waiting time: " + maxWaitingTime); 
    System.out.println("Average number of customers " + (double) averageNumServed/1000); 
    System.out.println("Number of times the simulation ran: " + numSimulationRan); 

    for (int k = 0; k < 1000; k++) { 

     double arrivalRate = 0.68; 
     int maxProcessingTime = 4; 

     while (time < 8 * 60) { 
      if (Math.random() < 0.68) { 
       System.out.println("A new customer arrives at time " + time); 
       processingTime = randomGenerator.nextInt(maxProcessingTime); 
       totalProcessingTime += processingTime; 
       Customer c = new Customer(time, processingTime); 
       q.add(c); 
       if (q.size() > maxQueueSize) 
        maxQueueSize = q.size(); 
      } 

      if (waitingTime > maxWaitingTime) 
       maxWaitingTime = waitingTime; 

      averageLongestWaitingTime += maxWaitingTime; 

      // serve the next customer 
      if (time > timeDone) // service is available 
       if (!q.isEmpty()) { 
        Customer c = q.remove(); 
        timeDone = time + c.getProcessingTime(); 
        // calculate the waiting time of this customer 
        waitingTime = time - c.getArrivalTime(); 
        // update total waiting time of all customers 
        totalWaitingTime += waitingTime; 
        // service this customer 
        numServed++; 
       } 
      time++; 

      if (time > 8 * 60) 
       while (!q.isEmpty()) { 
        Customer c = q.remove(); 
        timeDone = time + c.getProcessingTime(); 
        // calculate the waiting time of this customer 
        waitingTime = time - c.getArrivalTime(); 
        // update total waiting time of all customers 
        totalWaitingTime += waitingTime; 
        // service this customer 
        numServed++; 
       } 
     } 

     averageWaitingTime += (totalWaitingTime/numServed); 
     totalSimulationTime = timeDone; 
     averageSimulationTime += totalSimulationTime; 
     averageNumServed += numServed; 
     numSimulationRan += 1; 
    } 

    System.out.println(); 
    System.out.println("Average waiting time per customer: " + (double) averageWaitingTime/1000); 
    System.out.println("Average longest waiting time: " + (double) averageLongestWaitingTime/1000); 
    System.out.println("Average number of minutes: " + (double) averageSimulationTime/1000); 
    System.out.println("Longest waiting time: " + maxWaitingTime); 
    System.out.println("Average number of customers " + (double) averageNumServed/1000); 
    System.out.println("Number of times the simulation ran: " + numSimulationRan); 
} 

}

Çıktı:

A new customer arrives at time 5 
A new customer arrives at time 10 
A new customer arrives at time 11 
A new customer arrives at time 12 
A new customer arrives at time 25 
A new customer arrives at time 28 
A new customer arrives at time 31 
A new customer arrives at time 45 
A new customer arrives at time 48 
A new customer arrives at time 51 
A new customer arrives at time 59 
A new customer arrives at time 64 
A new customer arrives at time 68 
A new customer arrives at time 86 
A new customer arrives at time 100 
A new customer arrives at time 106 
A new customer arrives at time 108 
A new customer arrives at time 113 
A new customer arrives at time 115 
A new customer arrives at time 120 
A new customer arrives at time 124 
A new customer arrives at time 125 
A new customer arrives at time 126 
A new customer arrives at time 132 
A new customer arrives at time 137 
A new customer arrives at time 153 
A new customer arrives at time 156 
A new customer arrives at time 164 
A new customer arrives at time 201 
A new customer arrives at time 206 
A new customer arrives at time 208 
A new customer arrives at time 219 
A new customer arrives at time 226 
A new customer arrives at time 233 
A new customer arrives at time 234 
A new customer arrives at time 237 
A new customer arrives at time 242 
A new customer arrives at time 246 
A new customer arrives at time 247 
A new customer arrives at time 251 
A new customer arrives at time 262 
A new customer arrives at time 271 
A new customer arrives at time 276 
A new customer arrives at time 277 
A new customer arrives at time 282 
A new customer arrives at time 285 
A new customer arrives at time 287 
A new customer arrives at time 292 
A new customer arrives at time 296 
A new customer arrives at time 298 
A new customer arrives at time 318 
A new customer arrives at time 319 
A new customer arrives at time 327 
A new customer arrives at time 336 
A new customer arrives at time 337 
A new customer arrives at time 338 
A new customer arrives at time 346 
A new customer arrives at time 355 
A new customer arrives at time 356 
A new customer arrives at time 358 
A new customer arrives at time 362 
A new customer arrives at time 363 
A new customer arrives at time 366 
A new customer arrives at time 374 
A new customer arrives at time 379 
A new customer arrives at time 380 
A new customer arrives at time 384 
A new customer arrives at time 389 
A new customer arrives at time 400 
A new customer arrives at time 407 
A new customer arrives at time 416 
A new customer arrives at time 418 
A new customer arrives at time 424 
A new customer arrives at time 427 
A new customer arrives at time 433 
A new customer arrives at time 436 
A new customer arrives at time 437 
A new customer arrives at time 438 
A new customer arrives at time 446 
A new customer arrives at time 454 
A new customer arrives at time 466 
A new customer arrives at time 469 
A new customer arrives at time 471 

Average waiting time per customer: 1.0 
Average longest waiting time: 2.714 
Average number of minutes: 475.0 
Longest waiting time: 8 
Average number of customers 83.0 
Number of times the simulation ran: 1000 

Average waiting time per customer: 2.0 
Average longest waiting time: 2.714 
Average number of minutes: 950.0 
Longest waiting time: 8 
Average number of customers 166.0 
Number of times the simulation ran: 2000 

Average waiting time per customer: 3.0 
Average longest waiting time: 2.714 
Average number of minutes: 1425.0 
Longest waiting time: 8 
Average number of customers 249.0 
Number of times the simulation ran: 3000 
+0

Sorunuzu anlamıyorum. Lütfen koşularınızın çıktısını gösterin ve 'yanlış' ile ne demek istediğinizi açıklayın. – betseyb

+0

İşte başlıyorsunuz. Bunun için üzgünüm :) – user6168685

cevap

1

Don't Repeat Yourself or DRY adında bir prensip var. Terim gerçekleşmeden önce, tembelliğin bir programcıda iyi bir kalite olduğunu söylerdik: Eğer iki kez bir şeyler yapmak zorunda kalırsanız, bunu çok sık yapın.

Belki de programınızın üç kez aynı koda sahip olması nedeniyle, bazı methods bildirmeye bakabilirsiniz.

İronik olarak, yalnızca bir kez yapılacak tek şey var: istatistik değişkenlerini başlatmak: o zaman bu bölümü kopyalayıp türlerini kaldırmak (yani numServed = 0; vb okur) ve varsa anlaşıldı

int numServed = 0; 
... 

kez daha Bu değişkenleri sıfırlardı. Ancak, kopyala yapıştırma kodu kötü bir uygulamadır: Artık korumak için 3 kat daha fazla kodunuz var.

class QueueSimulation 
{ 
    public static void main(String[] args) { 
     for (int test = 0; test < 3; test ++) { 
      int numServed = 0; 
      .. 
      for (int i = 0; i < 1000; i++) { 
       ... 
      } 
      System.out.println(); 
      ....  
     } 
    } 
} 

yinelenen kod var, bir de bunların her simülasyon için sıfırlanır böylece değişkenleri lokalize - sorununuzun çözülüp:

Bunu düzeltmek için, bu gibi program yapısı olabilir.

Bu, doğru yönde sadece bir adımdır. Bir başka adım, Top-Down and Bottom-Up design gibi abstraction levels adresindeki factor out yöntemlerine ilişkindir.
TLDR: numaralı telefonun iyi bir kuralı numaralı yazının bir sayfasına uygun herhangi bir yönteme sahiptir.

Sizin durumunuzda: 3 kez aynı simülasyonu çalıştırıyorsunuz. Bu simülasyonun detayları, simülasyonu 3 kez çalıştıran yöntem için önemli değildir.

Değişkenleri QueueSimulation sınıfının alanlarına dönüştürdüğümüz başka bir olası anahat. Bunları başlatmak için yeni bir QueueSimulation'ı basitçe başlatıyoruz. Burada:

class QueueSimulation 
{ 
    public static void main(String[] args) { 
     for (int test = 0; test < 3; test ++) { 
      QueueSimulation sim = new QueueSimulation(); 
      sim.simulate(); 
      sim.report(); 
     } 
    } 


    Queue<Customer> q = new LinkedList<Customer>(); 
    int numServed = 0; 
    ... 
    int totalProcessingTime = 0; 

    public void simulate() { 
     for (int i = 0; i < 1000) { 
      .... 
     } 
    } 

    public void report() { 
     System.out.println(.... 
     ...   
    } 
} 
+0

Haha. "DRY" diyerek nasıl başladığına bayıldım. +1 :) –

+0

Tamam tamam anladım! Detaylı açıklama için teşekkürler! gerçekten buna ihtiyacım var :) – user6168685

İlgili konular