在 Prolog 中对列表列表进行排序
Sorting a list of lists in Prolog
我有一个学校项目,我必须带人并根据用餐偏好安排他们的座位。例如,假设我有以下人员:
鲍勃:喜欢食物 A、B、C、D、E
卡罗尔:喜欢食物 B、E、D、C、A
罗纳德:喜欢食物 E、A、C、B、D
Stacy:喜欢食物 A、E、B、D、C
食物的顺序符合他们的喜好,第一个食物是他们最喜欢的,最后一个是最不喜欢的。理想的顺序是 Bob、Stacy、Carol、Ronald。它将分享最喜欢的食物的人配对,并根据喜好按字母顺序安排其余的人。
我解决这个问题的方法是将字母 A-E 分配给数字 1-5。从那里,我想建立一个列表列表,其中包含与食物对应的数字。从那里我将根据比较每个子列表的第一个元素的逻辑对列表进行排序,如果它们相同则比较第二个等等元素。
不过,我在构建列表的主列表时遇到了困难。我该怎么做呢?或者有更好的方法解决这个问题吗?
当你在 CS 中谈论排序时,正在讨论的数学话题是 总排序。关于总排序的一件重要事情是它是可传递的,我对你的描述感到不安,也许这不是总排序。毕竟,假设我们有四个人:Alice、Bob、Cindy 和 Dave。 Alice 的食物偏好可能是 A、B、C、D 和 Bob 的 B、C、D、A 和 Cindy 的 C、D、A、B 和 Dave 的 D、A、B、C。虽然很明显 Alice 和 Cindy 彼此距离较远,但没有明显的方法可以选择将 Alice 与 Bob 或 Dave 配对。而四个人都有一个共同的问题:总是有两个人,他们是同等亲近的。该算法生成 Alice&Bob 和 Cindy&Dave 还是 Dave&Alice 和 Bob&Cindy? (顺便说一下,在投票系统中出于同样的原因会出现同样的问题;这是缺少 Condorcet winner。)
现在,Prolog 的好处是您可以想出一个生成多个解决方案的算法。所以在这种情况下,它会生成两种解决方案:一种是 Alice&Bob,另一种是 Alice&Dave。但是列表只能根据某种标准以一种方式排序,因此感觉排序主列表不会成为其中的一部分。我觉得,因为通常会有多种解决方案,您可能没有正确的方法。而使用 Prolog 的正确方法可能是取列表中的第一个人并递归地找到下一个最佳匹配。假设你编码正确,如果有两个具有相同的 "distance" 你应该生成两个。
编辑:顺便想到另一个例子:sorting color.
我有一个学校项目,我必须带人并根据用餐偏好安排他们的座位。例如,假设我有以下人员:
鲍勃:喜欢食物 A、B、C、D、E
卡罗尔:喜欢食物 B、E、D、C、A
罗纳德:喜欢食物 E、A、C、B、D
Stacy:喜欢食物 A、E、B、D、C
食物的顺序符合他们的喜好,第一个食物是他们最喜欢的,最后一个是最不喜欢的。理想的顺序是 Bob、Stacy、Carol、Ronald。它将分享最喜欢的食物的人配对,并根据喜好按字母顺序安排其余的人。
我解决这个问题的方法是将字母 A-E 分配给数字 1-5。从那里,我想建立一个列表列表,其中包含与食物对应的数字。从那里我将根据比较每个子列表的第一个元素的逻辑对列表进行排序,如果它们相同则比较第二个等等元素。
不过,我在构建列表的主列表时遇到了困难。我该怎么做呢?或者有更好的方法解决这个问题吗?
当你在 CS 中谈论排序时,正在讨论的数学话题是 总排序。关于总排序的一件重要事情是它是可传递的,我对你的描述感到不安,也许这不是总排序。毕竟,假设我们有四个人:Alice、Bob、Cindy 和 Dave。 Alice 的食物偏好可能是 A、B、C、D 和 Bob 的 B、C、D、A 和 Cindy 的 C、D、A、B 和 Dave 的 D、A、B、C。虽然很明显 Alice 和 Cindy 彼此距离较远,但没有明显的方法可以选择将 Alice 与 Bob 或 Dave 配对。而四个人都有一个共同的问题:总是有两个人,他们是同等亲近的。该算法生成 Alice&Bob 和 Cindy&Dave 还是 Dave&Alice 和 Bob&Cindy? (顺便说一下,在投票系统中出于同样的原因会出现同样的问题;这是缺少 Condorcet winner。)
现在,Prolog 的好处是您可以想出一个生成多个解决方案的算法。所以在这种情况下,它会生成两种解决方案:一种是 Alice&Bob,另一种是 Alice&Dave。但是列表只能根据某种标准以一种方式排序,因此感觉排序主列表不会成为其中的一部分。我觉得,因为通常会有多种解决方案,您可能没有正确的方法。而使用 Prolog 的正确方法可能是取列表中的第一个人并递归地找到下一个最佳匹配。假设你编码正确,如果有两个具有相同的 "distance" 你应该生成两个。
编辑:顺便想到另一个例子:sorting color.