什么是接近以下调度任务的正确方法

时间:2011-10-18 13:31:36

标签: scheduling grouping rules

我正在考虑以下调度问题:

  1. 我有X人。
  2. 我有Y个会议位置,每个会议都有Z个会议角色。
  3. 对于某些角色,同一个人可以在一次会议中合并其中两个,但大多数是一个人=一个角色。
  4. 对于x中的每个人X,我都知道有关它们的一系列事实: a)他们参加会议的最后日期并具有特定的作用(历史); b)y中任何会议Y的可用性; c)他们对z中的角色Z或会议组的一组角色(无特定日期)的特定偏好。
  5. 我想构建一个具有以下目标的调度程序: a)填写所有会议角色。 b)如果可能,容纳偏好; c)人员/角色的分配应该是统一的(即,如果一个人安排在每次会议上,而另一个人只是偶尔安排一次会议 - 这是不可接受的;如果一个人被安排在同一个角色上,过去和过来再次 - 这是不可接受的)。
  6. 现在,我有一种直觉,认为任务并不容易:),所以我的具体问题是:

    1. 哪种语言更适合这项任务(不知何故我觉得Prolog可以处理它,但我不完全确定)。

    2. 解决这项任务的正确方法是什么?我可以在上面的#4中达到目标的接近程度?

    3. 对我想要解决的问题有什么好的解读?

    4. 谢谢!

      P.S。如果你很好奇,那么用例就是为一组Toastmasters会议安排一个名单(example)(我懒得手工做,我希望计算机至少部分帮助我完成这项任务)。

5 个答案:

答案 0 :(得分:1)

从我的观点来看,你要编程的语言并不那么重要:对于简单的问题,使用的语言更多的是个人偏好而不是精确的科学。如果您喜欢/想要学习Python,请使用它。如果你今天“觉得”是Prolog,请使用它。

您选择的因素是您希望如何保存和显示数据。从您的问题可以告诉您需要以下内容:

  • 用于存储可用参与者和角色的数据库(或至少是持久资源),存储每个参与者角色的过去和未来会议,以及安排可用性的某种方式。
  • 显示数据的一些方法(命令行,GUI或网站)。
  • 描述角色分配方式,出勤标准等的一些业务逻辑。

您需要使用某些第三方组件,因为您需要花费时间来增加产品的附加值;创建一个闪亮的ORM或GUI工具包不是你的目标。因此,您选择的编程语言应该对这些项目有适当的支持(尤其是前两项)。我不能为Prolog说出来,但Python会让你完全涵盖这些领域。我认为建议特定的工具包超出了这个问题的范围,所以我现在就把它留在那里。

在此步骤之后,您将分析您的问题,您似乎已经做得非常好。所以,开始实施它。为了能够验证您的特定用例,听起来您可能会受益于某些测试或行为驱动设计,因此您可能希望了解它。

要学习该语言,只需搜索StackOverflow的“[语言]教程”:已经有很多答案链接到非常好的资源,可以选择任何语言。

最后建议:坚持不懈是最难的部分,所以尽量为自己设定一些目标或里程碑,或尝试以某种方式让其他人参与其中。这样你就可以扩大创建一个很好的软件的可能性。

答案 1 :(得分:1)

规则引擎(如 Drools Expert Prolog )适用于定义约束(=得分函数)。然而,找到最佳解决方案是非常糟糕的。

由于您的问题可能是 NP完成(特别是如果会议需要被放入时间段和/或1个人不能同时参加2次会议),您需要使用一种规划优化算法,例如构造启发式和元启发式算法。在 Drools Planner (java,开源,ASL)中查看课程课程示例。

答案 2 :(得分:0)

  1. 即使我是Python粉丝,我也很难建议Prolog完成这项任务。我对Prolog很熟悉,而且Prolog肯定能更好地解决它。但这取决于你将如何使用该程序。您的选择 - 决定是否更容易安装Python或Prolog(如果您只是在本地PC上运行,我认为这并不重要),或者您有其他要求。

  2. 如果你了解Prolog的话,Prolog很简单。在你学习了Prolog之后,你可以用一些思考来解决它,我猜想(如果你真的了解Prolog的话)。

  3. 基本上你应该从Prolog开始。我建议使用SWI-Prolog,它是最常用的Prolog实现之一。此外,还有一个很好的教程:http://www.learnprolognow.org/

  4. 在我看来,但我不是百分百肯定,你还不熟悉Prolog。您需要时间首先学习Prolog,因此它还取决于您需要多快的程序。据我记忆,在不到一个月的时间内完成教程是可能的。当然,这几乎不取决于你每天投入多少时间 - 你可以在更短或更长的时间内完成。

    Prolog基于规则。您的每个要求都可以表达为规则。拥有一套规则后,您可以询问(人员和会议室)哪些组合符合所有规则。对于不同人员的历史数据,您可以使用一个小型数据库。

答案 3 :(得分:0)

我同意为此任务建议Prolog的人;我建议看看 在ECLiPSe(它除了是Prolog实现之外,还是一个约束编程 具有比Prolog更强大的问题解决能力的语言)。 ECLiPSe现在有一个非常好的介绍,有许多例子,非常重要的是, 免费pdf,由Antoni Niederlinski撰写:

http://www.anclp.pl/

在ECLiPSe网站的示例中,我发现以下内容似乎相关:http://eclipseclp.org/examples/roster.ecl.txt

ECLiPSe已完整记录,根据此文档, 也可以与C ++ / Java集成。

答案 4 :(得分:0)

这听起来像是一个优化问题,我同意Geoffrey认为这将是NP完全问题。我最近为一所大学开发了一种调度算法,用于进行期末考试安排。我使用具有领域特定启发式的遗传算法来解决该问题。我的实施表现很好,学生人数为3000+,课程数量为500,花了大约2个小时才能找到近乎理想的解决方案。