【问题标题】:Permutations of a league schedule联赛时间表的排列
【发布时间】:2015-12-29 08:24:04
【问题描述】:

创建联赛日程安排软件并有一个数学问题,我需要一些帮助来解决我的问题。

假设您有 4 个团队(为简单起见)并检查 1、2、3、4 的所有可能排列。此排列仅称为第一周,它为您提供 24 种可能的排列。

1,2,3,4 是一个排列,说第 1 周 1X4 是一场比赛 2X3 是一场比赛。 第二周的比赛组合是通过循环赛设置的,所以接下来是 4,1,2,3; 4X3 1X2 是游戏。

我的问题是,如果第二周的游戏组合不起作用(由于限制),而是 3、4、1、2 的顺序会起作用,是否可以通过在第 1 周执行排列来检查?即第 1 周是 1,2,3,4 第 2 周是 3,4,1,2

或者我是否需要置换第 1 周,然后置换第 2 周,依此类推,以实际获得所有可能的时间表。我的直觉告诉我,我确实需要每周进行一次置换,以便真正获得时间表的所有可能排列。

编辑: 我问如果有四个星期,我的排列计算器会是 24*24*24*24 而不仅仅是 24。

【问题讨论】:

  • 有什么理由不计算所有排列,而是将它们放在一个数组中,并删除那些不通过额外约束的排列?其余的我不太明白你的问题。
  • 是的,在 11 个团队中,您正在查看大约 3900 万个排列是不可行的。
  • 您需要安排多少周?
  • 11 周。基本上我置换,测试,添加如果它通过,如果不重复就扔掉它。我的问题集中在我是否应该置换测试第 1 周置换第 2 周测试等,还是只置换一次并从那里开始
  • 如果 A-B 游戏在第 1 周进行,那么 B-A 是否可以被选择在第 2 周进行,或者轮流被视为同一游戏,并且被排除在可能性之外,或者是约束的一部分测试?

标签: java algorithm permutation


【解决方案1】:

要直接回答您的问题,仅检查第 1 周的所有排列不一定会检查所有可能的排列。使用一些简单的示例进行测试,您会很快看到

在我看来,您好像需要一个标准的 Backtracking 算法。这些正是针对这些类型的约束问题而设计的。

一般形式是这样的

function permutation
    if all current matches satisfy constraints
        if any weeks remaining to be allocated
            for each possible match for next week
                call permutation with that match added
        else
            accept this solution

假设有足够的约束,很少有排列是合法的。但是,如果许多排列是合法的,那么接受解决方案的过程将需要在处理它们时考虑到这一点。

【讨论】:

  • 这就是我在考虑每周必须调用排列以找到所有可能的解决方案时的想法
  • 如果没有足够的约束怎么办?记忆的许多排列?
  • 是的,我认为您别无选择。但是,只要您使用回溯算法,它就会尽早修剪违反您的约束的分支。它还具有在进行过程中输出解决方案的优势。
  • 如果你真的想使用合法的排列,那么你将不得不以某种方式解决它们的存储问题。如果您只想计算它们,那么没有问题:“接受此解决方案”只是增加一个变量。
  • 或者,如果您想要 100 个可能的选项,那么您可以将它们存储在一个列表中,然后在列表已满时退出。
【解决方案2】:

就我而言,此解决方案可能会对您有所帮助。
首先,您从用户那里获取一周的输入。然后您计算一周的排列。
最后,乘以周的幂。

public class Schedule {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter week");
        int x = scan.nextInt();
        int y = (int) Math.pow(permutation(x), x);
        System.out.println(y);
    }

    public static int permutation(int week) {
        int y;
        if (week == 1) {
            return 1;
        } else {
            y = week * permutation(week - 1);
        }
        return y;
    }
}

【讨论】:

  • OP 引用了约束。换句话说,这不仅仅是一个简单的组合问题:需要检查每个组合以确定是否违反了约束。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2013-08-06
相关资源
最近更新 更多