パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

問題 社会の幸福

2019-03-30 | python 謎解き

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()

 

 


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。