【问题标题】:Algorithm for school scheduling [duplicate]学校调度算法[重复]
【发布时间】:2018-06-20 11:34:06
【问题描述】:

任务是这样的。 11a 班每周应该教 35 小时(6 天。没有星期天)白天他们必须教 6 小时(最多)。科目:

“Matematika”-4 小时每周,“Fizika”-4 小时,“Rusi”-2 小时,“Anglisi”-2 小时,“Naqsha”-2 小时, “Biologiya”-2 小时,“Himiya”-2 小时,“Botanika”-2 小时,“Adabiyot”-3 小时, “Zabon-3 小时”,“Huquq”-3 小时,“TXT”-2 小时,“TDQ”-4。

我创建了这样的课程:

 class Class
{
    public string Name { get; set; }
    public Dictionary<string,int> Subjects { get; set; }
    public int MaxHoursInDay { get; set; }
    public int MaxHoursInWeek { get; set; }

}

然后我填写数据:

 Class _class = new Class();
        _class.Name = "11 a";
        _class.MaxHoursInDay = 5;
        _class.MaxHoursInWeek = 35;
        _class.Subjects = new Dictionary<string, int>();
        _class.Subjects.Add("Matematika", 4);
        _class.Subjects.Add("Fizika", 4);
        _class.Subjects.Add("Rusi", 2);
        ...

现在我想生成所有可能的日程安排选项。有没有解决问题的公式或算法?

【问题讨论】:

  • 奇怪(巧合),这就是老师要你自己弄清楚的一点
  • 你是什么意思?什么样的老师?
  • 这是作业吗?
  • 没有。这是我项目的一部分
  • 您的问题是constraint satisfaction problem,请解决。可能还有停机问题。

标签: c# algorithm combinatorics


【解决方案1】:

这不是最快也不是最干净的方法,但它是该过程的基本逻辑。

  • 首先输入List所有课程的时间。
  • 然后生成列表的所有排列。这为序列创建了所有可能的排序。这可以创造成千上万的可能性。以MoreLinq Permutation 为例。
  • 一旦您获得了创建上课天数所需的所有排列,以便查看该组合跨越了多少天。所以迭代每个排列。
  • 为每个排列创建一个班级列表并将其命名为“ClassDay”,然后仅当总小时数低于您的阈值(5 小时)时,按照排列给出的顺序将您的班级添加到列表中。
  • 如果您尝试添加的课程总数超过 5 小时,请将 ClassDay 存储在另一个 List(非常重要)中,然后开始一个新的 ClassDay 并使用相同的方法一次又一次地添加逻辑(最多 5 小时),直到您将所有课程都放在最多 5 小时的 ClassDay 中。
  • 最后检查每个排列创建了多少ClassDay。除了 6 ClassDay 之外,您还有其他任何组合都不好的单一排列。只有正好有 6 个ClassDay 的组合才是有效组合。

如果课程可以分成不同的小时段,例如 2 小时可以得到 2 次 1 小时,则您需要将所有课程分成尽可能小的段。然后,您需要最后一次通过以合并一天中按顺序排列的所有课程,因此如果 3 x 1 小时 Matematika 彼此跟随,您将它们重新组合为 3 小时中的 1 小时。

【讨论】:

  • 我只想知道如何生成这个。例如,使用 123 i 可以生成 123,132,213,231,321,312。有什么公式可以生成这个吗?
  • 是的,看看我提供给MoreLinq排列的链接。它正是这样做的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
相关资源
最近更新 更多