1. 程式人生 > >1.1python解決數學建模之席位分配問題

1.1python解決數學建模之席位分配問題

一:上程式碼 #比例法def rate_method(p,n):    lst =[] #儲存各組席位數    sum_ =sum(p)    #人數和    k =0#臨時變數    for i in p:        lst.append(i/sum_*n)        k += int(i/sum_*n)     while k!=n:        max_ =0        for i in lst:            max_ =i if (i -int(i)) > max_- int(max_)else max_  #小鼠的比較        lst[lst.index(max_)] =int(max_) +1        k +=1    for i in lst:        lst[lst.index(i)] =int(i)       print(lst)                        #Q值法:def q_value(p,n):       #p:儲存各組人數的列表,n:席位數    lst =[] #儲存各組席位數    for i in p:        lst.append(1) #初始席位數都為1    lst_ =lst[:]     #臨時列表,儲存各組Q值    for i in range(n-len(p)):        for i in range(len(p)):            lst_[i] =p[i]*p[i]/(lst[i]+1)/lst[i]        max_index=lst_.index(max(lst_))        lst[max_index] +=1    print(lst) #d'Hondt 方法def d_Hondt(p,n):       #p必須以大到小順序排序    lst =[] #儲存各組席位數    a,b=0,0 #儲存比值,下一項比值    for i in p:        lst.append(0) #初始席位數都為0    for i in range(n):        for j in range(len(p)):            a =p[j]/(i+1)            if b>a:                break            b =p[j]/(i+2)            lst[j] += 1        if sum(lst) ==n:    #放在第一個迴圈內,是考慮到不太可能只除了1就分配好了            break    print(lst) if __name__ =='__main__':    p =[432,333,235] #從大到小比較好,為了一次性使用所有方法    n =10    rate_method(p,n)    q_value(p,n)    d_Hondt(p,n)

二:

席位分配常用的三種方法:

1.比例分配 :公平而又簡單

2.Q值法:(摘自:數學模型-姜啟源-)

        設兩方人數分別 p1 和 p2 ,佔有席位分別是 n1 和 n2 ,則兩方每個席位代表的人數分別為 p1/n1 和 p2/n2 .顯然僅當 p1/n1 = p2/n2 時席位的分配才是公平的.但是因為人數和席 位都是整數,所以通常 p1/n1 ≠ p2/n2 ,這時席位分配不公平,並且 pi ni (i= 1, 2)數值較大的一方吃虧,或者說對這一方不公平.

         不妨假設 p1/n1 > p2/n2 ,不公平程度可用數值 p1/n1 - p2/n2 衡量.如設 p1 = 120, p2 = 100, n1 = n2 = 10,則 p1/n1 - p2/n2 = 12 - 10 = 2,它衡量的是不 公平的絕對程度,常常無法區分兩種程度明顯不同的不公平情況.例如上述雙方 人數增加為 p1 = 1 020 和 p2 = 1 000,而席位 n1 , n2 不變時, p1/n1 - p2/n2 = 102 - 100 = 2,即絕對不公平程度不變.但是常識告訴我們,後面這種情況的不公 平程度比起前面來已經大為改善了.

        為了改進上述絕對標準,自然想到用相對標準.仍記 p1 , p2 為 A, B 兩方的 固定人數, n1 , n2 為兩方分配的席位(可變),若 p1/n1 > p2/n2 ,則定義

  rA ( n1 , n2 ) =(p1 /n1 - p2 /n2)/( p2 /n2)      (1)           為對 A 的相對不公平度.

若 p2 n2 > p1 n1 ,則定義

  rB ( n1 , n2 ) =(p2 /n2 - p1/ n1 )/(p1 n1)    (2)    為對 B 的相對不公平度

  建立了衡量分配不公平程度的數量指標 rA ,rB 後,制定席位分配方案的原 則是使它們儘可能小. 確定分配方案 假設 A, B 兩方已分別佔有 n1 和 n2 席,利用相對不公平 度 rA 和 rB 討論,當總席位增加 1 席時,應該分配給 A 還是 B. 不失一般性可設 p1 /n1 > p2 /n2 ,即對 A 不公平.當再分配 1 個席位時,關 於 pi ni (i= 1,2)的不等式可能有以下 3 種情況: 1 . p1/ ( n1 + 1) > p2 /n2 ,這說明即使 A 方增加 1 席,仍然對 A 不公平,所以 這一席顯然應分給 A 方. 2 . p1 /(n1 + 1) < p2 /n2 ,說明當 A 方增加 1 席時將變為對 B 不公平,參照 (2)式可計算出對 B 的相對不公平度為

  rB ( n1 + 1, n2 ) =p2 /(n1 + 1) /(p1 /n2)- 1     (3)3 . p1 /n1 > p2/ ( n2 + 1),即當 B 方增加 1 席時將對 A 不公平,參照(1)式可 計算出對 A 的相對不公平度為

  rA ( n1 , n2 + 1) =p1 (/ n2 + 1) (p2/ n1) - 1     (4)  (不可能出現 p1 /n1 < p2 /( n2 + 1)的情況.為什麼 ?) 因為公平分配席位的原則是使得相對不公平度儘可能地小,所以如果 rB ( n1 + 1, n2 ) < rA ( n1 , n2 + 1) (5) 則這 1 席應分給 A 方;反之則分給 B 方.根據(3),(4)兩式,(5)式等價於 (p2 ^2) /(n2 (n2 + 1) )< (p1^2 )/ n1 ( n1 + 1) (6) 還不難證明,上述第 1 種情況的 p1 /( n1 + 1) > p2 /n2 也會導致(6)式.於是我們 的結論是:當(6)式成立時增加的 1 席應分給 A 方,反之則分給 B 方.或者,若記 Qi =( p i^2)/ (ni( ni + 1)),i= 1,2,則增加的 1 席應分給 Q 值較大的一方. 上述方法可以推廣到有 m 方分配席位的情況.設第 i 方人數為 pi,已佔有 ni 個席位,i= 1,2,⋯, m.當總席位增加 1 席時,計算Qi =(pi^2)/(ni( ni + 1)), i= 1,2,⋯, m     (7)應將這一席分給 Q 值最大的一方.這種席位分配方法稱 Q 值法.

3.d’ Hondt 方法:

將各組人數用正整數 n = 1, 2, 3,⋯相除,將所得商數從大到小取前 n個(n 為席位數)