Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排课算法_C#_Algorithm_Combinatorics - Fatal编程技术网

C# 排课算法

C# 排课算法,c#,algorithm,combinatorics,C#,Algorithm,Combinatorics,任务就是这样。11a班每周应授课35小时(6天,不含周日),每天必须授课6小时(最多)。科目: “Matematika”-每周4小时,“Fizika”-4小时,“Rusi”-2小时,“Anglisi”-2小时,“Naqsha”-2小时, “Biologiya”-2小时,“Himiya”-2小时,“Botanika”-2小时,“Adabiyot”-3小时, “Zabon-3小时”,“Huqq”-3小时,“TXT”-2小时,“TDQ”-4小时 我创建了这样的类: class Class {

任务就是这样。11a班每周应授课35小时(6天,不含周日),每天必须授课6小时(最多)。科目:

“Matematika”-每周4小时,“Fizika”-4小时,“Rusi”-2小时,“Anglisi”-2小时,“Naqsha”-2小时, “Biologiya”-2小时,“Himiya”-2小时,“Botanika”-2小时,“Adabiyot”-3小时, “Zabon-3小时”,“Huqq”-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; }

}
类
{
公共字符串名称{get;set;}
公共词典主题{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);
        ...
Class\u Class=newclass();
_class.Name=“11 a”;
_class.MaxHoursInDay=5;
_class.MaxHoursInWeek=35;
_class.Subjects=新字典();
_添加(“Matematika”,4);
_课程。科目。添加(“菲兹卡”,4);
_类别。科目。添加(“Rusi”,2);
...

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

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

  • 首先把你所有的课程和课时列在一个
    列表中
  • 然后生成列表的所有排列。这将为序列创建所有可能的排序。这可能会产生成千上万的可能性。请看一个例子
  • 一旦你有了所有的排列,你需要创建你的上课天数,以查看这个组合跨越了多少天。所以迭代每个排列
  • 对于每个排列,创建一个类列表,称之为“ClassDay”,然后仅当总小时数低于您的阈值(5小时)时,才按照排列给出的顺序将您的类添加到列表中
  • 如果您试图添加的类会使总时间超过5小时,请将
    ClassDay
    存储在另一个
    列表中(非常重要),开始一个新的
    ClassDay
    ,并使用相同的逻辑不断添加(最多5小时),直到您将所有类放入最多5小时的
    ClassDay
  • 最后检查每个排列创建了多少个
    ClassDay
    。除了6
    ClassDay
    之外,对于一个组合不好的排列,你还有其他的选择。只有那些正好有6个
    ClassDay
    的组合才是有效的组合

如果课程可以分成不同的时间段,比如2小时可以得到2乘以1小时,那么你需要将所有课程分成可能最小的时间段。然后,你需要一个最后的通行证来合并一天中按顺序排列的所有课程,因此,如果3 x 1小时的Matematika互相跟随,你就可以将它们重新组合为3小时中的1小时。

奇怪的是(巧合的是),这正是老师想让你自己弄明白的一点,你的意思是什么?什么样的老师?这是家庭作业吗?不。这是我项目的一部分。你的问题是,解决那个问题。也许你在做的时候也会遇到停顿的问题。我只是想知道如何产生这个。例如,使用123,我可以生成12313221323132131312。是否有任何公式可以生成此结果?是的,请查看我提供给
MoreLinq
permutation的链接。正是这样