Python 在政治模拟中优化选举人投票。。。200000+;可能性,如何贯穿其中?
所以基本上,在我的政府课上,我们在模拟总统选举。我们的成绩来自候选人的陈述,但作为一个额外的挑战,我们的老师有一个连续的选举人票计数。其工作原理如下:Python 在政治模拟中优化选举人投票。。。200000+;可能性,如何贯穿其中?,python,excel,algorithm,sorting,Python,Excel,Algorithm,Sorting,所以基本上,在我的政府课上,我们在模拟总统选举。我们的成绩来自候选人的陈述,但作为一个额外的挑战,我们的老师有一个连续的选举人票计数。其工作原理如下: 只有18个州,总共有286名代表,因此需要144名代表才能获胜 候选人在某些州获得+1“影响力”(例如家乡州或他们受欢迎的地方)和-1,副总裁候选人也是如此 一些州(加利福尼亚州和德克萨斯州)预先存在多达2个“影响” 你需要从14个问题中选择4个你反对的问题和4个你赞成的问题。每个州都有他们反对或支持的问题。正如所料,与某个州达成一致会使你在该州
TL;DR:政治模拟,在200000多个可能性中,必须找到要讨论的问题的最佳组合,我如何处理它们?使用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
函数首先从14个问题中选择8个问题,候选人将支持或反对
接下来,我们选择8个候选人中的哪4个“适合”。然后,剩下的4个问题将是“反对”问题:
用于itertools中的候选问题。组合(问题8):
对于itertools.组合中的问题(候选问题,4):
针对问题=列表(集合(候选问题)-集合(针对问题))
#
开始听起来很复杂,但问题应该有一个简单的解决方案。这不应以开始时的组合为基础
您应该能够轻松计算在整个场景中选择单个位置的最终结果。让我们先不选择任何内容,只根据偏差计算分数。您将获得基本分数
然后一个接一个地选择问题,测试站在任何一方的结果是什么。您应该得到28个结果(14个问题中每个问题有2个代表),为了计算这个结果,您的循环将迭代28个案例*18个状态=504次。您将获得一个分数表问题立场分数
,为了保持简单,最好假设它是一维的,存储键值对,0-13键代表14个问题的积极立场,14-27键代表消极立场
然后按得分值降序排序issue stand scores
,选择0-13范围内的前4个关键点和14-27范围内的前4个关键点将得到最大得分,这将是所选顶部关键点处issue stand scores
的特定值加上基本得分的总和。排序需要28*log28=28*5=140次比较
现在有一种可能性,在排序后,人们意识到情况是灵活的,例如,0-13范围内的前3个键各给你3分,然后该范围内的下3个键各给你2分。人们可以利用这种情况来减少处于0或接近摇摆状态的状态数(根据游戏规则为(-/+1))。很明显,你的4个问题都是肯定的,这3个问题各得3分,其中一个问题各得2分
要解决这个问题,您首先必须标记要选择的限制,这样您就可以按值顺序检查第四个关键点的点数,并继续查看第五个、第六个,等等,只要它们具有相同的点数。一旦你到了那里,你可以做一些组合循环,检查所有的正变量和所有的负变量,并存储“摆动状态”的数量。这就是在最简单且无效的实现中,假设您能够从一半的正面和一半的负面中进行选择,则会进入组合(7中的4个)*组合(7中的4个)=35*35=1225。现在它将再次在所有州循环,所以*18=22050
因此,通过计算零问题情况下的分数,然后分别计算每个问题的分数,然后根据分数对其进行排序,并对数量有限的项目应用组合蛮力方法,您可以得到大约644次“迭代”,以获得最佳分数,并使用组合法找到最小摆动情况,你有大约22694次手术
即使使用excel公式,为基本分数和单个问题编写实际解决方案也应该足够简单-只需为每个问题设置两列,并计算每个状态的问题影响,然后将其合计。这将为您提供分数,您可以手动“排序”t
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>