問題:
三個系學生共200名(甲系100,乙系60,丙系40),代表會議共20席,
按比例分配,三個系分別為10,6,4席。
現因學生轉系,三系人數為103, 63, 34, 問20席如何分配。
分析:
如果僅僅使用比例去確定的話會出現一些不可預知的嚴重錯誤【是錯誤不是誤差!】。
每涉及公平問題,就得考慮相對公平。。。。
要解決相對公平問題,就得有乙個度量值去衡量問題是否公平。
而且,此建立的相對公平在資料發生變化的時候是否遵循相對公平原則【也就是變成了乙個規劃問題】。
另外、可以站在對立面、從相對不公平入手!
注釋在**當中
#-*- coding: utf-8 -*-
#@time : 2019/5/16 20:53
#@author : ruhai.chen
#@file : 席位分配.py
import
re'''
三個系學生共200名(甲系100,乙系60,丙系40),代表會議共20席,
按比例分配,三個系分別為10,6,4席。
現因學生轉系,三系人數為103, 63, 34, 問20席如何分配。
'''class
fair_distribution():
abc_sum = 200a = 103 #
甲 b = 63 #
乙 c = 34 #
丙專業def
__init__
(self):
pass
defproportion(self,seats):
#轉系之後:20席分配時
pro200_a = self.a / self.abc_sum #
席位分配時,佔總人數比例
pro200_b = self.b /self.abc_sum
pro200_c = self.c /self.abc_sum
proseats_a = seats*pro200_a #
席位裡面所佔的比例
proseats_b = seats*pro200_b
proseats_c = seats*pro200_c
#print(proseats_a,proseats_b,proseats_c)
pattern = '
\.(\d)
'results_re_a =re.findall(pattern,str(proseats_a))[0]
results_re_b =re.findall(pattern,str(proseats_b))[0]
results_re_c =re.findall(pattern,str(proseats_c))[0]
#print(results_re_a,results_re_b,results_re_c)
max_re_i =max(results_re_a,results_re_b,results_re_c)
self.results_a =int(proseats_a)
self.results_b =int(proseats_b)
self.results_c =int(proseats_c)
#print('按人數比例分配時(把在公平範圍內能分的先分好):',self.results_a, self.results_b, self.results_c) #初次分配結果
results_a2 =int(proseats_a)
results_b2 =int(proseats_b)
results_c2 =int(proseats_c)
for i in range(0,(seats-20+1)):
if max_re_i ==results_re_a:
results_a2 = int(proseats_a) + 1max_re_i =max(results_re_b, results_re_c)
elif max_re_i ==results_re_b:
results_b2 = int(proseats_b) + 1max_re_i =max(results_re_a, results_re_c)
else
: results_c2 = int(proseats_c) + 1max_re_i =max(results_re_a, results_re_b)
print('
比例分配時,分配{}席:
'.format(seats),results_a2, results_b2, results_c2) #
進行尾數比較之後的+1的分配結果
return [self.results_a, self.results_b, self.results_c] #
進行尾數比較之後的+1的分配結果
#seats個席位的分配結果,顯然20、21之間的過渡即可知道這樣分配是不合理的。
def get_q(self,n,p): #
n為按人數比例分配時的席位,p為該方總人數
#p1 / n1 > p2 / n2 >>對a不公平
#假設現在有兩方來進行分配、解決這兩方的分配之後,便可以擴充套件到n方的分配
q = p**2/(n*(n+1)) #
動態的相對不公平度
return
q
#定義並計算絕對不公平度 ---乙個衡量公平分配的數量指標
defmain(self):
#20席分配時
s20 = fair.proportion(20) #
10 6 3
(s20)
#21席分配時
s21 = fair.proportion(21) #
10 6 3
print('\n'
)
#第20席分配時
q11 =fair.get_q(s20[0],self.a)
q12 = fair.get_q(s20[1],self.b)
q13 = fair.get_q(s20[2],self.c)
print('
分配第20席時得相對不公平度:
', q11, q12, q13)
q =max(q11,q12,q13)
if q == q11: #
說明對甲系得不公平度最大,這時候應該第20席分給甲,以下同理
self.results_a +=1s20[0] += 1
elif q==q12:
self.results_b += 1s20[1] += 1
else
: self.results_c +=1s20[2] += 1
print("
第20席得公平的分配結果:
", self.results_a, self.results_b, self.results_c)
#第21席分配時[在分配好第20席得基礎上進行分配第21席位]
q21 =fair.get_q(s20[0], self.a)
q22 = fair.get_q(s20[1], self.b)
q23 = fair.get_q(s20[2], self.c)
print('
分配第20席時得相對不公平度:
', q21, q22, q23)
q =max(q21, q22, q23)
if q == q21: #
說明對甲系得不公平度最大,這時候應該第20席分給甲,以下同理
self.results_a += 1
elif q ==q22:
self.results_b += 1
else
: self.results_c += 1
print("
第21席得公平的分配結果:
", self.results_a, self.results_b, self.results_c)
print("
公平的分配結果:
", self.results_a, self.results_b, self.results_c)
if__name__ == '
__main__':
fair =fair_distribution()
fair.main()
RabbitMQ 公平分發模式
建立兩個消費者,分別是 consumeraa consumerbb package com.example.demo import org.springframework.amqp.rabbit.annotation.rabbithandler import org.springframework....
max min公平分配原則
我們總會面臨這樣的問題,需要給一組使用者分配一些稀缺資源,站在資源分配者的角度,他們具有等價的權利獲取資源,但實際上,一些使用者可能獲取較少的資源就能夠滿足需要,這樣看來,他們對資源的獲取又不是完全等價的,似乎不適合去平分資源,因此就有了最大最小公平演算法。1 資源按照需求遞增的順序進行分配 2 不...
HihoCoder 1653 公平分隊
題目 小hi和小ho在玩乙個戰爭遊戲。遊戲中2n個戰鬥單位,其中第i個單位的戰鬥力是ai。現在小hi和小ho要各選n個單位組成隊伍,當然他們都希望自己隊伍的總戰鬥力越大越好。為了使分隊更加公平,經過親切友好的磋商,小hi和小ho達成共識按照以下步驟確定分隊 小ho將2n個單位分成兩隊,每隊n個戰鬥單...