2015-01-17 119 views
2

我的問題是產生隨機玩家對數量相同的遊戲,但限制遊戲的數量,以便所有玩家不必互相玩耍。Java產生隨機玩家對

把它想象成一個象棋遊戲,其中隨機玩家被設置爲遊戲,但每個玩家都不必與所有玩家一起玩(這將花費太多時間),但它們都必須具有相同的數字的遊戲競爭是公平的。

到目前爲止,我爲遊戲生成了一對獨特的對,但所有玩家都必須扮演每個人,這需要太多時間。 我知道,代碼是不漂亮,但它必須運行每月一次,以產生對:

@RequestMapping("/voistlus/{id}") 
    public String newGame(Model model, @PathVariable Long id) { 
    Stage stage = stageService.findOneById(id); 
    if (gameService.findByStage(stage).isEmpty()) { 
     List<Paar> paars = paarService.getAllPaar(); 
     List<Game> pairs = new ArrayList<Game>(); 
     for (Paar one : paars) { 
      for (Paar two : paars) { 
       if (!one.equals(two)) { 
        Game newPair = new Game(); 
        newPair.setPaar1(one); 
        newPair.setPaar2(two); 
        if (!pairs.contains(newPair)) { 
         if (pairs.isEmpty()) { 
          pairs.add(newPair); 
          newPair.setStage(stage); 
          gameService.save(newPair); 
         } else { 
          boolean exists = false; 
          for (Game game : pairs) { 
           if (game.getPaar1().equals(two) && game.getPaar2().equals(one)) { 
            exists = true; 
           } 
          } 
          if (!exists) { 
           pairs.add(newPair); 
           newPair.setStage(stage); 
           gameService.save(newPair); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    model.addAttribute("pairs", gameService.findByStage(stage)); 
    return "newGame"; 
} 
+0

什麼是'舞臺'? –

+0

舞臺是比賽的一部分 – 2201

回答

0

如何遍歷遊戲的數量,每次隨機挑選的球員?

int numberOfGames = 10; 
    List<Paar> paars = paarService.getAllPaar(); 
    for (int game = 0; game < numberOfGames; game++) { 
     // for each "game day", shuffle the list of players 
     Collections.shuffle(paars); 
     for (int playerIndex = 0; playerIndex < paars.size(); playerIndex+=2) { 
      Game newPair = new Game(); 
      newPair.setStage(stage); 
      newPair.setPaar1(paars.get(playerIndex)); 
      newPair.setPaar2(paars.get(playerIndex+1)); 
      gameService.save(newPair); 
     } 
    } 

缺點是,你不能避免同一對玩家互相玩耍多次;

3

考慮一下每個玩家是頂點的圖,玩家之間的邊表示這些玩家之間的遊戲。我們想要做的是在這個圖表中找出循環,每個循環遍歷所有玩家,即我們想要在這個圖表中找到哈密爾頓循環。

一般來說,找出一個圖是否具有哈密爾頓週期是NP完全的。然而,由於我們在這個問題中考慮的圖是一個完整的圖(每個頂點對彼此頂點都有一條邊),所以這個問題很容易。

我們可以用下面的僞代碼

Let V be the empty set 
Let E be the empty set 

Let init be a random vertex 
Add init to V 

While V does not contain all players 
    Select a random vertex R that is not in V 
    Add R to V 
    Add the edge (init - R) to E 
    Let init = R 
End 

E now contains the set of games to be played 

做到這一點通過多次執行此操作,您將能夠生成多個哈密爾頓週期,每個週期爲一組遊戲,每個玩家扮演反對恰好兩個其它不同的球員。

這個算法有一個主要的缺點,就是它允許同一個遊戲多次發生。 (玩家1和玩家2可能不止一次地相互對戰)

如果我們想要避免這種情況,我們必須在搜索下一個週期前從圖中找到找到的週期。但是,這樣做會確定是否存在另一個週期,從而找到它,再次完成NP-complete。

如果你想解決這個問題,一個好的起點將是herehere

+0

非常敏銳地將此視爲哈密頓循環問題。 – wvdz