我应该使用什么类型的算法?

时间:2016-09-20 22:11:07

标签: c# algorithm machine-learning artificial-intelligence

所以我希望解决下面提到的问题,我遇到了问题以及实际需要注意什么,因为我无法用简单的术语来描述问题。我希望有人能够对正确的算法或解决它的路径有所了解。

问题(简​​化):

所以我想说我有一个多人对象。

Person1
Person2
Person3

现在我要说我有6个插槽

Slot1
Slot2
Slot3
Slot4
Slot5
Slot6

每个人都有与之相关的规则,例如

  • Person1不能使用奇数的槽,必须为3 不同的插槽。
  • Person2只能从2开始进入插槽,必须在2个插槽中
  • Person3只能进入1个素数位。

所以我们最终得到了

 Slot1 - Person3
 Slot2 - Person1
 Slot3 - Person2
 Slot4 - Person1
 Slot5 - Person2
 Slot6 - Person1

我知道这将需要使用A.I /机器学习,我已经对该领域进行了一些研究,但我找不到我应该使用什么算法来解决问题,甚至如何搜索这个问题。我发现以某种方式做到这一点的唯一方法是通过回归树,但在我看来,这样的方式似乎是错误的路径。

注意:我将使用c#来解决这个问题,并希望有一些像Encog。

这样的框架

3 个答案:

答案 0 :(得分:2)

实际上我认为您可以使用Maximum Matching通过简单的修改来解决此问题。在标准最大匹配中,每个节点仅与另一个节点匹配,但此处Person可以具有多个匹配。通过创建Person的多个实例,您可以将此问题减少到最大匹配。例如:

  

Person1不能使用奇数的插槽,必须在3中   不同的插槽。

为Person1创建3个节点,并将它们连接到偶数位。

  

第2个人只能从2开始进入插槽,必须在2个插槽中

创建Person2的2个节点,并将它们连接到数字大于2的插槽。

  

第3个人只能进入1个素数位。

为Person3创建1个节点,并将其连接到slot1,slot2,slot3和slot5。

在结果图表上执行最大匹配,您将找到答案。

答案 1 :(得分:1)

实际上这个问题是标准的离散优化问题。您可能需要查看coursera discrete optimization course。 在第一周,它有一个名为 Simple Puzzles 的研讨会。它给你的问题带来了类似的问题,并展示了如何在他们的平台迷你锌中解决它。

在您了解了此类问题的解决方法后,您可能需要查看来自List of optimization software的c#解决方案。

答案 2 :(得分:0)

Person和Slot之间的配对是一个调度问题,需要知识来解决它。知识在规则中描述,例如" Person1不能使用具有奇数的槽并且必须在3个不同的槽中。"解决问题的算法使用规则和给定的资源(三个人和六个时隙)来生成所有可能的解决方案。 Computerscience的任务是将知识形式化为机器可读代码。那里有许多编程语言,例如PDDL,Prolog或面向对象的语言。在经典" AI规划和调度"在ICAPS会议上讨论的PDDL语言将是知识建模的首选。解决给定域的算法本身在大多数情况下是回溯,蒙特卡罗树搜索或简单的暴力。这被称为"问题解决为搜索"。