2015-12-07 175 views
2

我有一个学校项目,我必须根据用餐偏好采取人员和座位。例如,假设我有以下人员:对Prolog中的列表进行排序

鲍勃:喜欢的食物A,B,C,d,E

卡罗尔:喜欢的食物B,E,d,C,A

罗纳德:喜欢的食物E,A,C,B,d

斯泰西:喜欢的食物A,E,B,d,C

食物的顺序对应自己的喜好,第一食品是他们最喜欢的,最后被最小。理想的顺序是鲍勃,斯泰西,卡罗尔,罗纳德。它将分享最喜欢的食物的人和按照喜好按字母顺序排列的人坐在一起。

我的解决方法是将字母A-E分配给1-5。从那里,我想建立一个列表,其中包含与食物相对应的数字。从那里我将根据逻辑来对列表进行排序,比较每个子列表的第一个元素,并且如果它们相同,则比较第二个和第二个元素。

虽然我在建立列表主列表时遇到困难。我会如何去做这件事?还是有更好的方法来解决这个问题?

回答

2

当您谈论CS中的排序时,游戏中的数学主题是总订购。关于整个订购的一个重要的事情是,它是可传递,我的胃里有一个关于你的描述的团体,也许这不是一个完整的订购。毕竟,假设我们有四个人:爱丽丝,鲍勃,辛迪和戴夫。 Alice的食物偏好可能是A,B,C,D和Bob的B,C,D,A和Cindy的C,D,A,B和Dave的D,A,B,C。虽然很明显,爱丽丝和辛迪距离彼此较远,但在将爱丽丝与鲍勃或戴夫配对之间没有明显的方法。所有四个人都有同样的问题:他们总是有两个人同样接近。该算法是否生成Alice & Bob和Cindy & Dave或Dave & Alice和Bob & Cindy? (顺便说一句,同样的问题出现在投票系统的相同原因,这是缺少Condorcet winner。)

现在,Prolog的好处是你可以想出一个算法,产生多个解决方案。因此,在这种情况下,它会生成两种解决方案:一种是Alice Alice & Bob,另一种Alice Alice & Dave。但是一个列表只能按照某种标准进行排序,所以它不会觉得排序主列表将成为其中的一部分。我觉得,因为通常会有多种解决方案,您可能没有正确的方法。而使用Prolog的正确版本可能是将列表中的第一个人递归地找到次最佳匹配。假设你的代码是正确的,如果有两个具有相同的“距离”,你应该产生两个。

编辑:顺便说一句,我想到了另一个例子:sorting color