50人の人がいてランダムに2から100までの偶数を設定
これを各人の幸福の上限(そこまでお金をもっていたら100%)として全員がその半額をもっているとする。(幸福度は50%)
幸福度は持ち金に比例する。持ち金は最低1から最大100とする。幸福の上限を越えても100%以上にはならない。
合計金額を変えないでそのお金を采配して全体の幸福度を最大にするにはどうしたらいいか?
解いてみると軒並み幸福の上限の高い人3割ぐらいの金額を1にしている。(割と無慈悲)
全体の幸福度は70%ぐらいになる。
予想していなかったのは、最初の全体の金額が少ないほど幸福度があがりそうということ
足るを知るということなのだろうか?
その確認用に問題の計算を50回してみたものです。
def culcHappy(p):
happyScore=0
for i in p:
happyMoney,money=i
score=money/happyMoney
if score>1:score=1
happyScore+=score
return round(happyScore*100/len(p),3)
def totalMoney(p):
totalMoney=0
for i in p:
happyMoney,money=i
totalMoney+=money
print(" totalMoney=",totalMoney)
def makePerson(n):
r=[]
for i in range(50):
b=random.randint(1,50)
r+=[(b*2,b)]
return r
def main():
m=makePerson(50)
#print(m)
totalMoney(m)
bestHappyScore=culcHappy(m)
print(bestHappyScore)
for i in range(100000):
p1=random.randint(0,len(m)-1)
p2=random.randint(0,len(m)-1)
if p1==p2:continue
hm1,m1=m[p1]
hm2,m2=m[p2]
if m1>1 and m2<99:
m[p1]=(hm1,m1-1)
m[p2]=(hm2,m2+1)
score=culcHappy(m)
if score>bestHappyScore:
bestHappyScore=score
else:
m[p1]=(hm1,m1)
m[p2]=(hm2,m2)
#print(m)
#totalMoney(m)
print(bestHappyScore)
for i in range(50):
main()