読者です 読者をやめる 読者になる 読者になる

Line 1: Error: Invalid Blog('by Esehara' )

または私は如何にして心配するのを止めてバグを愛するようになったか

>> Zanmemo

あと何かあれは 「esehara あっと じーめーる」 か @esehara まで

お金の総体が変わらない市場でやりとりしたら、貧富の差が生まれるか?

今日の風景

f:id:nisemono_san:20160914151326j:plain

貧乏人に再分配された(半額になった)寿司の風景です

はじめに

『ベットルームで群論を』という、みすず書房から出ている本の中に、「富が一定である閉鎖的なマーケットの中で、平等に富を持ったプレイヤーに対し、ランダムに得する人と損する人を決めていき、ある一定のステップを踏んだ結果、少数の金持ちと、多数の貧民の格差に分かれることになる」という話を載せていた。

この話に興味を持ったので、実際に、そういうモデルを作って、実際に閉鎖的なマーケットで各種のプレイヤーが損と得を繰り返していった結果、貧富の差が生まれるかどうかを実際に簡単なコードでシミュレーションしたいと思う。当然、このモデルは、実際の経済市場とは乖離したものであることは認めざるを得ないが、極端なモデルにも、何らかの示唆は、多分あると思う。

ルール

とはいえ、ざっくりとこのようなことを書いたとして、そもそものルールが如何なるものかを考えないといけないだろう。

ルールとしては、まず市場に存在するプレイヤーは、それぞれ同じお金を所持しているものとする。そして、各プレイヤーのお金の総体は、増減しない。つまり、プレイヤーの所持する金額のお金を合計すると、いつも同じ所持金になるということである。そして、そのプレイヤーでとりひきするときに、損するプレイヤーと、得するプレイヤーをランタムに決める。このモデルにおいては、借金は認められないので、得するプレイヤーは、損するプレイヤーの所持金を越えない範囲においてのみ得することができる。また、損得の率については、これまたランダムで決定されることにする。

直観的には、損するプレイヤーと、得するプレイヤーの決定がランダムであるならば、おそらくプレイヤー同士の金額はそれほど変わらず、ある時は金持ちになったり、あるいはある時は貧乏になったり、を繰りかえすであろうということが予測される。神の見えざる手はそれほど残酷では無いように思える。

実装と実行

というわけで、このモデルを実装した結果としては下のようになる:

class Market
  def initialize(players)
    @players = players
  end

  def players_print
    puts "================================================================"
    @players.each_with_index { |player, i| print "#{i}: #{player.money}  "}
    puts ""
  end

  def money_flow
    win = player_choice
    lose = player_choice
    until define_player? win, lose
      win = player_choice
      lose = player_choice
    end

    if lose.money < win.money
      pay_money = (lose.money * (Random.rand(1..3) * 0.1)).to_i
    else
      pay_money = (win.money * (Random.rand(1..3) * 0.1)).to_i
    end

    lose.money -= pay_money
    win.money += pay_money
  end

  private
  def define_player? win, lose
    !(win.eql? lose) 
  end


  def player_choice
    @players[Random.rand(@players.size)]
  end
end


class Player
  attr_accessor :money
  def initialize
    @money = 10000
  end
end

players = Array.new(6) { Player.new }
market = Market.new players
market.players_print
1.upto(1000) do |x|
  market.money_flow
  if x % 10 == 0
    market.players_print
  end
end

これを実行した結果、次のようなログが得られる。

================================================================
0: 10000  1: 10000  2: 10000  3: 10000  4: 10000  5: 10000  
================================================================
0: 5923  1: 10756  2: 22849  3: 8422  4: 756  5: 11294  
================================================================
0: 3599  1: 18123  2: 6177  3: 17843  4: 255  5: 14003  
================================================================
0: 9336  1: 12062  2: 2571  3: 24749  4: 586  5: 10696  
================================================================
0: 1300  1: 8344  2: 2839  3: 30751  4: 260  5: 16506  
================================================================
0: 367  1: 5699  2: 3338  3: 35885  4: 308  5: 14403  
================================================================
0: 230  1: 2834  2: 9082  3: 42119  4: 69  5: 5666  
================================================================
0: 135  1: 2315  2: 8237  3: 44967  4: 67  5: 4279  
================================================================
0: 120  1: 1830  2: 6367  3: 45974  4: 6  5: 5703  
================================================================
0: 274  1: 542  2: 5036  3: 52045  4: 3  5: 2100  
================================================================
0: 163  1: 609  2: 3204  3: 53927  4: 3  5: 2094  
================================================================
0: 22  1: 363  2: 1518  3: 56812  4: 3  5: 1282  
================================================================
0: 18  1: 483  2: 1090  3: 57799  4: 3  5: 607  
================================================================
0: 10  1: 1278  2: 1909  3: 56636  4: 3  5: 164  
================================================================
0: 3  1: 1454  2: 1912  3: 56468  4: 3  5: 160  
================================================================
0: 3  1: 1697  2: 805  3: 57339  4: 3  5: 153  
================================================================
0: 3  1: 727  2: 802  3: 58381  4: 3  5: 84  
================================================================
0: 3  1: 229  2: 844  3: 58789  4: 3  5: 132  
================================================================
0: 3  1: 160  2: 741  3: 59023  4: 3  5: 70  
================================================================
0: 3  1: 40  2: 2131  3: 57702  4: 3  5: 121  
================================================================
0: 3  1: 91  2: 2434  3: 57244  4: 3  5: 225

繰りかえした結果、ある一定の閾値を越えると、途端に富の偏りが出てくるようで、この場合であるならば、3に集中していることがわかる。

考察

上記のモデルにおいては、お金のフローは硬直していく傾向にある。元ネタの『ベッドルームで群論を』にも書いてある通り、確かに金持ちはより金持ちになっていくわけだが、その分、金持ちは誰とも売買することのできない硬直した市場があり、その一方で、貧乏人同士で些細なお金のやりとりをしあうような世界になることが示唆されている。もちろん、このような特殊な市場というのは存在はしていない。

しかし、このような硬直に向かいつつある市場を、上手く修正する方法は一つある。上のモデルだと、金を持っているプレイヤーが、金を持っていないプレイヤー以上にお金を出さない、とする、ある意味では理知なプレイヤーのモデルである。そこで、もうすこしルールを単純にして、「与える側」と「貰う側」にしてしまう。つまり、ランダムに選ばれたプレイヤーはお互いの所持しているお金とは関係なく、一定率の金額を渡さなければならない、としてみよう。この修正は簡単で:

  def money_flow
    win = player_choice
    lose = player_choice
    until define_player? win, lose
      win = player_choice
      lose = player_choice
    end

    pay_money = (lose.money * (Random.rand(1..3) * 0.1)).to_i
    lose.money -= pay_money
    win.money += pay_money
  end

といったように、分岐の部分を無くせば良い。このログは以下のようになる。

================================================================
0: 10000  1: 10000  2: 10000  3: 10000  4: 10000  5: 10000  
================================================================
0: 6969  1: 10320  2: 12290  3: 5745  4: 13080  5: 11596  
================================================================
0: 7164  1: 3748  2: 16601  3: 8685  4: 8224  5: 15578  
================================================================
0: 7406  1: 15377  2: 9058  3: 5122  4: 5063  5: 17974  
================================================================
0: 3734  1: 10490  2: 14153  3: 16212  4: 4864  5: 10547  
================================================================
0: 13148  1: 9684  2: 15894  3: 8781  4: 8608  5: 3885  
================================================================
0: 7805  1: 10750  2: 14149  3: 11574  4: 8861  5: 6861  
================================================================
0: 6703  1: 15829  2: 2977  3: 21076  4: 5230  5: 8185  
================================================================
0: 13891  1: 15145  2: 7964  3: 8959  4: 5049  5: 8992  
================================================================
0: 8533  1: 7824  2: 18422  3: 12643  4: 9779  5: 2799  
================================================================
0: 10555  1: 16868  2: 9294  3: 6705  4: 2611  5: 13967  
================================================================
0: 12567  1: 10251  2: 8030  3: 11520  4: 4077  5: 13555  
================================================================
0: 10842  1: 4568  2: 3893  3: 5262  4: 28368  5: 7067  
================================================================
0: 7995  1: 4610  2: 6152  3: 11740  4: 15761  5: 13742  
================================================================
0: 10156  1: 7349  2: 8515  3: 19949  4: 5052  5: 8979  
================================================================
0: 19181  1: 8281  2: 11931  3: 13179  4: 1447  5: 5981  
================================================================
0: 1148  1: 18653  2: 16047  3: 4865  4: 9887  5: 9400  
================================================================
0: 21972  1: 10682  2: 4554  3: 3439  4: 9466  5: 9887  
================================================================
0: 2751  1: 13354  2: 15472  3: 7961  4: 7018  5: 13444  
================================================================
0: 22601  1: 11600  2: 5940  3: 10826  4: 2973  5: 6060  
================================================================
0: 11854  1: 21281  2: 10629  3: 6394  4: 4587  5: 5255  

といったように、若干偏りはあるものの、先ほどのような、酷い偏りではない結果が生まれることになった。元の本では、この経済モデルのことを「盗みと詐欺のモデル」としている。なぜなら、金持ちはできるだけ豊かになるように行動するはずだ。この場合、圧倒的に金持ちのほうが、貧乏人より、このモデル上では不利だからだ。(最も、経済学的に考えれば、このモデルは再配分がうまくいっているモデルとは言えるかもしれない)

まとめ

このモデルは単純化しすぎているので、経済学的な市場モデルを即ち反映しているとはとても言いがたいのは間違いない。しかし、単純化したところによって、いわゆる「売り買い」、あるいは「与える・貰う」という結論がどのような結果に収束するのか、あるいはしないのかを見てみるのは非常に面白かった。

今回、利用した『ベッドルームで群論を』では、このようなプログラミング的なトピックを扱った、硬すぎず、かといって簡単すぎるでもない、非常にほどよいエッセイが収められていて、読んでいてとても面白かった。もしかしたら、また幾つかトピックを紹介するかもしれないが、もし興味のある人がいれば、読んでみて欲しい。

ベッドルームで群論を――数学的思考の愉しみ方

ベッドルームで群論を――数学的思考の愉しみ方