【问题标题】:Java generating random player pairsJava生成随机玩家对
【发布时间】:2015-01-17 10:12:31
【问题描述】:

我的问题是生成具有相同游戏数量的随机玩家对,但限制游戏数量,这样所有玩家都不必互相玩。

把它想象成一个国际象棋游戏,随机玩家被设置为游戏,但每个玩家不必与所有玩家一起玩(这会花费太多时间),但他们都必须有相同数量的比赛要公平。

到目前为止,我为游戏生成了一个独特的配对,但所有玩家都必须与每个人一起玩,这需要太多时间。 我知道代码并不漂亮,但它必须每月运行一次才能生成对:

    @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";
}

【问题讨论】:

  • 舞台是比赛的一部分

标签: java algorithm


【解决方案1】:

考虑图中每个玩家都是一个顶点,玩家之间的边表示这些玩家之间的游戏。我们要做的是在这个图中找到循环,每个循环都经过所有玩家,即我们想在这个图中找到哈密顿循环。

一般来说,找出一个图是否有哈密顿圈是 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

【讨论】:

  • 非常敏锐地将其检测为哈密顿循环问题。
【解决方案2】:

如何迭代游戏数量并每次选择随机玩家?

    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);
        }
    }

缺点是你无法避免同一对玩家多次对战;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多