数模(1):公平分配问题

某学院有3个系共200名学生,其中甲系103人,乙系63人,丙系34人,分配20个院学生会主席团席位,如何分配才公平?如果分配21个,该如何分配呢?

1.将按比例取整损失作为目标函数

最先想到的方法就是按比例分配。甲、乙、丙三系人数分别占总学生数的51.5%、31.5%、17%。

在分配20个学生会主席团席位时,分到的人数应分别是10.3、6.3、3.4。因为人数不能是小数,将人数向下取整,则分到的人数分别是10、6、3,这时候还余下一个席位,将这个席位分给在向下取整过程中损失最多的丙。最终分配结果为10、6、4。

在分配21个学生会主席团席位时,分到的人数应分别是10.815、6.615、3.57。因为人数不能是小数,将人数向下取整,则分到的人数分别是10、6、3,这时候还余下两个席位,将这个席位分给在向下取整过程中损失最多的两个系,也就是甲和乙。最终分配结果为11、7、3。

我们会发现,学生会主席团的席位变多之后,丙系分配到的席位数反而减少了。可见,将按比例取整损失作为目标函数并非是最佳的方案

2.通过代表学生数求出目标函数

我们知道一个主席团中来自不同系的成员分别代表了自己系的利益。主席团中来自本系的成员越少,本系的学生越多,主席团中一个成员需要代表的学生就越多,对这个系来说就越不公平,这也是我们在直观上选择按比例分配的最基本原因。如果我们贯彻这个初衷,将一个成员代表学生数作为我们的目标函数,将取整过程中多出的席位分配给目标函数值高的系,可以更公平地解决这个问题。

设总学生数为N,总共有I个系,每个系的学生数为N_i(i=1,2,...,I),学生会主席团席位为n个,则每个系应当分到的席位数为\frac{N_i}{N}·n,设这个值为a_i,则每个席位代表的学生数为f_i=\frac{N_i}{a_i}。对a_i向下取整,并将N_ia_i表示,得f_i=\frac{\frac{N}{n}·a_i}{[a_i]},用{a_i}表示a_i的小数部分,则有f_i=\frac{\frac{N}{n}·[a_i]+\frac{N}{n}·\{a_i\}}{[a_i]}=\frac{N}{n}·(1+\frac{\{a_i\}}{[a_i]})。易知这个目标函数的值只与\frac{\{a_i\}}{[a_i]}有关。进行按比例向下取整分配后,多出来的席位(假设有m个)应当被平均分配给该目标函数值前m高的系。

用python实现以上算法,输入系的个数、每个系的人数、学生会的名额,给出每个系的a值、f值和分配方案:

import numpy as np

I=int(input())
lis=[]
for i in range(0,I):
    lis.append(int(input()))
arr=np.array(lis)
n=int(input())
per=(arr/np.sum(arr)).astype(np.float_)
arg=n*per
print(arg)
f=np.sum(arr)/n*(1+(arg-np.floor(arg))/np.floor(arg))
print(f)
ord=np.argsort(f)
m=int(n-np.sum(np.floor(arg)))
arg=np.floor(arg)
for i in range(0,m):
    arg[ord[-i-1]]+=1
print(arg)

输入3、103、63、34、20时,输出结果为:


在这里插入图片描述

输入3、103、63、34、21时,输出结果为:


在这里插入图片描述

3.Q值法

依旧还是基于平均每席位代表学生数来衡量公平性。对于空余的席位,我们将它们一个个依次分配给每个系,则对于分配到新席位的系,假设其人数为N_i,原本的席位数为n_i,它的平均每席位代表学生数a_i就会由\frac{N_i}{n_i}变成\frac{N_i}{n_i+1}

我们知道公平是相互参考的,现在用Q值来衡量两个系之间相互参考下不公平的程度。设有两系i系和j系,如果a_i>a_j,则分配方案对i系不公平,其相对不公平程度为\frac{a_i-a_j}{a_j}。如果a_i<a_j,则分配方案对j系不公平,其相对不公平程度为\frac{a_j-a_i}{a_i}。每多分配一个席位,这个相对不公平程度就会改变。我们可以分别计算把席位分配给两个系后的相对不公平程度,取两者中结果较小的方案。

  1. 如果把席位分配给i系后a_i>a_j,则分配后依然对i系不公平,分配肯定成立
  2. 如果把席位分配给i系后a_i<a_j,则分配后对j系不公平。不公平程度为\frac{\frac{N_j}{n_j}-\frac{N_i}{n_i+1}}{\frac{N_i}{n_i+1}}
  3. 如果把席位分配给j系后a_i>a_j,则分配后对i系不公平。不公平程度为\frac{\frac{N_i}{n_i}-\frac{N_j}{n_j+1}}{\frac{N_j}{n_j+1}}
  4. 如果把席位分配给j系后a_i<a_j,则分配后依然对j系不公平,分配肯定成立

事实上我们只需讨论2、3两种情况。我们假设把席位分配给i系的不公平程度低于把席位分配给j系,有\frac{\frac{N_j}{n_j}-\frac{N_i}{n_i+1}}{\frac{N_i}{n_i+1}}<\frac{\frac{N_i}{n_i}-\frac{N_j}{n_j+1}}{\frac{N_j}{n_j+1}},也就是\frac{N_j(n_i+1)}{n_jN_i}<\frac{N_i(n_j+1)}{n_iN_j},即\frac{n_i(n_i+1)}{N_i^2}<\frac{n_j(n_j+1)}{N_j^2},这样我们获得了只与一个系自己的已有席位和总人数有关的评判因子,称\frac{n_i(n_i+1)}{N_i^2}为i系的Q值,计算每一个系的Q值,假设剩余m个席位,则将这些席位分配给Q值前m小的系。

用python实现以上算法,输入系的个数、每个系的人数、学生会的名额,给出每个系的Q值和分配方案:

import numpy as np

def cal(Ni,ni,Nj,nj):
    if Ni/ni>Nj/nj:
        return (Ni/ni-Nj/nj)/(Ni/ni)
    else:
        return (Nj/nj-Ni/ni)/(Nj/nj)

I=int(input())
lis=[]
for i in range(0,I):
    lis.append(int(input()))
arr=np.array(lis)
n=int(input())
per=(arr/np.sum(arr)).astype(np.float_)
arg=np.floor(n*per)
Q=arg*(arg+1)/(arr*arr)
print(Q)
m=int(n-np.sum(arg))
ord=np.argsort(Q)
for i in range(0,m):
    arg[ord[i]]+=1
print(arg)

输入3、103、63、34、20时,输出结果为:


在这里插入图片描述

输入3、103、63、34、21时,输出结果为:


在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • 最近一段时间非常困惑迷茫,对自己的职业生涯产去了怀疑,不知道如何去选择,也不知道对错。相信很多人都曾有过和我一样的...
    12570阅读 171评论 0 2
  • 出12:37--51 【12:40】以色列人住在埃及共有四百三十年。正满了四百三十年的那一天,耶和华的军队都从埃及...
    652961c18fcf阅读 618评论 0 0
  • 通常作家在写作时通常会不自主的把自己的性格带入作品的人物中,所以张爱玲写过的小说基本也被这本传记的作者用...
    鳕零kelsey阅读 631评论 0 2