在政治模拟中优化选举人票… 20万以上的可能性,如何贯穿其中?

所以基本上,在我的政府课上,我们正在模拟一场总统选举。 我们的成绩来自我们的候选人的介绍,但作为一个额外的挑战,我们的老师有大量的选票投票。 它是如何工作的是这样的:

  1. 只有18个州达到了286个代表,所以需要144个代表

  2. 候选人在某些州(例如本国或其他地方)受到+1影响,副总裁候选人也是-1。

  3. 一些州(CA和TX)已经预先存在多达2个'影响'的倾向。

  4. 您需要从14个列表中select4个问题和4个问题。每个州都有一个他们反对或者反对的问题。 正如所料,与国家达成一致意见,你在那个国家+1和你的分歧网-1。

  5. 如果你在国家有更多的影响力,你就赢了。 如果它被绑定为0,那么普通投票(这个类)就可以决定)

我试图locking提名,甚至不需要获得stream行的选票,我试图找出我可以使用什么软件来做到这一点。 我知道在基本级别的Excel和Python 3,但我想知道是否有其他方式来做到这一点。

这是我正在谈论的一个形象(你可以看到,我在这里扮演共和党人)。 此外,反对立场公式链接到这里 。 现在,如果我需要select4个问题,我认为是14选4次10选4,这给我210,210个可能的组合。 有没有办法通过所有这些看看哪个会给我最高的净选举表决计数与最低的亲密度因子? 很明显,我还不知道我的对手的话题,但是我想要有最大的错误可能性,以防止他们翻转状态。

谢谢你的帮助。 提示,build议或意见!

TL; DR:政治模拟,必须find可能的最佳组合来讨论20万以上的可能性,我如何贯穿其中?

使用Python,有几种方法来设置这个search。 我喜欢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个问题。

接下来,我们select8个候选人中的哪4个为“for”。 那么剩下的四个问题将是“反对”的问题:

 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> 

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

你应该能够很容易地计算出在整个场景中select一个位置的最终结果。 让我们从没有select任何东西开始,只根据偏差来计算你的分数。 你会得到base-score

然后逐一挑选问题并testing站在任何一方的结果。 你应该得到28个结果(每个14个问题2个),并计算这个循环将迭代28例* 18个状态= 504次。 你会得到一个分数issue-stand-scores表,并保持简单,最好假设它是一维的,存储键值对和键0-13将代表14个问题的正面看法,键14-27负面站立。

然后根据得分值降序sortingissue-stand-scores ,并且select范围0-13中的前4个键和范围14-27中的前4个键将给出最高分数,这将是来自issue-stand-scores分析的具体值的总和,所选顶级键base-score加上base-score 。 sorting需要你28 *日志28 = 28 * 5 = 140的比较。

现在有一种可能性,sorting之一意识到情况是灵活的,例如从0-13范围的前3个键每个给你3分,然后从这个范围有下3个键给你2分。 人们可以使用这种情况来减less0或者接近摆动状态的数量(根据你的游戏规则,减less – / + 1)。 很显然你的4个问题你会积极的在这3个例子给你3分,其中3个给你2分。

为了解决这个问题,你首先必须标记你的限制select,所以你要检查第四个键的点数是多less,只要他们有相同的点,继续看第五,六个等等值。 一旦你在那里,你可以做一些组合循环,检查所有的正面变体和所有负面的变体,并存储“摆动状态”的数量。 这是最简单和无效实施的地方,假设您可以从一半的正数和一半的负数中进行select,它将进入组合(七分之四)*组合(四分之七)= 35 * 35 = 1225.现在这将再次遍历所有的状态,所以* 18 = 22050。

因此,通过计算零问题情况的分数,然后针对每个问题分别进行sorting,然后在明智的有限数量的项目上应用组合式powershell方法,仅获得约644“迭代”即可获得最佳分数。与组合find最小的摆动场景,您可以获得大约22694个操作。

编写基本分数和单个问题的实际解决scheme应该足够简单,即使使用Excel公式 – 只需为每个问题设置两列,然后计算每个状态的问题影响,然后将其总和。 这会给你的分数,你可以手动“sorting”来select最好的。 要做的最重要的组合方法,我会build议一些真正的编程语言。

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

典型的集合覆盖问题询问是否有大小为k或更小的子集的集合,其中包括大集合的所有成员。 鉴于这样一个问题,让更大的集合的成员个别国家。 加上其他一些国家,带有无法克服的偏见,所以只有赢得第一批国家才能获得多数。 现在设置问题,以便每个子集都是一个问题,如果你select了这个问题,那么这个子集的成员将会被赢得。 我认为你可以组织这样做,以便在k个或更less的问题或更less的情况下,有大小为k或更小的子集合覆盖更大的集合,如果您在这些问题上进行竞选,将赢得选举。 (如果你担心“或者更less”,只是创build无人问津的k个虚拟问题)。