目录
- 前言
- 一、问题提出
- 二、汉密尔顿方法
- 三、方法实现:
- 四、具体问题分析并解决:
- 总结
前言
简要介绍哈密尔顿
哈密尔顿自幼聪明,被称为神童。他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 = sourceself.seatAmount = amountdef getAssignment(self):data = self.sourceamount = self.seatAmountdecimalFraction = []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 seatdef 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)
总结
今天分享数学建模的内容就没有了,呜呜呜,主要是想要记载一下学习经历与心得,希望能给大家有所帮助,还是一个小白,如有不对的地方,希望各位多多包涵并反馈给我,大家一起进步。