初等模型 公平分配問題

2022-01-19 06:28:53 字數 4222 閱讀 3584

問題:

三個系學生共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

print

(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個戰鬥單...