足球比赛调度算法

我要为足球比赛安排创建一个算法。据我所知,主要的调度规则是:

  1. 团队数
  2. 一个赛季包括2个回合
  3. 在一场比赛中,每支球队只参加一场比赛
  4. 在上个比赛日的主队应在下个比赛日成为客队(如果可能的话-我看了意甲联赛的赛程,并且有此规则的排除条款-每个队连续比赛2次(主场/客队-第一季/复仇回合)
  5. 共有2个回合,规则如下:第一轮(比赛第1天)的第一场比赛,A队与B队(A:B)比赛,因此复仇比赛B:A应该在比赛日{ 1}},其中allMatchDays/2 + i

当前方法:


i = 1

团队和比赛蓝图如下:

  private static Map<Integer,List<Match>> createSchedule(/*Set<Team> allTeams*/) {

    Set <Team> allTeams = Set.of(

            Team.builder().name("A").build(),Team.builder().name("B").build(),Team.builder().name("C").build(),Team.builder().name("D").build(),Team.builder().name("E").build(),Team.builder().name("F").build(),Team.builder().name("G").build(),Team.builder().name("H").build(),Team.builder().name("I").build(),Team.builder().name("J").build()

    );

    int teamsnumber = allTeams.size();
    int matchDays = (teamsnumber - 1) * 2;
    int gamesnumberPerMatchDay = teamsnumber / 2;

    List<Match> allMatches = allTeams.stream()
            .map(team ->
                    allTeams.stream().filter(otherTeam -> !otherTeam.equals(team))
                            .map(otherTeam -> Match.builder().homeTeam(team)
                                    .awayTeam(otherTeam).build()).collect(Collectors.toList())
            )
            .flatMap(Collection::stream)
            .collect(Collectors.toList());

    Map<Integer,List<Match>> schedule = IntStream.rangeclosed(1,matchDays)
            .boxed()
            .collect(Collectors.toMap(
                    matchDay -> (Integer) matchDay,matchDay -> new ArrayList<>()));

    Set<Team> homeTeamsInCurrentMatchDay = new HashSet<>();
    List<Team> teamsScheduledForCurrentMatchDay = new ArrayList<>();

    /*matchDay*/
    for (int i = 1; i <= matchDays / 2; i++) {

        List<Team> homeTeamsInPreviousMatchDay = new ArrayList<>(homeTeamsInCurrentMatchDay);
        homeTeamsInCurrentMatchDay.clear();

        /*match number in current Matchday*/
        for (int j = 1; j <= gamesnumberPerMatchDay; j++) {

            /*first match*/

            Match match = drawMatch(allMatches,teamsScheduledForCurrentMatchDay,homeTeamsInPreviousMatchDay);

            allMatches.remove(match);

            schedule.get(i).add(match);

            homeTeamsInCurrentMatchDay.add(match.getHomeTeam());

            teamsScheduledForCurrentMatchDay.add(match.getHomeTeam());
            teamsScheduledForCurrentMatchDay.add(match.getawayTeam());

            /*revenge match*/

            Match revengeMatch = Match.builder().homeTeam(match.getawayTeam()).awayTeam(match.getHomeTeam()).build();

            schedule.get((matchDays / 2) + i).add(revengeMatch);

            allMatches.remove(revengeMatch);

        }
        teamsScheduledForCurrentMatchDay.clear();
    }

    return schedule;
}

private static Match drawMatch(List<Match> matches,List<Team> alreadyScheduledTeamsInCurrentMatchDay,List<Team> homeTeamsInPreviousMatchDay) {


    List<Match> possibleMatches = matches.stream()
            .filter(match -> !alreadyScheduledTeamsInCurrentMatchDay.contains(match.getHomeTeam()) && !alreadyScheduledTeamsInCurrentMatchDay.contains(match.getawayTeam()))
            .collect(Collectors.toList());

    List<Match> possibleMatchesWithExclusionOfHomeTeams = new ArrayList<>(possibleMatches);

    possibleMatchesWithExclusionOfHomeTeams.removeIf(match -> homeTeamsInPreviousMatchDay.contains(match.getHomeTeam()));

    if (possibleMatchesWithExclusionOfHomeTeams.size() != 0) {
        possibleMatches = new ArrayList<>(possibleMatchesWithExclusionOfHomeTeams);
    }

    int randomNumber = new Random().nextInt(possibleMatches.size());
    return possibleMatches.get(randomNumber);
}

该算法无效。

  

线程“ main”中的异常java.lang.IllegalArgumentException:已绑定   必须为正

被抛出-这意味着某支球队在某比赛日有0场可能的比赛,符合开始时列出的那些规则。我不确定,我在这里缺少什么以及调度算法应如何反映真实的一种算法。换句话说,为什么@Data @NoArgsConstructor @AllArgsConstructor @Builder class Team { String name; } @Data @Builder @NoArgsConstructor @AllArgsConstructor class Match { private Team homeTeam; private Team awayTeam; } 恰好是possibleMatches.size(),需要进行哪些更正才能使该算法正常工作?

bcy63997863 回答:足球比赛调度算法

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3165033.html

大家都在问