Python 在政治模拟中优化选举人投票。。。200000+;可能性,如何贯穿其中?

Python 在政治模拟中优化选举人投票。。。200000+;可能性,如何贯穿其中?,python,excel,algorithm,sorting,Python,Excel,Algorithm,Sorting,所以基本上,在我的政府课上,我们在模拟总统选举。我们的成绩来自候选人的陈述,但作为一个额外的挑战,我们的老师有一个连续的选举人票计数。其工作原理如下: 只有18个州,总共有286名代表,因此需要144名代表才能获胜 候选人在某些州获得+1“影响力”(例如家乡州或他们受欢迎的地方)和-1,副总裁候选人也是如此 一些州(加利福尼亚州和德克萨斯州)预先存在多达2个“影响” 你需要从14个问题中选择4个你反对的问题和4个你赞成的问题。每个州都有他们反对或支持的问题。正如所料,与某个州达成一致会使你在该州

所以基本上,在我的政府课上,我们在模拟总统选举。我们的成绩来自候选人的陈述,但作为一个额外的挑战,我们的老师有一个连续的选举人票计数。其工作原理如下:

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

  • 候选人在某些州获得+1“影响力”(例如家乡州或他们受欢迎的地方)和-1,副总裁候选人也是如此

  • 一些州(加利福尼亚州和德克萨斯州)预先存在多达2个“影响”

  • 你需要从14个问题中选择4个你反对的问题和4个你赞成的问题。每个州都有他们反对或支持的问题。正如所料,与某个州达成一致会使你在该州获得+1,而不一致会使你获得-1

  • 如果你在这个州有更大的影响力,你就会赢得它。如果票数为0,则由大众投票(班级)决定)

  • 我试图在不需要获得大众选票的情况下锁定提名,我正在试图找出我可以使用什么软件来实现这一点。我基本了解excel和python 3,但我想知道是否还有其他方法可以做到这一点

    这是我所说的形象(正如你所看到的,我在这里扮演共和党人)。此外,“赞成”和“反对”位置公式链接到。现在,如果我需要选择4个问题来支持和反对,我认为这是14选择4乘以10选择4,这给了我210210个可能的组合。有没有办法浏览所有这些,看看哪一个能让我获得最高的净选举票数和最低的接近系数?显然,我还不知道我的对手的话题,但我希望有最大的误差,以防止他们翻转状态

    谢谢你的帮助。提示、建议或评论


    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>