【发布时间】:2020-10-23 15:27:14
【问题描述】:
我必须为高中的计算机科学课做作业。几周以来,我一直在尝试编写一个可行的算法,但我的想法已经不多了。
作业:
有 n 个学生有 n 个礼物,所有礼物都有编号。现在每个学生都必须选择他最喜欢的礼物,第二好的或第三好的。然后尽可能将礼物分发给学生。
如果第一次分发中实现的第一愿望的数量高于第二次分发中实现的第一愿望的数量,则该分发优于任何其他分发。如果两个分布的这个数字相同,则满足的第二个愿望的数量决定了哪个分布更好。如果这个数字也相等,则由实现的第三个愿望的数量决定。
我尝试使用二叉树解决这个问题,每次学生希望有相同的礼物时,程序都会模拟第一个学生“排名下降”或第二个学生“排名下降”的情况,直到你不能降级或有一个有价值的分布。之后,比较所有分布并显示最佳分布。此外,如果一个学生不能满足他的任何愿望,他就会得到一份他不想要的礼物。
但是那次尝试失败了,因为我在编写所有这些时遇到了糟糕的情况。
所以我想知道如何尝试使用蛮力算法解决这个问题,因为我无法想象那会是什么样子。
以下是我的算法必须解决的一些“愿望清单”示例(每行是学生,列是第一个愿望、第二个愿望和第三个愿望):
Example 1:
2 10 6
2 7 3
4 7 1
3 4 9
3 7 9
4 3 2
7 6 2
10 2 4
9 8 1
4 9 6
Example 2:
4 6 5
5 4 6
6 4 5
6 4 5
5 4 6
4 6 5
4 5 6
5 4 6
6 5 4
4 5 6
Example 3:
4 2 25
6 14 7
7 12 10
18 7 19
15 4 27
2 18 27
4 10 18
18 7 13
18 15 25
7 11 13
14 15 22
13 14 6
7 1 19
15 7 13
10 13 7
4 8 12
15 1 26
2 7 23
7 4 13
6 10 3
1 16 7
10 7 4
4 15 23
11 4 10
11 13 18
4 7 12
11 10 30
12 13 10
17 12 4
15 7 25
顺便说一句,我真的很想用 python 编写它,如果你们有其他关于如何解决这个问题的想法,我将非常感激。我知道这有很多问题,但我仍然希望这里有人可以帮助我。
非常感谢!
【问题讨论】:
-
这很棘手。如果任何礼物恰好是一个人的首选,那么那个人就会得到它。但如果一份礼物是两个或更多人的第一选择,那么你需要看看他们的第二选择。如果任何人的第二或第三选择是其他人的第一选择,您可以将这些第二或第三选择视为未指定,因为您立即知道他们不会满足。最终,您可能需要进行一些搜索,但您可以先缩小范围。
-
计算机科学中最好的想法通常是重用现有的库和工具来解决这些问题。您陈述的问题是在布尔逻辑和优化领域。这些领域有很多很棒的工具,您只需要描述问题,工具会自动生成解决方案,而无需实现搜索算法。此外,这些工具效率很高,并且优于特定领域的算法。一个候选者是答案集编程(clingo 也有 Python 绑定)。
-
@tphilipp 这是学校的作业。我怀疑使用现有库是否可以接受。
-
@TomKarzes 可以使用现有的库,但前提是它们有助于整个过程,而不仅仅是问题的直接直接解决方案。也感谢大家这么快的回复!