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


前言

简要介绍哈密尔顿

哈密尔顿自幼聪明,被称为神童。他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)

总结

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

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值