小神童·哈密尔顿解决分配问题

目录

  • 前言
  • 一、问题提出
  • 二、汉密尔顿方法
  • 三、方法实现:
  • 四、具体问题分析并解决:
  • 总结


前言

简要介绍哈密尔顿

哈密尔顿自幼聪明,被称为神童。他15岁开始对数学产生浓厚的兴趣。在对复数长期研究的基础上,他于1843年正式提出四元数这一概念,是代数学中的一项重要成果。此外,他还在矩阵理论中提出了哈密尔顿-凯莱定理。

一、问题提出

数学问题:设美国一共有 s 个州,众议院一共设有 h 个议员席位。设第 i 州的人口为pi(i =1,2, . . . , s),则全国总人口有 P = p1 + p2 + ⋯ + ps,第 i 州的人口占全国总人口的比例为pi/p。
按照人口比例原则,如何分配各州的议员名额?
设第 i 州应有qi = h ∗pi/P(i = 1,2, . . . , s)个议员“份额”,则显然有h = q1 + q2 + ⋯ + qs 且qi有可能不是整数,那怎么取qi?

二、汉密尔顿方法

第一步:取各州的份额qi的整数部分 qi (如qi = 1.5, qi = 1;qi = 0.82, qi = 0),先让第 i州拥有 qi 个议员名额。
第二部:再看各州份额qi的小数部分。按从大到小的顺序,把余下的议员名额逐个分配给各
相应的州,分完为止。具体做法是:小数部分(qi − qi )最大的州优先取得余下名额

三、方法实现:

以下代码以Python为例

class Hamilton:
    def __init__(self, source: list, amount: int):
        self.source = source
        self.seatAmount = amount

    def getAssignment(self):
        data = self.source
        amount = self.seatAmount
        decimalFraction = []
        sumsource = sum(data)
        integer = [int(amount*(x/sumsource)) for x in data]#得到整数部分
        seat = [x for x in integer]#安排整数席位
        remAmount = amount - sum(integer)
        for i in range(len(data)):
            decimalFraction.append((data[i] / sumsource - integer[i],i))#得到小数部分
        decimalFraction.sort(reverse=True, key=lambda x: x[0])#依据小数大小进行降序排序
        for i in range(remAmount):
            seat[decimalFraction[i][1]] += 1#进行小数席位分配
        return seat
    def setAmount(self, amount: int):#用于更改席位
        self.seatAmount = amount

四、具体问题分析并解决:

现有五方人数分别为5117,4400,162,161,和160.使用哈密尔顿方法进行分配100个席位,并返回各方所占席位数

  hamilton=Hamilton([5117,4400,162,161,160],100)
  res = hamilton.getAssignment()
  print(res)

总结

今天分享数学建模的内容就没有了,呜呜呜,主要是想要记载一下学习经历与心得,希望能给大家有所帮助,还是一个小白,如有不对的地方,希望各位多多包涵并反馈给我,大家一起进步。

你可能感兴趣的:(数学模型,python,学习)