在政治模拟中优化选举投票... 200,000多种可能性,如何贯穿它们?

时间:2017-08-27 18:46:37

标签: python excel algorithm sorting

基本上,在我的政府课堂上,我们正在模拟总统选举。我们的成绩来自于我们的候选人的介绍,但作为一个额外的挑战,我们的老师已经获得了选举人票。它的工作原理是这样的:

  1. 只有18个州,共有286名代表,因此需要144名才能获胜

  2. 候选人在某些州(例如家乡或他们受欢迎的地方)获得+1'影响力'和-1,VP候选人也是如此。

  3. 某些州(CA和TX)预先存在最多2个“影响”。

  4. 你需要从14个清单中选择4个你反对的问题和4个问题。每个州都有一个他们反对的问题。正如预期的那样,如果你同意状态网,那么你在该状态下的+1并且分歧会让你感到高兴。

  5. 如果你在州内有更多影响力,你就赢了。如果它被绑定为0,那么普选票(该类)将决定)

  6. 我试图锁定提名,甚至不需要获得普选票,而我正试图弄清楚我可以用什么软件来做这件事。我知道excel和python 3在基本级别,但我想知道是否还有其他方法可以做到。

    Here是我正在谈论的形象(正如你所看到的,我在这里扮演的是共和党人)。此外,for和against位置公式链接到here。现在,如果我需要选择4个问题来支持和反对,我认为14选择4次10选4,这给了我210,210种可能的组合。有没有办法贯穿所有这些,看看哪个会给我最高的净选举投票数和最低的亲密度?显然,我还不知道我的对手主题,但我希望有最大的误差可以防止他们翻转状态。

    感谢您的帮助。提示,建议或意见!

    TL; DR:政治模拟,必须找到最佳可能的问题组合来讨论200,000多种可能性,我如何贯穿它们?

3 个答案:

答案 0 :(得分:1)

使用Python,有几种方法可以设置此搜索。我喜欢itertools库,它包含了方便地迭代事物组合的函数。

导入并设置问题列表:

import itertools

issues = [
    "Issue #1", "Issue #2", "Issue #3", "Issue #4", "Issue #5",
    "Issue #6", "Issue #7", "Issue #8", "Issue #9", "Issue #10",
    "Issue #11", "Issue #12", "Issue #13", "Issue #14"
]

现在,我们可以使用itertools.combinations函数首先选择候选人中的8个问题,不论是赞成还是反对。

接下来,我们选择8位候选人中的哪4位“为”。然后,剩下的4个问题将是“反对”问题:

for candidate_issues in itertools.combinations(issues, 8):
    for for_issues in itertools.combinations(candidate_issues, 4):
        against_issues = list(set(candidate_issues) - set(for_issues))
        # <your code here using for_issues and against_issues>

答案 1 :(得分:0)

起初听起来很复杂,但问题应该是一个简单的解决方案。这不应该基于组合开始。

您应该能够轻松计算在整个场景中选择单个位置的最终结果。让我们从选择任何内容开始,仅根据偏差计算得分。您将获得/* In this example, all p elements will be red, except for the first child and the ones with the class special. */ p:not(:first-child, .special) { color: red; }

然后逐一选择问题并测试站在两边的结果是什么。你应该得到28个结果(14个问题中的每一个有2个代表)并计算这个你的循环将迭代28个案例* 18个州= 504次。你会得到一个得分base-score的表,并保持简单,假设它是一维的,存储键值对,键0-13代表关于14个问题的正面看法,而键14​​-27为负数代表。

然后按评分值降序issue-stand-scores并选择范围0-13中的前4个键和范围14-27中的前4个键将给出最大分数,这将是来自{的特定值的总和。 {1}}在所选的顶部键加上issue-stand-scores。排序需要28 * log 28 = 28 * 5 = 140比较。

现在有可能在排序之后意识到情况是灵活的,例如0-13范围内的前3个键每个给你3个点,然后该范围内有接下来的3个键,每个给你2个点。可以使用这种情况来最小化状态的数量,这些状态为0或接近摆动( - / + 1由你的游戏规则)。显然你的4个问题是积极的,将包括这3个例子,每个给你3分,其中3个给你2分。

要解决这个问题,首先必须标记您的限制以供选择,因此您将按价值顺序检查第4个键的点数,并继续查看第5个,第6个,依此类推,只要它们有相同的点值。一旦你在那里,你可以做一些组合循环,检查所有正变量和所有负变量,并存储“摇摆状态”的数量。这是最简单和无效的实现,假设你可以选择一半的正数和一半的负数,它去组合(7个中的4个)*组合(7个中的4个)= 35 * 35 = 1225.现在它将再次循环遍历所有状态,因此* 18 = 22050。

因此,通过计算零问题情况的分数,然后针对每个问题单独计算,然后按分数对它们进行排序并对明智有限数量的项目应用组合暴力方法,您只需获得644次“迭代”以获得最佳效果得分,并通过组合找到最小摆动场景,你得到大约22694次操作。

为基本分数和单个问题编写实际解决方案应该很简单,即使使用excel公式 - 只需为每个问题设置两列并计算每个州的问题影响,然后将它们全部计算出来。这将为您提供分数,您可以手动“排序”以选择最佳分数。为了进行组合方法,我建议使用一些真正的编程语言。

答案 2 :(得分:0)

我认为,如果你能有效地解决(概括),你可以有效地解决https://en.wikipedia.org/wiki/Set_cover_problem,这是不可能的。

典型的集合封面问题询问是否存在大小为k或更小的子集的集合,其包括更大集合的所有成员。鉴于这样的问题,让较大的成员成为个别国家。添加许多其他状态,你可以永远克服的偏见,这样你只能通过赢得第一批状态获得多数。现在设置问题,以便考虑的每个子集都成为问题,并且该子集的成员是如果您选择该问题将赢得的状态。我认为你可以组织这个,以便有一个大小为k或更小的子集的集合,当k个问题或更少时,如果你对它们进行竞选,那么它将完全覆盖更大的集合。 (如果你担心&#34;或更少&#34;只需创建无人问津的k个问题。)