2017-05-08 119 views
1

我想做一個簡單的程序,找到獲得與美式足球可用得分方法得分的所有可能性。Java多線程|尋找所有的可能性

這裏是我的代碼工作,並返回所有possiblities的得分

for (int a = 0; (a * sf) <= score; a++) { 
     for (int b = 0; (b * fg) + (a * sf) <= score; b++) { 
      for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) { 
       for (int d = 0; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; d++) { 
        for (int e = 0; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; e++) { 
         if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == score) { 
          count++; 
          // System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC "); 
         } 
        } 
       } 
      } 
     } 
    } 

我想讓它這樣我就可以分手了比分變成多線程使程序可以多得更快處理更大的數字。

目前我正在測試4個線程,我正在使用這個循環。

for (int a = min; (a * sf) <= max; a++) { 
     for (int b = min; (b * fg) + (a * sf) <= max; b++) { 
      for (int c = min; (c * td) + (b * fg) + (a * sf) <= max; c++) { 
       for (int d = min; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= max; d++) { 
        for (int e = min; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= max; e++) { 
         if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == max) { 
          main.inc(); 
          System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC "); 

         } 
        } 
       } 
      } 
     } 
    } 

例如,如果得分爲500 線程1將得到I-125, 線程2,126-250, 線程3,251-375, 螺紋4,376 500

我有正確的分裂,並給予正確的最小最大值,但它仍然無法正常工作。我相信它必須在每個循環開始的地方做些事情,但我不確定。任何幫助將不勝感激。如果需要更多的解釋,請讓我知道

+0

是啊...這似乎很簡單。 –

+1

@MuratK。那麼你爲什麼要發佈而不提出任何建議? – brendan612

+0

你的問題確實需要一個[mcve]而不僅僅是片段。 – Gimby

回答

1

很確定你只能做外循環的最小/最大值。看看它的工作原理是這樣的:

for (int a = min; (a * sf) <= max; a++) { 
    for (int b = 0; (b * fg) + (a * sf) <= score; b++) { 
     for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) { 
      for (int d = 0; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; d++) { 
       for (int e = 0; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; e++) { 
        if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == score) { 
         count++; 
         // System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC "); 
        } 
       } 
      } 
     } 
    } 
} 

爲了與最小運行/最大適用於所有5圈,在每個級別劃分的分數,你將需要1024線(4 * 4 * 4 * 4 * 4 = 1024)。線程1將分別在5個for循環的每一個上執行1-125,1-125,1-125,1-125,1-125。線程2將執行1-125,1-125,1-125,1-125,126-250。線程3將執行1-125,1-125,1-125,1-125,251-375 ...等等。基本上就像一個5位數的基數爲4的數字從00000增加到33333.但是,由於該算法是CPU和/或I/O綁定的,如果增加超過數量的線程數,您可能看不到任何性能增益你機器上的CPU核心。我會堅持按照您的預期劃分外環4。

編輯:這裏有一個工作實現:

public class ScoresTest implements Runnable { 

    public static final int SCORE = 500; 
    public static final int SF = 2; 
    public static final int FG = 3; 
    public static final int TD = 6; 
    public static final int TE = 7; 
    public static final int TD2 = 8; 

    int min; 
    int max; 

    public ScoresTest(int min, int max) { 
     this.min = min; 
     this.max = max; 
    } 

    @Override 
    public void run() { 
     for (int a=min/SF; a*SF <= max; a++) { 
      for (int b=0; a*SF + b*FG <= SCORE; b++) { 
       for (int c=0; a*SF + b*FG + c*TD <= SCORE; c++) { 
        for (int d=0; a*SF + b*FG + c*TD + d*TE <= SCORE; d++) { 
         for (int e=0; a*SF + b*FG + c*TD + d*TE + e*TD2 <= SCORE; d++) { 
          if (a*SF + b*FG + c*TD + d*TE + e*TD2 == SCORE) { 
           System.out.println("SF: " + a + ", FG: " + b + ", TD: " + c + ", TE: " + d + ", TD2: " + e); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    public static void main(String args[]) { 
     Thread thread1 = new Thread(new ScoresTest(0, 124)); 
     Thread thread2 = new Thread(new ScoresTest(126, 248)); 
     Thread thread3 = new Thread(new ScoresTest(250, 374)); 
     Thread thread4 = new Thread(new ScoresTest(376, 500)); 

     thread1.start(); 
     thread2.start(); 
     thread3.start(); 
     thread4.start(); 
    } 

} 
+0

@Gabriel Vince - 該算法非常耗費CPU或可能I/O限制,因此增加超過CPU數量的線程數在你的機器上不可能提高性能。這就是我的計算機上有1024個核心的地方。 –