8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

社会シミュレーションで女尊男卑社会を再現してみた【性淘汰シミュレータ】

Last updated at Posted at 2025-02-06

この記事は思想強めです。特定のイデオロギーやセンシティブな話題を避けたい方は、ブラウザバックをお勧めします。

思想キーワード: ジェンダー論, 女尊男卑, 権利と法

この記事は、社会シミュレーションを行うにあたって「性別は女性と男性だけ」および「同性カップルは存在しない」という前提に基づいて執筆されています。これは特定の性的マイノリティへの差別や無理解を助長するものではなく、シミュレーションを簡単にするための「近似」ですのでご理解ください。

1. この記事で伝えたいこと

「フェミニズム」や「女性差別」という単語は多くの人にとって聞き馴染みのある言葉だろう。一方、「マスキュリズム」(男性の権利擁護運動)や「男性差別」という単語はあまり聞かれないのではないか。
その理由を、多くの人が「不遇な立場の女性が声をあげているから」と考えるが、筆者は逆に「男性が声をあげられない不遇な立場にいるから」と考えている。
この記事では、筆者の立場を支持すべく、簡易な社会シミュレーションをpythonで実装し、その結果を報告する。

599903CC-B14C-4240-A7C6-0B1A9D29938F.jpg

2. 思想と理論

2章の内容はポエムです。この記事を執筆した動機の説明であり、シミュレーション実験に関する内容そのものではありません。
手っ取り早くシミュレーション実験とその結果を見たい方は、3章へお進みください。

2-1. 女尊男卑と化したジェンダー論界隈

「女子/男子 が少ない学校で、入試で 女子/男子 を優遇して無理矢理増やすのはアリか」というテーマを考える。

  • 女子が少ない場合は、女子を優遇して増やすことに対して、ジェンダー論界隈は寛容であるように見える。

    • 具体例としては、多くの大学の理工系学部で次々と「女子枠入試」が導入されていることをあげれば十分だろう。
  • 男子が少ない場合は、男子を優遇して増やすことに対して、ジェンダー論界隈は不寛容であるといえるだろう。

    • 都立高校入試の男女別定員制度は、男子の割合が減り過ぎないように機能していた「事実上の男子枠制度」といえようが、これは「女子だけ競争が激しくなるのは不当」という理由で、段階的に廃止されることになった。
  • 上記をまとめると、ジェンダー論界隈は 「女子枠はいいけど男子枠はダメ」 と言っているに等しい。

    • 看護学校(大学ではない)には男子枠のある学校も多いが、大学の看護学部で男子枠を導入している学校はない
    • 看護学校(大学ではない)の男子枠は、男子の人数を逆に制限している場合もある1

女子枠や男子枠のように、少数派を優遇してバランスを取ろうとする措置のことを「アファーマティブ・アクション」という。
筆者はアファーマティブ・アクションそのものの是非については判断しないが、
男性の時だけアファーマティブ・アクションに不寛容になる昨今のジェンダー論界隈 の態度はダブル・スタンダードであると考える。
ジェンダー論界隈は、アファーマティブ・アクションの是非に対する態度を女性の都合のいいように切り替えている として非難されてもやむを得ないだろう。

2-2. 性淘汰

一部の有性生物において、「オスが遺伝子レベルでメスに気に入られようとする」傾向がみられる。
孔雀のオスの美しい羽根や、鈴虫のオスの美しい音色などがその例である。
そのような傾向が生まれる理由としては、おおよそ次のように考えられている2

  1. メスは僅かな卵しか作れず、オスは多くの精子を作れる。
  2. そのため、「婚活市場」にメスはあまり顔を出せず、必然的にオス余りになる。
  3. オスの競争が激しくなり、メスに特に気に入られたオスだけが交尾できる。
  4. 「メスに気に入られるためのオスの遺伝子」が次の世代に残る。

この一連の流れを「(異性間)性淘汰」という。

筆者は、人間もまた女性が男性を性淘汰しており、それ故に 2-1 節で述べたような「女性に都合のいいジェンダー論界隈」が自然発生しているのではないかと考えている。すなわち、「男性には女性に気に入られるための遺伝子が刻み込まれており、その遺伝子が男性の権利擁護運動を妨げているのではないか」と仮説①を立てている。3

2-3. 権利と法

法哲学には、「権利と法は同じものである」という考え方がある。
法哲学の研究が歴史的に盛んであったドイツでは、権利と法はどちらもrecht (レヒト) といい、 recht には権利・法の他にも「正義」という意味もある。

これまたドイツの法哲学者イェーリング氏4によれば、「recht」とは、「主観的な意味におけるrecht=権利」と、「客観的な意味におけるrecht=法」とが一体となって統一された概念であるとのことだ。

またイェーリング氏は、『法は先人達の「rechtのための闘争」によって勝ち取られたものであり、個々人の権利が脅かされた時こそ権利を主張し、法を求めることが自分の為だけでなく、法の生成・発展にも貢献する』4 とも主張している。

すなわち、権利と法はお互いを育て合っている。「法のおかげで個人が権利を持つことが出来る」のと同時に、「個人が権利を主張するおかげで法が進化していく」ということである。

以降は筆者なりの解釈ではあるが、rechtを正義と言い換えると、「権利とは個人的、主観的な正義であり、法とは社会的、客観的な正義」と言えるのではないだろうか。
つまり、権利として個人的な正義を主張し、各人の正義のぶつかり合いを合成(rechtのための闘争)することで客観的にした正義が法を発展させていく と考えることが出来ると思う。

そこでこの記事でのシミュレーションでは、 各市民の主張する権利の平均値を、法の変化率とする ことにしようと思う。ようするに

$$(法)=\sum_{(各世代)}\frac{\sum_{(各市民)}(各市民の権利主張)}{(人口)}$$

とする。

法の変化率
$$(法の変化率) = \frac{\sum_{(各市民)}(各市民の権利主張)}{(人口)} = (法改正)$$
を「法改正」と呼ぶことにすれば、

$$(法)=\sum_{(各世代)}(法改正)$$

となる。

2-4. 遺伝的アルゴリズム

遺伝的アルゴリズムは、生物に見られる 「自然淘汰と進化」 を模倣したアルゴリズムである。複数の「個体」を世代ごとに進化させ、最適な状態に近づけていく。

基本の流れ

  1. 初期集団の生成:ランダムに複数の個体を作成。
  2. 評価:各個体の性能を評価。
  3. 選択:優秀な個体を選び、次世代に引き継ぐ準備をする。
  4. 交叉:選ばれた個体同士を組み合わせ、新しい個体を作る。
  5. 突然変異:個体の一部をランダムに変化させ、多様性を維持する。
  6. 繰り返し:このプロセスを繰り返して、より良い個体を作る。

交叉とは?

交叉は、2つの親個体の特徴を組み合わせて新しい個体(子供)を作るプロセスである

例:ベクトルの交叉

親1: $(102, -67)$
親2: $(4, -1)$

平均をとって子を作ると
子: $(53, -34)$

これにより、親の良い特徴(1次元目が正, 2次元目が負)を引き継ぎつつ、新しい個体が生まれる。

突然変異とは?

突然変異は、個体の遺伝情報の一部をランダムに変更する操作である。多様性を保つために重要である。

例:ベクトルの突然変異

子個体: $(53, -34)$

2次元目を突然変異させると:
$(53, 101)$

突然変異が起こると、たいていは悪い結果になるが、ごくまれに「超いい結果」になる場合がある。
例えるなら、突然変異がない場合、どの個体もテストで60点くらいの成績を収めるところ、突然変異をさせると、たいていは30点とか40点のように成績が下がってしまうものの、ごくまれに90点を取る個体が現れる、といった感じである。

3. 実験

2-2節で示した仮説①を(立証とまではいかなくても)支持するために、単純な社会シミュレーションを構築し、遺伝的アルゴリズムにより性淘汰を再現し、次の仮説②を実験的に立証する。

仮説②

ある単純な条件下で、市民の作る法は、常に女性に都合のいい方向に改正される。

市民とは
  • 女性と男性に分けられ、自らの権利を主張し、また自らと似たような権利主張をする異性を繁殖相手に選ぶ生物を「市民」と呼ぶ。
  • 市民の主張する権利は親から遺伝するほか、自らの性別によって一定のバイアスがかかる。このバイアスは異性のものと正反対である。
  • 異性を選り好みする度合いは、親から遺伝する。
法とは 各世代の市民の平均的な権利主張を「法改正」と呼ぶ。 法改正の累積値を「法」と呼ぶ。
女性(男性)とは 2つの性別のうち、一生涯に繁殖を行える回数が異性と比べて極端に少ない性別を女性という。 女性でない性別を男性という。
ある単純な条件とは
  • 市民の誕生時のエネルギーは皆同じ
  • 市民は繁殖するたびに繁殖コストの分だけエネルギーを失い、
    エネルギーが0以下となったら繁殖を行わない
  • 世代を跨いで生きる市民はいない
  • 女性と男性の人数は同じである
  • 人口はどの世代でも同じである
  • 親から遺伝する形質(「主張する権利」と「異性を選り好みする度合い」)は、同性の親から一定の割合とし、残りの割合を異性の親から遺伝する
  • 上記以外に特殊な条件は加えない

3-1. 仕様

権利は「数字」で表現する

まず、各市民が主張する権利は一つの数字(実数)で表現することにする。
例えば、市民Aさんは 「$0.4$」という権利を主張し、
別の市民Bさんは「$-1.2$」という権利を主張する。

フェミニズム方向とマスキュリズム方向

次に、権利主張に「フェミニズム方向(女性の権利の方向)」と「マスキュリズム方向(男性の権利の方向)」
を定義する。
マスキュリズムは、フェミニズムの反対方向であるというルールにする。

最初は、フェミニズムを 「プラスの方向」にしておき、後ほど説明する「都合革命」が起きたときに正負を入れ替える。

例えば、フェミニズムを「プラスの方向」とする場合、次のことが言える。

  • マスキュリズムは「マイナスの方向」である。
  • Aさんが「$2.4$」、Bさんが「$0.6$」、Cさんが「$0$」、Dさんが「$-1.2$」という権利を主張する場合、
    • AさんとBさんはフェミニスト、Dさんはマスキュリスト、Cさんは中立といえる。
    • AさんはBさんよりも「過激な」フェミニストである

権利に「性別によるバイアス」を加える

さらに、市民が主張する権利は、親から遺伝するほか、自分の性別によってバイアスがかかるものとしたい。
女の子の主張する権利は、両親から遺伝した数字をフェミニズム方向にちょっとだけずらしたものとしたいし、
男の子の主張する権利は、両親から遺伝した数字をマスキュリズム方向にちょっとだけずらしたものとしたい。

これを実現するために、「単位フェミニズム」、「単位マスキュリズム」という概念を考える。
単位フェミニズムは、大きさが$1$で、符号がフェミニズム方向である数字とする。
また、単位マスキュリズムは、単位フェミニズムの $-1$倍とする。
例えば、フェミニズムがプラス方向の場合、
単位フェミニズムは $1$, 単位マスキュリズムは $-1$ となるし、
フェミニズムがマイナス方向の場合、
単位フェミニズムは $-1$, 単位マスキュリズムは $1$ となる。

女の子の主張する権利は、両親から遺伝した数字に単位フェミニズムを足し算したものとすればよいし、
男の子の主張する権利は、両親から遺伝した数字に単位マスキュリズムを足し算したものとすればよい。

都合革命

最後に、時々価値観を逆転させるという仕様にしてみる。
つまり、さっきまでフェミニズムがプラスでマスキュリズムがマイナスであったはずなのに、
今突然、フェミニズムをマイナス、マスキュリズムをプラスに入れ替えるのである。
これを「都合革命」という。

例えば、大学の理工学系学部には「女子が少ないから女子枠を作れ」と主張する一方、
都立高校入試では「男子が少ないからと言って男子枠を作るな」と主張するフェミニストが現実の社会に多いように、都合が入れ替わったとたん、市民は主張を反転させるのか、法の推移はどう変化するのか ということをシミュレーションでも観察したい。 これが都合革命を行う理由である。(法とは、法改正の累積値であり、法改正とは、市民の権利主張の平均値である)

例えば、「フェミニズムがプラスである間は、法が時間と共に増加していたのに、フェミニズムがマイナスに入れ替わった瞬間、法が減少し始めた」という場合は、法が女性の都合で左右されていることがわかる。

結論

以上をまとめると、次のような仕様にする。

  • 市民が主張する権利は実数で表現する。
  • 第1世代において、符号「フェミニズム」をプラスとする。
  • 「マスキュリズム」はフェミニズムと反対の符号とする。
  • フェミニズム方向で大きさ $1$ の実数を「単位フェミニズム」と呼び、
    マスキュリズム方向で大きさ $1$ の実数を「単位マスキュリズム」と呼ぶ。
    • フェミニズムがプラスであれば、 $1$ が単位フェミニズム、 $-1$ がマスキュリズム
    • フェミニズムがマイナスであれば、 $-1$ が単位フェミニズム、 $1$ がマスキュリズム
  • 女性が主張する権利は、親から遺伝した値に単位フェミニズムを足したものとし、
    男性が主張する権利は、親から遺伝した値に単位マスキュリズムを足したものとする。
    • つまり女性の主張にはフェミニズム方向のバイアスがかかり、
      男性の主張にはマスキュリズム方向のバイアスがかかる。
  • いくつかの世代において、フェミニズムやマスキュリズムの符号を反転させる。これを「都合革命」と呼ぶ。
    • 女性または男性の都合で法が左右されるかを観測するための仕様である。

3-2. シミュレーションの流れ

シミュレーションは、図3-2-1のフローチャートに沿って実行されるものとする。

image.png
図3-2-1. シミュレーションのフローチャート

パラメータ

図3-2-1(及び後に示す図3-2-2)のフローチャートで黄色くハイライトされているものは、「シミュレーション実行時に設定するパラメータによって決まる」ことを示している。つまり、試行を繰り返す回数や市民の人数、何世代までシミュレーションするかなどは、すべてパラメータで設定する。

パラメータ一覧は次のとおり。

試行回数
試行回数 は 試行を繰り返す回数を表す。
結果のプロットでは、試行回数分の平均値をプロットする。

最終世代
最終世代 は 各試行で何世代までシミュレーションを行うかを表す。

人数
一方の性別の人数 は 世代ごとに女性と男性をそれぞれ何人作るかを表す。
例えば 一方の性別の人数 が $50$ なら、各世代に市民は $50\times2=100$人 いることになる。

初期エネルギー
初期エネルギー は、各市民が最初に持っているエネルギー量を表す。
市民は繁殖を行うたびに、繫殖コストの分だけエネルギーを失い、エネルギーが $0$ 以下になると繁殖不能になる。

繁殖コスト
各市民の繁殖コストを確率的に決定する際に使われるパラメータとして、女性の繫殖コストの平均, 女性の繫殖コストの標準偏差, 男性の繫殖コストの平均, 男性の繫殖コストの標準偏差 を用意する。

繁殖コストは、性別ごとに大きく異なる。むしろ繁殖コストの極端な違いこそが、今回のシミュレーションにおいて女性を女性たらしめており、男性を男性たらしめているといって過言ではない。

繁殖コストは、基本的に正規分布に従う乱数(正規乱数)で決まる。但しこの乱数の値が $0.1$ 未満であった場合は、代わりに $0.1$ を繁殖コストとして採用する。

女性の繁殖コストを決める正規乱数は、平均を 女性の繫殖コストの平均 、 標準偏差を 女性の繫殖コストの標準偏差 とする。
男性の繁殖コストを決める正規乱数は、平均を 男性の繫殖コストの平均 、 標準偏差を 男性の繫殖コストの標準偏差 とする。

突然変異率
突然変異率 は、遺伝的アルゴリズムにおける「突然変異」の発生確率を表す。
今回のシミュレーションでは、突然変異が起きると、親から遺伝した値を破棄し、初期市民 (第1世代の市民。親がいない。)と同じように遺伝子を決めるものとする。

同性の親からの遺伝割合
遺伝的アルゴリズムにおける「交叉」を実施するにあたって、同性の親から遺伝する割合を表すパラメータとして、 同性の親からの権利主張の遺伝割合, 同性の親からの異性評価強度の遺伝割合 を用意する。

今回のシミュレーションで遺伝子とするのは、「権利主張」と「異性評価強度」である。

子の遺伝子は、 $(同性の親から遺伝する割合)\times(同性の親の遺伝子) + (1 - 同性の親からの遺伝割合)\times(異性の親の遺伝子)$

として決まる。 (権利主張の場合は、さらに「性別によるバイアス」が加えられる)

(seed)
( seed は、基本的に None としておけばよい。特別な実験をするときのみ、$0$以上 $4294967295$以下の整数を指定する)

「特別な実験」とは シミュレーションでは、初期市民の遺伝子を決めるとき、繫殖コストを決めるとき、あるいは突然変異を行うか決めるときなどに乱数(サイコロのようにランダムに決まる数)を用いる。

サイコロのようなものを用いる以上、シミュレーションの結果はふつう、厳密にみれば毎回違ったものになる。
しかし、シミュレーションの結果を、毎回厳密に同じにしたい場合がある。このような実験を「特別な実験」といっている。

そのようなワガママに答えるアイデアとして、「"予め" 無限回だけサイコロを振っておく試みを $4294967296$ 回繰り返しておく」5 というものがある。

試み番号\サイコロを振った回数 $1$回目 $2$回目 $3$回目 ...(無限に続く)
試み番号$0$ $2$ $4$ $3$ ...(無限に続く)
試み番号$1$ $6$ $1$ $4$ ...(無限に続く)
試み番号$2$ $6$ $5$ $2$ ...(無限に続く)
: : : : ...(無限に続く)
試み番号$4294967295$ $1$ $3$ $3$ ...(無限に続く)

例えば、試み番号$0$ の結果を使えば、何度シミュレーションをしても、サイコロの$1$回目の結果は必ず$2$になるし、$2$回目の結果は必ず$4$となる。
よって、この「試み番号」を指定しておけば、サイコロのようなランダムな数字を使いつつ、シミュレーションの結果を毎回厳密に同じにすることが出来るのである。

この試み番号が、 seed に該当する。 seedNone の場合は OS がランダムに試み番号を決める。

統計データ

統計データには、「女性/男性の権利主張の平均値」、「法」、「女性/男性の異性評価強度の平均値」、「女性/男性の繁殖経験率」があり、それぞれの意味は次のとおり。

権利主張の平均値
女性と男性がそれぞれ平均的にどのような権利主張をしているかを表す数値。フェミニズムがプラス方向であるとき、女性の権利主張はプラスの値、男性の権利主張はマイナスの値となることが期待される。


女性と男性の権利主張の平均値によって増減する数値。フェミニズムがプラス方向であるとき、法が$0$より大きければ女尊男卑であり、$0$より小さければ男尊女卑である。

異性評価強度の平均値
女性と男性がそれぞれ平均的にどのような異性評価強度をもっているかを表す数値。
異性評価強度とは、異性をどれだけ「選り好み」するかを表す数値である。
異性評価強度が低ければ、どんな異性に対しても高い評価をするが、
異性評価強度が高ければ、自分と似た権利主張をする異性だけを高く評価し、自分と相容れない権利主張をする異性を低く評価するようになる。

繫殖経験率
女性と男性について、それぞれ一度でも子を作ったことのある者(非処女、非童貞)の割合。
童貞の割合が処女の割合よりも十分高い場合には、男性の競争が激しくなり、女性が男性を性淘汰するようになると考えられる。
処女の割合が童貞の割合よりも十分高い場合には、女性の競争が激しくなり、男性が女性を性淘汰するようになると考えられる。

遺伝的アルゴリズム

image.png

「遺伝的アルゴリズムを利用し、子を作る」の処理は、図3-2-2のフローチャートに沿って実行されるものとする。

image.png
図3-2-2. 子を作るプロセスのフローチャート

「権利主張」と「異性評価強度」が遺伝子として扱われる。

評価

image.png

市民が 異性を評価する際、 $1 - (仲悪い度)\times(異性評価強度)$ という式で $0~1$の評価値を算出している。カップルの互いの評価(円満度) は $(彼女から彼氏への評価値) + (彼氏から彼女への評価値)$ と定義する。

$(仲悪い度)$ は $0~1$ で、自分の権利主張と相手の権利主張がどれだけかけ離れているかを表す。

  • $(仲悪い度) = \frac{(ズレ)}{(ズレ + 1)}$
  • $(ズレ) = \left|(自分の権利主張) - (相手の権利主張)\right|$

$(異性評価強度)$ は、$0~1$ どれだけ異性を「選り好み」するかを表す遺伝子である。

$(異性評価強度)$ が小さければ、どんなに仲の悪い相手であっても高く評価するし、
$(異性評価強度)$ が大きければ、仲の悪い相手を低く評価するようになる。

ズレ(自分と相手の権利主張の差の大きさ)を横軸、異性評価強度を縦軸として、評価値を色で表すと図3-2-3のようになる。
image.png
図3-2-3. 権利主張の差の大きさと異性評価強度と評価値の関係

3-3. コーディング

仮説②および 3-1節の仕様と 3-2節のフローチャートに従った python コードは、次の sss.py のように書ける。

(sss.pyを表示するにはここをクリック)
sss.py
"""sss.py
Sexual Selection Simulator (性淘汰シミュレータ)

「権利主張」という実数を持つ市民の繁殖をシミュレーションし、
「法」(各市民の権利主張の平均値の累積値)が女性優位となることを実験的に確かめる。

次の仮定をもとにシミュレーションを行う。
仮定1: 女性と男性は、 仮定2 と 仮定3 を除き本質的に同じであり、
       唯一の非対称的な違いは 仮定2 のみである。
仮定2: 女性の繁殖コストは、男性よりも極端に高い
仮定3:
    3-1: 女子は親から権利主張を遺伝された後「単位フェミニズム」が加算される。
    3-2: 男子は親から権利主張を遺伝された後「単位マスキュリズム」が加算される。
    3-3: 単位フェミニズムは -1 または 1 であり、
         単位マスキュリズムは単位フェミニズムの符号を入れ替えたものである。
"""
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from itertools import product

# シミュレーションのパラメータ
試行回数 = 1000 # ※1
最終世代 = 100
一方の性別の人数 = 50
初期エネルギー = 200
女性の繫殖コストの平均 = 70
女性の繁殖コストの標準偏差 = 20
男性の繁殖コストの平均 = 2
男性の繁殖コストの標準偏差 = 1
突然変異率 = 0.1
同性の親からの権利主張の遺伝割合 = 0.5
同性の親からの異性評価強度の遺伝割合 = 0.9
seed = None

# 統計データ
法_list = []
女性の権利主張の平均値_list = []
男性の権利主張の平均値_list = []
女性の異性評価強度の平均値_list = []
男性の異性評価強度の平均値_list = []
女性の繁殖経験率_list = []
男性の繁殖経験率_list = []

# 市民型クラス
class 市民型:
    def __init__(自分, 性別, 権利主張, 異性評価強度, 初期エネルギー):
        自分.の性別 = 性別 # "女性" または "男性"。
        自分.の権利主張 = 権利主張 # 実数
        自分.の異性評価強度 = 異性評価強度 # 0.0 ~ 1.0
        自分.のエネルギー = 初期エネルギー
        自分.は経験済み = False

    def は生きている(自分):
        return 自分.のエネルギー > 0

    def が評価する(自分, 相手): # 0.0 ~ 1.0
        ズレ = abs(自分.の権利主張 - 相手.の権利主張)
        仲良し度 = 1 - 2 * (ズレ / (ズレ + 1)) # -1.0 ~ 1.0
        仲悪い度 = (1 - 仲良し度) / 2 # 0.0 ~ 1.0

        評価値 = 1 - 仲悪い度 * 自分.の異性評価強度
        """評価値 ※2
        ・自分.の異性評価強度が 0 に近ければ、評価値は 1 に近づく
        ・自分.の異性評価強度が 1 に近ければ、評価値は
            ・仲が最悪なら 0 に近づく
            ・仲が最高なら 1 に近づく
        """
        return 評価値

# 関数
def get_権利主張(性別): # ※3
    if 性別 == "女性":
        return np.random.normal(0, 0.5)
    if 性別 == "男性":
        return -np.random.normal(0, 0.5)
    
def get_異性評価強度(性別): # ※4
    if 性別 == "女性":
        return np.random.uniform(0, 1)
    if 性別 == "男性":
        return np.random.uniform(0, 1)

def 初期市民を作る(性別):
    return 市民型(
        性別 = 性別,
        権利主張 = get_権利主張(性別),
        異性評価強度 = get_異性評価強度(性別),
        初期エネルギー = 初期エネルギー
    )

def get_繁殖コスト(性別): # ※5
    if 性別 == "女性":
        平均 = 女性の繫殖コストの平均
        標準偏差 = 女性の繁殖コストの標準偏差
    if 性別 == "男性":
        平均 = 男性の繁殖コストの平均
        標準偏差 = 男性の繁殖コストの標準偏差
    return max(np.random.normal(平均, 標準偏差), 0.1)

# 都合革命世代を定義する (女性と男性の "都合" が入れ替わる) ※6
np.random.seed(1119)
革命世代たち = []
while len(革命世代たち) < 5:
    革命世代 = np.random.randint(2, 最終世代+1)
    if 革命世代 not in 革命世代たち:
        革命世代たち.append(革命世代)
革命世代たち.sort()
np.random.seed(None)
seed = int(
    np.random.randint(0, 4294967295+1, dtype=np.uint64)
) if seed is None else seed
print(f"seed: {seed}")
np.random.seed(seed)

# 試行する ※7
for 試行 in range(試行回数):
    # 初期化する ※7-1
    法_list.append(0)
    女性の権利主張の平均値_list.append(0)
    男性の権利主張の平均値_list.append(0)
    女性の異性評価強度の平均値_list.append(0)
    男性の異性評価強度の平均値_list.append(0)
    女性の繁殖経験率_list.append(0)
    男性の繁殖経験率_list.append(0)

    女性たち = [初期市民を作る("女性") for _ in range(一方の性別の人数)]
    男性たち = [初期市民を作る("男性") for _ in range(一方の性別の人数)]
    単位フェミニズム   = 1
    単位マスキュリズム = - 単位フェミニズム

    # 実行する ※7-2
    for 世代 in range(1, 最終世代+1):
        女性の権利主張の平均値_list.append(np.mean([
            女性.の権利主張 for 女性 in 女性たち
        ]))
        男性の権利主張の平均値_list.append(np.mean([
            男性.の権利主張 for 男性 in 男性たち
        ]))
        女性の異性評価強度の平均値_list.append(np.mean([
            女性.の異性評価強度 for 女性 in 女性たち
        ]))
        男性の異性評価強度の平均値_list.append(np.mean([
            男性.の異性評価強度 for 男性 in 男性たち
        ]))

        # 法の更新 ※7-2-1
        法改正 = np.mean([市民.の権利主張 for 市民 in (女性たち + 男性たち)])
        法_list.append(法_list[-1] + 法改正)

        # 円満度 (互いの異性評価の和) の高い順にカップルを並べる ※7-2-2
        カップルたち = list(product(女性たち, 男性たち))
        円満度付きカップルたち = [
            {
                "の彼女": 女性, "の彼氏": 男性,
                "の円満度": 女性.が評価する(男性) + 男性.が評価する(女性)
            }
            for (女性, 男性) in カップルたち
        ]
        円満度付きカップルたち.sort(
            key = lambda カップル: カップル["の円満度"], reverse=True
        )
        
        if 世代 in 革命世代たち: # フェミニズムとマスキュリズムを入れ替える
            単位フェミニズム   *= -1
            単位マスキュリズム = - 単位フェミニズム

        女子たち = [] # 「女性たち」は親。「女子たち」は子。
        男子たち = []
        while len(女子たち + 男子たち) < 一方の性別の人数 * 2:
            # 妻と夫を決める ※7-2-3
            try:
                カップル = 円満度付きカップルたち.pop(0)
                 = カップル["の彼女"]
                 = カップル["の彼氏"]
            except IndexError: # 円満度付きカップルたちが全滅する場合がある
                 = 初期市民を作る("女性")
                 = 初期市民を作る("男性")

            if not (.は生きている() and .は生きている()):
                continue

            .のエネルギー -= get_繁殖コスト("女性")
            .のエネルギー -= get_繁殖コスト("男性")

            # 子の性別を決める ※7-2-4
            if   len(女子たち) <  len(男子たち):
                子の性別 = "女性"
            elif len(女子たち) >  len(男子たち):
                子の性別 = "男性"
            elif len(女子たち) == len(男子たち):
                子の性別 = "女性" if np.random.rand() < 0.5 else "男性"

             = 市民型(
                性別 = 子の性別, 権利主張 = None, 異性評価強度 = None,
                初期エネルギー = 初期エネルギー
            )

            同性の親 =  if 子の性別 == "女性" else 
            異性の親 =  if 同性の親 ==  else 

            # 交叉する ※7-2-5
            .の権利主張 = (
                同性の親からの権利主張の遺伝割合       * 同性の親.の権利主張
            ) + (
                (1 - 同性の親からの権利主張の遺伝割合) * 異性の親.の権利主張
            ) + (
                単位フェミニズム if 子の性別 == "女性" else 単位マスキュリズム
            )
            .の異性評価強度 = (
                同性の親からの異性評価強度の遺伝割合 \
                * 同性の親.の異性評価強度
            ) + (
                (1 - 同性の親からの異性評価強度の遺伝割合) \
                * 異性の親.の異性評価強度
            )

            # 突然変異する ※7-2-6
            if np.random.rand() < 突然変異率:
                .の権利主張 = get_権利主張(子の性別)
            if np.random.rand() < 突然変異率:
                .の異性評価強度 = get_異性評価強度(子の性別)

            (女子たち if 子の性別 == "女性" else 男子たち).append()
            .は経験済み = True
            .は経験済み = True
            
        女性の繁殖経験率_list.append(
            len([女性 for 女性 in 女性たち if 女性.は経験済み]) / len(女性たち)
        )
        男性の繁殖経験率_list.append(
            len([男性 for 男性 in 男性たち if 男性.は経験済み]) / len(男性たち)
        )

        # 世代交代
        女性たち = 女子たち
        男性たち = 男子たち

# ※8
# 整理 
女性の権利主張の平均値_list = np.array(女性の権利主張の平均値_list).\
                              reshape((試行回数, 最終世代+ 1)).mean(0).tolist()
男性の権利主張の平均値_list = np.array(男性の権利主張の平均値_list).\
                              reshape((試行回数, 最終世代+ 1)).mean(0).tolist()
女性の異性評価強度の平均値_list = np.array(女性の異性評価強度の平均値_list).\
                                  reshape((試行回数, 最終世代+ 1)).mean(0).\
                                  tolist()
男性の異性評価強度の平均値_list = np.array(男性の異性評価強度の平均値_list).\
                                  reshape((試行回数, 最終世代+ 1)).mean(0).\
                                  tolist()
法_list = np.array(法_list).reshape((試行回数, 最終世代+ 1)).mean(0).tolist()
女性の繁殖経験率_list = np.array(女性の繁殖経験率_list).\
                        reshape((試行回数, 最終世代+ 1)).mean(0).tolist()
男性の繁殖経験率_list = np.array(男性の繁殖経験率_list).\
                        reshape((試行回数, 最終世代+ 1)).mean(0).tolist()
女性の権利主張の平均値_list[0] = None
男性の権利主張の平均値_list[0] = None
女性の異性評価強度の平均値_list[0] = None
男性の異性評価強度の平均値_list[0] = None
女性の繁殖経験率_list[0] = None
男性の繁殖経験率_list[0] = None


# 可視化
plt.figure(figsize = (15, 10))

# 可視化 - 権利主張
ax = plt.subplot(2, 2, 1)
plt.plot(女性の権利主張の平均値_list, label = "女性", color = "r", alpha = 0.5)
plt.plot(男性の権利主張の平均値_list, label = "男性", color = "b", alpha = 0.5)
plt.xlabel("世代")
plt.ylabel("権利主張")
(y_min, y_max) = ax.get_ylim()
y_0 = - y_min / (y_max - y_min)
革命世代たち = [1] + 革命世代たち + [最終世代] 
for i in range(0, len(革命世代たち) - 1, 2):
    フェミ開始 = 革命世代たち[i]
    フェミ終了 = 革命世代たち[i+1]
    マス開始 = 革命世代たち[i+1]
    マス終了 = 革命世代たち[i+2]
    plt.axvspan(フェミ開始, フェミ終了, y_0, 1, color="r", alpha=0.1)
    plt.axvspan(フェミ開始, フェミ終了, 0, y_0, color="b", alpha=0.1)
    plt.axvspan(マス開始,   マス終了,   y_0, 1, color="b", alpha=0.1)
    plt.axvspan(マス開始,   マス終了,   0, y_0, color="r", alpha=0.1)
plt.legend()
plt.grid(True)
plt.title("権利主張 (赤背景: フェミニズム, 青背景: マスキュリズム)")

# 可視化 - 異性評価強度
plt.subplot(2, 2, 2)
plt.plot(
    女性の異性評価強度の平均値_list, label = "女性", color = "r", alpha = 0.5
)
plt.plot(
    男性の異性評価強度の平均値_list, label = "男性", color = "b", alpha = 0.5
)
plt.xlabel("世代")
plt.ylabel("異性評価強度")
for 革命世代 in 革命世代たち[1:-1]:
    plt.axvline(革命世代, 0, 1, lw = 1, color = "#cccccc", zorder = -1)
plt.legend()
plt.title("異性評価強度 (配偶者をどれだけ \"選んで\" いるか)")

# 可視化 - 法
ax = plt.subplot(2, 2, 3)
plt.plot(法_list, label = "", color = "g")
plt.xlabel("世代")
plt.ylabel("")
(y_min, y_max) = ax.get_ylim()
y_0 = - y_min / (y_max - y_min)
for i in range(0, len(革命世代たち) - 1, 2):
    フェミ開始 = 革命世代たち[i]
    フェミ終了 = 革命世代たち[i+1]
    マス開始 = 革命世代たち[i+1]
    マス終了 = 革命世代たち[i+2]
    plt.axvspan(フェミ開始, フェミ終了, y_0, 1, color="r", alpha=0.1)
    plt.axvspan(フェミ開始, フェミ終了, 0, y_0, color="b", alpha=0.1)
    plt.axvspan(マス開始,   マス終了,   y_0, 1, color="b", alpha=0.1)
    plt.axvspan(マス開始,   マス終了,   0, y_0, color="r", alpha=0.1)
plt.legend()
plt.grid(True)
plt.title("法 (赤背景: 女尊男卑, 青背景: 男尊女卑)")

# 可視化 - 繁殖経験率
plt.subplot(2, 2, 4)
plt.plot(女性の繁殖経験率_list, label = "女性", color = "r", alpha = 0.5)
plt.plot(男性の繁殖経験率_list, label = "男性", color = "b", alpha = 0.5)
plt.xlabel("世代")
plt.ylabel("繫殖経験率")
for 革命世代 in 革命世代たち[1:-1]:
    plt.axvline(革命世代, 0, 1, lw = 1, color = "#cccccc", zorder = -1)
plt.legend()
plt.title("繫殖経験率 (非処女・非童貞率)")

# 可視化 - 表示
plt.tight_layout()
plt.savefig("result.png")
plt.show()

コードの解説

※1 試行回数

試行回数 は 試行を繰り返す回数を表す。
結果のプロットでは、試行回数分の平均値をプロットする。

※2 評価値

市民が 異性を評価する際、 $1 - (仲悪い度)\times(異性評価強度)$ という式で $0~1$の評価値を算出している。遺伝的アルゴリズムでいうところの「評価」である。

互いの評価値が高いカップルから順に、繁殖の機会を得る。これは遺伝的アルゴリズムでいうところの「選択」である。

$(仲悪い度)$ は $0~1$ で、自分の権利主張と相手の権利主張がどれだけかけ離れているかを表す。
$(異性評価強度)$ は、$0~1$ どれだけ異性を「選り好み」するかを表す値で、親から遺伝する値である。
$(異性評価強度)$ が小さければ、どんなに仲の悪い相手であっても高く評価するし、
$(異性評価強度)$ が大きければ、仲の悪い相手を低く評価するようになる。

※3 権利主張 と ※4 異性評価強度

※3 と ※4 では、初期市民 (最初の世代で、親のいない市民) の権利主張や異性評価強度を決める関数を定義している。
初期市民の権利主張は、平均 $0$ 、標準偏差 $0.5$ の正規乱数としており、
初期市民の異性評価強度は、$0~1$ の一様乱数としている。

※5 繁殖コスト

※4 では、 市民の繁殖コストをランダムに決める関数を定義している。
この関数は、市民が繁殖する度に呼ばれるので、市民は繁殖する度にランダムなエネルギーを失うことになる。
女性と男性の非対称的な唯一の違いが、この繁殖コストの大きさである。

繁殖コストは、基本的に、正規乱数として決まる。この正規乱数の平均と標準偏差は、性別ごとに与えられたパラメータによって決まる。
但し例外として、正規乱数の値が $0.1$ を下回った場合は、正規乱数ではなく $0.1$ を繁殖コストとして採用している。

※6 都合革命

※5 では、都合革命を行う世代を 5つ定義している。
都合革命の起きる世代を毎回同じにするため、 np.random.seed(固定値) を設定している。

都合革命は、フェミニズムとマスキュリズムの符号を入れ替える、つまり「女性(男性)にとって都合のいい権利の方向」を入れ替えるものである。
これは例えば、「女性にとってプラス方向のほうが都合がいいときは法が増加していたのに、マイナス方向のほうが都合がよくなったとたん、法が減少し始めた」といったことが観測できれば、「法が女性の都合のいいように左右されている」といえるし、男性でも同様である。

革命世代を定義し終えたら、 np.random.seed(None) してから seed = (整乱数); print(seed); np.random.seed(seed)とすることで、再度 np.random にランダム性を持たせつつ、再現性のためにseedを公開している。

※7 実験

※7-1 で 女性たち男性たち を初期化し、
※7-2 で 最終世代 まで、 女性たち男性たち を進化させている。

※7-2-1 法の更新

※7-2-1 では、各市民の権利主張の平均値を「法改正」としている。
さらに、一世代前の「法」に「法改正」を加算することで、法を更新している。

仕様では、市民の権利主張は実数としたので、法改正も法も実数である。

※7-2-2 カップルの作成と並び替え

※7-2-2 では、まず list(itertools.product(女性たち, 男性たち)) により、
考えられるすべてのカップル、すなわち $(女性の人数)\times(男性の人数)$ 組のカップルを作成している。

次に各カップルを「円満度」が高い順に並び替えている。
円満度は 彼女による彼氏の評価値 と、彼氏による彼女の評価値の和 である。

円満度を求めることは、遺伝的アルゴリズムにおける「評価」に該当する。

※7-2-3 カップルから夫婦へ

※7-2-3 では、円満度の高いカップルから順に、実際に繁殖を行う夫婦を決めている。(遺伝的アルゴリズムにおける「選択」。)
但し、すべての女性のエネルギーが枯渇して、繁殖を行える妻が1人もいなくなる場合があるので、その場合はやむを得ず、初期市民をその場で作り、夫婦としている。

※7-2-4 子の性別を決める

※7-2-4 では、子の性別を決めている。
女子のほうが多ければ子は男子とし、
男子のほうが多ければ子は女子とし、
女子と男子が同人数の場合は、半分の確率で女子としている。

※7-2-5 交叉 と ※7-2-6 突然変異

※7-2-5 では遺伝的アルゴリズムにおける「交叉」を行っている。
ここで扱う遺伝子は「権利主張」と「異性評価強度」である。

権利主張の値については、次の式で決めている。

$(子の権利主張) = (同性の親からの遺伝成分) + (異性の親からの遺伝成分) + (バイアス)$
但し

  • $(同性の親からの遺伝成分) = (同性の親からの権利主張の遺伝割合) \times (同性の親の権利主張)$
  • $(異性の親からの遺伝成分) = (1 - (同性の親からの権利主張の遺伝割合)) \times (異性の親の権利主張)$
  • $(バイアス) = \left\{
    \begin{matrix}
    (単位フェミニズム) & {\rm when} & 子の性別が女性\\
    (単位マスキュリズム) & {\rm when} & 子の性別が男性
    \end{matrix}
    \right.$

であり、 $(同性の親からの権利主張の遺伝割合)$ は$0~1$のシミュレーションのパラメータである。

異性評価強度の値については、次の式で決めている。

$(子の異性評価強度) = (同性の親からの遺伝成分) + (異性の親からの遺伝成分)$
但し

  • $(同性の親からの遺伝成分) = (同性の親からの異性評価強度の遺伝割合) \times (同性の親の異性評価強度)$
  • $(異性の親からの遺伝成分) = (1 - (同性の親からの異性評価強度の遺伝割合)) \times (異性の親の異性評価強度)$

であり、 $(同性の親からの異性評価強度の遺伝割合)$ は$0~1$のシミュレーションのパラメータである。

※7-2-6 では遺伝的アルゴリズムにおける「突然変異」を行っている。
$0~1$ の一様乱数が、シミュレーションのパラメータとして与えられている 突然変異率 を下回った場合、
初期市民と同じ関数で 子の権利主張 や 子の異性評価強度 を決めている。

(※8以降)

※8以降は統計データを整理し、グラフを作成するためのコードであり、実験には直接関係ない

3-4. 実験1 まずは実験

次のパラメータで sss.py を実行する。

sss.pyのパラメータ
# シミュレーションのパラメータ
試行回数 = 1000
最終世代 = 100
一方の性別の人数 = 50
初期エネルギー = 100
女性の繫殖コストの平均 = 70
女性の繁殖コストの標準偏差 = 20
男性の繁殖コストの平均 = 2
男性の繁殖コストの標準偏差 = 1
突然変異率 = 0.1
同性の親からの権利主張の遺伝割合 = 0.5
同性の親からの異性評価強度の遺伝割合 = 0.9
seed = None

すると、図3-4-1の結果を得た。 (seed: 962840817)

図3-4-1.png
図3-4-1. 実験1における、権利主張、異性評価強度、法、および繫殖経験率の世代特性

補足

図3-4-1 は、1000回の試行の結果の平均値をプロットしたものである。
そのうち、最初の1回の試行の結果をプロットするには、シミュレーションのパラメータを次のようにすればよい。

sss.pyのパラメータ
# シミュレーションのパラメータ
試行回数 = 1 # 変更箇所1/2
最終世代 = 100
一方の性別の人数 = 50
初期エネルギー = 100
女性の繫殖コストの平均 = 70
女性の繁殖コストの標準偏差 = 20
男性の繁殖コストの平均 = 2
男性の繁殖コストの標準偏差 = 1
突然変異率 = 0.1
同性の親からの権利主張の遺伝割合 = 0.5
同性の親からの異性評価強度の遺伝割合 = 0.9
seed = 962840817 # 変更箇所2/2

実際にプロットすると、図3-4-2のようになる。

図3-4-2.png
図3-4-2. 実験1の第1試行のプロット

結果

  • 法は2~3世代遅れて、常に女性に都合のいい方向に進化している。
  • マスキュリズムを主張する男性は1世代で性淘汰され、男性の権利主張はフェミニズム方向に進化させられている。
  • 女性の権利主張は常にフェミニズム方向に進化している。
  • 女性の異性評価強度は男性よりも高い
    • 男性は女性の権利を主張する女性に寛容だが、女性は男性の権利を主張する男性に不寛容である。
  • 女性の繫殖経験率はほぼ1であり、男性の繁殖経験率はおよそ0.3である

左上のグラフ (権利主張)

図3-4-1における左上のグラフは、女性および男性の権利主張をプロットしたものである。

image.png
図3-4-1-左上. 性別別の権利主張の世代特性

例えば第1~17世代のように、プラスの範囲が赤背景███、マイナスの範囲が青背景███になっているのは、フェミニズムがプラス方向のときであり、
逆に第22~63世代のように、プラスの範囲が青背景███、マイナスの範囲が赤背景███になっているのは、フェミニズムがマイナス方向のときである。(参考: 図3-4-1-左上-2)

図3-4-1-左上-2.png
図3-4-1-左上-2. 参考図

第1世代及び都合革命世代の直後は、男女共に自身の都合のいい方向に権利主張が進化している。すなわち女性の権利主張はフェミニズム方向に進化していて、男性の権利主張はマスキュリズム方向に進化している。
しかしその後の世代では男女どちらの権利主張も、女性に都合のいいフェミニズム方向に進化している。
これは、マスキュリズム方向の主張をする男性が、女性により性淘汰されているためと考えられる。

右上のグラフ (異性評価強度)

図3-4-1における右上のグラフは、女性および男性の異性評価強度をプロットしたものである。

image.png
図3-4-1-右上. 性別別の異性評価強度の世代特性

第17,19,22,63,88世代に引かれている灰色の縦線は、その世代が都合革命世代であることを表している。

異性評価強度は、第1世代を除いて常に女性のほうが男性よりも高いことが分かる。
これは女性のほうが男性よりも、権利主張が似通わない異性を厳しく評価していることを定量的に示した結果となった。すなわち、男性は女性の権利を主張する女性に寛容である一方、女性は男性の権利を主張する男性に不寛容である。

また、各都合革命世代の2~3後において、一時的に男性の異性評価強度が上昇している。
これは、都合革命により女性の主張する権利が一時的に男性的なものとなり、女性と男性の主張が接近するため、比較的高い異性評価強度でも、男性が女性を高く評価できるようになっているからと考えられる。

左下のグラフ (法)

図3-4-1における左下のグラフは、法をプロットしたものである。

image.png
図3-4-1-左下. 法の世代特性

第1世代及び都合革命世代から2~3世代遅れて、常に女性の都合のいい方向に法が進化していることがわかる。
フェミニズムがプラス方向のときは法は増加し、フェミニズムがマイナス方向のときは法は減少している。

また、法そのものではなく法の差分(変化率, 傾き)である法改正をプロットしたものが 図3-4-3 である。

図3-4-3.png
図3-4-3. 法改正の世代特性

図3-4-3 をみると、第1世代や都合革命世代から世代が経過していくにつれて、法改正がおよそ単位フェミニズムに近づいていることが確認できる。

右下のグラフ (繫殖経験率)

図3-4-1における右下のグラフは、女性および男性の繫殖経験率をプロットしたものである。

image.png
図3-4-1-右下. 性別別の繫殖経験率の世代特性

女性の繁殖経験率は常にほぼ$1$であることが分かる。
一方、男性の繁殖経験率は第1世代及び都合革命世代の直後を除き、およそ$0.3$であることが分かる。

第1世代では、男女双方の権利主張が同じ分布 (平均$0$, 標準偏差$0.5$の正規分布) に従っていて似通っているため、多くの男性が女性から高い評価を受け、その結果男性の繫殖経験率が高くなっているものと考えられる。

第2世代では、男性の権利主張にマスキュリズム方向のバイアスがかかり、多くの男性が女性から低く評価された結果、男性の繁殖経験率が$0.2$ほどに減少していると考えられる。

第3~17世代まで、突然変異で女性に迎合する男性が出てきて、その男性が女性から高く評価されることで、男性の繁殖経験率が $0.3$ほどにまで徐々に上昇していると考えられる。

その後、都合革命が起きるたびに、第2世代および第3~17世代と同じことが起きて、「一度繫殖経験率が下がって、徐々に回復する」という傾向が観測されているものと考えられる。

3-5. 実験2 女性の競争率を上げてみる

実験1 では、女性の繁殖経験率がほぼ$1$で、男性の繫殖経験率が およそ $0.3$ と、かなり極端な違いがあった。現実社会ではここまでの乖離はないので、女性の繫殖経験率をもう少し下げ、男性の繫殖経験率をもう少し上げることを考えよう。

繁殖コストに手を付けずにこれを実現するには、初期エネルギーをもう少し大きくすればよい。

どうして初期エネルギーを増やすと、繫殖経験率の性差が小さくなるの?

実験1では、初期エネルギーが女性の繁殖コストとほとんど同じであったため、女性は$2$度以上繁殖することがあまりなかった。そのため、$50$人の子を作るために、$50$人の女性がほぼ $1$人ずつ子を作っていた。

そこで、初期エネルギーを増加させることで、女性に$2$度以上の繁殖を可能にさせてみる。すると例えば、女性Aさんが$2$人、女性Bさんが$3$人の子を作ることが考えられる。この場合、まだ繁殖していない女性は$48$人いるのに対し、残りの作れる子の人数は$50-(2+3)=45$人となる。よって、少なくとも $48-45=3$人の女性は子を$1$人も作れなくなり、女性の繁殖経験率は $1$ より低くなるのだ。

こうして女性の競争が激しくなると、女性が男性を選り好みしている余裕がなくなり(男性を選り好みしている女性ほど競争に負けやすくなる)、より多くの男性が女性から高い評価を受けるようになり、男性の繫殖経験率が上昇すると考えられる。

次のパラメータで sss.py を実行する。

sss.py のパラメータ
# シミュレーションのパラメータ
試行回数 = 1000
最終世代 = 100
一方の性別の人数 = 50
初期エネルギー = # 200, 400, 800, 1600, 3200 を順に試す
女性の繫殖コストの平均 = 70
女性の繁殖コストの標準偏差 = 20
男性の繁殖コストの平均 = 2
男性の繁殖コストの標準偏差 = 1
突然変異率 = 0.1
同性の親からの権利主張の遺伝割合 = 0.5
同性の親からの異性評価強度の遺伝割合 = 0.9
seed = None

すると、表3-5-1 のとおり結果を得た。

 

表3-5-1. 実験2の結果

初期エネルギー 1000回の試行結果の平均 seed 1回目の試行の結果
$200$ 図3-5-200-1 2562300219 図3-5-200-2
$400$ 図3-5-400-1 3621330707 図3-5-400-2
$800$ 図3-5-800-1 3118099625 図3-5-800-2
$1600$ 図3-5-1600-1 3035672697 図3-5-1600-2
$3200$ 図3-5-3200-1 4034655236 図3-5-3200-2

図3-5-200-1.png
図3-5-200-1. 初期エネルギー$200$の場合の各統計データの世代特性
 

図3-5-400-1.png
図3-5-400-1. 初期エネルギー$400$の場合の各統計データの世代特性
 

図3-5-800-1.png
図3-5-800-1. 初期エネルギー$800$の場合の各統計データの世代特性
 

図3-5-1600-1.png
図3-5-1600-1. 初期エネルギー$1600$の場合の各統計データの世代特性
 

図3-5-3200-1.png
図3-5-3200-1. 初期エネルギー$3200$の場合の各統計データの世代特性

各実験の第1試行の結果 (図3-5-(200~3200)-2)

図3-5-(200~3200)-1 は、それぞれ1000回の試行の結果の平均値をプロットしたものである。
そのうち、最初の1回の試行の結果をプロットしたものが、次の図3-5-(200~3200)-2 である。

図3-5-200-2.png
図3-5-200-2. 初期エネルギー$200$の場合の第1試行のプロット
 

図3-5-400-2.png
図3-5-400-2. 初期エネルギー$400$の場合の第1試行のプロット
 

図3-5-800-2.png
図3-5-800-2. 初期エネルギー$800$の場合の第1試行のプロット
 

図3-5-1600-2.png
図3-5-1600-2. 初期エネルギー$1600$の場合の第1試行のプロット
 

図3-5-3200-2.png
図3-5-3200-2. 初期エネルギー$3200$の場合の第1試行のプロット

ノイズが強く、法が男性に都合のいい方向に進化したり、男性が女性を選んだり、男性の繫殖経験率が女性を超えたりすることが起きている。

結果

  • 初期エネルギーが増えると、異性評価強度や繁殖経験率の性差は小さくなり、法の女尊男卑さ加減も小さくなる
  • 異性評価強度の性差が小さくても、繫殖経験率の性差がある(男性の競争が女性と比較して激しい)限り、法は女性の都合のいいように左右される

各統計データの初期エネルギー特性

sss.py の最後に次のコードを追加した sss_v2.py をにて各実験を再実行すると、各統計データが初期エネルギーに応じて、世代全体の平均としてどのように変化するかを確認することが出来る。 (再現性のため、seed を各実験のものに合わせて設定する。)

(コードを表示するにはここをクリック)
sss.py の最後に追加する内容 (sss_v2.py)
# 法の女尊男卑進化平均速度
法改正_list = [0]
単位フェミニズム = 1
for 世代 in range(1, len(法_list)):
    if 世代 in 革命世代たち[1:-1]:
        単位フェミニズム *= -1
    法改正 = 法_list[世代] - 法_list[世代-1]
    法改正 *= 単位フェミニズム
    法改正_list.append(法改正)
print(f"法の女尊男卑進化平均速度: {np.mean(法改正_list[1:])} 単位/世代")

# 性別別平均繁殖経験率
print(f"女性の平均繁殖経験率: {np.mean(女性の繁殖経験率_list[1:])}")
print(f"男性の平均繁殖経験率: {np.mean(男性の繁殖経験率_list[1:])}")

# 性別別平均異性評価強度
print(f"女性の平均異性評価強度: {np.mean(女性の異性評価強度の平均値_list[1:])}")
print(f"男性の平均異性評価強度: {np.mean(男性の異性評価強度の平均値_list[1:])}")

# 性別別権利主張の平均強度
女性のフェミニズム度_list = [0]
男性のマスキュリズム度_list = [0]
単位フェミニズム = 1
for 世代 in range(1, len(法_list)):
    if 世代 in 革命世代たち[1:-1]:
        単位フェミニズム *= -1
    女性のフェミニズム度 = 女性の権利主張の平均値_list[世代] * 単位フェミニズム
    男性のフェミニズム度 = 男性の権利主張の平均値_list[世代] * 単位フェミニズム
    女性のフェミニズム度_list  .append(  女性のフェミニズム度)
    男性のマスキュリズム度_list.append(- 男性のフェミニズム度)
print(f"女性の平均フェミニズム度:   {np.mean(女性のフェミニズム度_list  [1:])}")
print(f"男性の平均マスキュリズム度: {np.mean(男性のマスキュリズム度_list[1:])}")

法の女尊男卑進化速度
法が$1$世代あたりにどれだけ女性に都合のいい方向に進化しているかを数値化したもの。
「法改正が単位フェミニズムの何倍であるか」の平均値。
この値が
$0$より大きければ大きいほど、法は女性の都合のいい方向に進化していると言えるし、
$0$より小さければ小さいほど、法は男性の都合のいい方向に進化していると言えるし、
$0$に近ければ、法の進化は女性や男性の都合にあまり関係ないと言える。

平均フェミニズム度と平均マスキュリズム度
平均フェミニズム度は、女性の、女性に都合のいい権利主張の平均的な強さを表し、
平均マスキュリズム度は、男性の、男性に都合のいい権利主張の平均的な強さを表す。
(平均フェミニズム度: 女性の権利主張の単位フェミニズム倍の平均値
平均マスキュリズム度: 男性の権利主張の単位マスキュリズム倍の平均値)
これらの値が
$0$より大きければ大きいほど、自分の性別に都合のいい権利を主張しているといえるし、
$0$より小さければ小さいほど、異性に迎合しているといえるし、
$0$に近ければ、中立的な権利主張をしているといえる。

sss_v2.py の結果を表にまとめると、表3-5-2のとおり
 
 
表3-5-2. 初期エネルギーと各統計データの比較
表3-5-2.png

法の女尊男卑進化速度、女性の平均フェミニズム度、男性の平均マスキュリズム度をプロットすると、図3-5-3のように指数関数(の逆数)に近い特性が観測された。

図3-5-3.png
図3-5-3. 法の女尊男卑進化速度、女性の平均フェミニズム度、男性の平均マスキュリズム度の初期エネルギー特性

初期エネルギーが小さいほど、女性の平均フェミニズム度が高い一方、男性の平均マスキュリズム度が低いため、法の女尊男卑進化速度は速い。
逆に初期エネルギーが大きいほど、女性の平均フェミニズム度が減少し、男性の平均マスキュリズム度が増加して女性の平均フェミニズム度に近づいているため、釣り合いが取れることにより、法の女尊男卑進化速度は$0$に近づいている。
 

また、性別別の平均繫殖経験率をプロットすると、図3-5-4のとおりになった。

図3-5-4.png
図3-5-4. 性別別の平均繫殖経験率の初期エネルギー特性

初期エネルギーが小さいときは繫殖経験率性差 (女性の平均繫殖経験率 - 男性の平均繫殖経験率)が大きいが、初期エネルギーが大きくなるにつれて女性の平均繫殖経験率が減少し、反対に男性の平均繁殖経験率が増加し、性差が$0$ に近づいている。

この特性については、本節(3-5節)の最初に示した折り畳み「どうして初期エネルギーを増やすと、繫殖経験率の性差が小さくなるの?」のとおり説明がつく。

どうして初期エネルギーを増やすと、繫殖経験率の性差が小さくなるの? (再掲)

実験1では、初期エネルギーが女性の繁殖コストとほとんど同じであったため、女性は$2$度以上繁殖することがあまりなかった。そのため、$50$人の子を作るために、$50$人の女性がほぼ $1$人ずつ子を作っていた。

そこで、初期エネルギーを増加させることで、女性に$2$度以上の繁殖を可能にさせてみる。すると例えば、女性Aさんが$2$人、女性Bさんが$3$人の子を作ることが考えられる。この場合、まだ繁殖していない女性は$48$人いるのに対し、残りの作れる子の人数は$50-(2+3)=45$人となる。よって、少なくとも $48-45=3$人の女性は子を$1$人も作れなくなり、女性の繁殖経験率は $1$ より低くなるのだ。

こうして女性の競争が激しくなると、女性が男性を選り好みしている余裕がなくなり(男性を選り好みしている女性ほど競争に負けやすくなる)、より多くの男性が女性から高い評価を受けるようになり、男性の繫殖経験率が上昇すると考えられる。

  また、性別別の平均異性評価強度をプロットすると、図3-5-5のとおりとなった。

図3-5-5.png
図3-5-5. 性別別の平均異性評価強度の初期エネルギー特性

初期エネルギーが増えるにつれて、異性評価強度性差 (女性の平均異性評価強度 - 男性の平均異性評価強度) が小さくなっている ($0$に近づいている)ことが確認できた。

初期エネルギーが$100~400$ の間は初期エネルギーが増えるほど男女共に異性評価強度が減少しているものの$400$ 以降は逆に異性評価強度が男女共に微妙に増加している。
(何度か seed を変えて追試を行っても同様の傾向が確認されている)

  • 本来、女性は初期エネルギーが高くなるほど異性を選ぶ余裕がなくなるので異性評価強度が低くなるはずなので、 $400$ 以降の特性 (初期エネルギーが増えると異性評価強度が高くなる) は不思議だ
  • 本来、男性は初期エネルギーが高くなるほど(相対的に)異性を選ぶ余裕が出てきて異性評価強度が高くなるはずなので、$100~400$の間の特性(初期エネルギーが増えると異性評価強度が減少する)は不思議だ

考えられる理由としては、異性評価強度が僅か ($1 - 0.9 = 0.1$の割合)ながらも異性の親から遺伝することで、異性に見られるべき特性が逆の性別にも反映されていることなどが挙げられるが、より良い考察をお持ちの方がいれば、是非コメントいただきたい。
 

さらに、女性と男性の平均繫殖経験率の差(繫殖経験率性差)と法の女尊男卑進化速度の関係を視覚化するために図3-5-6の散布図を作成した。

図3-5-6.png
図3-5-6. 繁殖経験率性差と法の女尊男卑進化速度の散布図

図3-5-6から、繫殖経験率性差が大きい、つまり女性の平均繫殖経験率が男性よりも高く、男性の競争が激しいほど、法の女尊男卑進化速度も速くなることが確認できた。
 

また、女性と男性の平均異性評価強度の差(異性評価強度性差)と法の女尊男卑進化速度の関係を視覚化すると、図3-5-7 のようになった。

図3-5-7.png
図3-5-7. 異性評価強度性差と法の女尊男卑進化速度の散布図

異性評価強度性差は$0$付近に集中していたため、$0$付近を拡大できる「対数グラフ」という方法を使って図3-5-7を作った。

異性評価強度性差が大きい、つまり女性の平均異性評価強度が男性よりも高いほど、法の女尊男卑進化速度も速くなることが確認できた。

また、異性評価強度性差がほとんど$0$であっても、大きな法の女尊男卑進化速度が得られる ことが確認できた。たとえば、異性評価強度性差が $0.01$ 未満であっても、 約 $0.6$ の法の女尊男卑進化速度が観測されている。
これは、女性が男性をそこまで強く選り好みしていない場合であっても、男性の競争が激しければ、それだけで法は女性に都合のいい方向に進化するということを示唆している。
 

最後に、繁殖経験率性差と異性評価強度性差の関係性を、図3-5-8 に示す。

図3-5-8.png
図3-5-8. 繫殖経験率性差と異性評価強度性差の散布図

繁殖経験率性差がある程度開いていても、異性評価強度性差はあまり開かないことが分かる。

3-6. 実験3 フェミ騎士という種類の男性たち

実験1,2では、子の権利主張の「性別によるバイアス」が、単位フェミニズムまたは単位マスキュリズムで固定値だった。
これを「平均が単位フェミニズム(単位マスキュリズム), 標準偏差1の正規乱数」に置き換えるとどうなるだろうか。

これを行うには、 sss_v2.py のコードを次のように置き換えた sss_v3.py を用意すればよい。

(コードの置き換え部分を表示するにはここをクリック)
sss_v3.py ※7-2-5を次のようにする
            # 交叉する ※7-2-5
            .の権利主張 = (
                同性の親からの権利主張の遺伝割合       * 同性の親.の権利主張
            ) + (
                (1 - 同性の親からの権利主張の遺伝割合) * 異性の親.の権利主張
            ) + np.random.normal( # 変更点
                単位フェミニズム if 子の性別 == "女性" else 単位マスキュリズム
            ,1)                   # 変更点
            .の異性評価強度 = (
                同性の親からの異性評価強度の遺伝割合 \
                * 同性の親.の異性評価強度
            ) + (
                (1 - 同性の親からの異性評価強度の遺伝割合) \
                * 異性の親.の異性評価強度
            )

これを、次のパラメータで実行する。

sss_v3.pyのパラメータ
# シミュレーションのパラメータ
試行回数 = 1000
最終世代 = 100
一方の性別の人数 = 50
初期エネルギー = 200
女性の繫殖コストの平均 = 70
女性の繁殖コストの標準偏差 = 20
男性の繁殖コストの平均 = 2
男性の繁殖コストの標準偏差 = 1
突然変異率 = 0.1
同性の親からの権利主張の遺伝割合 = 0.5
同性の親からの異性評価強度の遺伝割合 = 0.9
seed = None

すると、図3-6-1の結果を得た。 (seed: 917242261)

図3-6-1.png
図3-6-1. 実験3における、権利主張、異性評価強度、法、および繫殖経験率の世代特性

第1試行の結果 (図3-6-2) 図3-6-1 は、1000回の試行の結果の平均値をプロットしたものである。 そのうち、最初の1回の試行の結果をプロットしたものが、次の図3-6-2 である。

図3-6-2.png
図3-6-2. 実験3における、第1試行のプロット

結果

第1世代および都合革命世代から10数世代経過すると、男性が$0$をまたいで、フェミニズムを主張するようになっている。
例えば、第15世代では、マスキュリズムがマイナス方向であるにもかかわらず、男性がプラス(フェミニズム)の主張をしている。

これは、権利主張の性別によるバイアスを正規乱数にした結果、「男性なのに女性に都合のいい主張をする男性」が出現し、これが女性に高く評価された結果であると考えられる。

このように、女性にモテたいために女性に迎合する男性のことを「フェミ騎士」といったりする。

4. まとめ 権利の上に眠る者は、保護に値せず

如何だっただろうか。この記事では、「社会学的な女性の不遇」の前に、「性淘汰による生物学的な男性の不遇」があり、これがマスキュリズム(男性の権利擁護運動)の発展を妨げている可能性があることを実験的に示したつもりである。

女性のほうが男性よりも繁殖機会が限られている限り、男性のほうが女性よりも配偶者獲得のための競争が激しくなり、そのことが男性の権利主張を妨げ、結果として女性の権利主張だけが大きな声となってしまうことが実験で確認できた。
 

よくある誤解として「フェミニズムは男女平等主義である」というものがある。しかし、フェミニズムは素直に訳せば「フェミニン(女性の立場の) + イズム(主張)」である。

法哲学には、「権利の上に眠る者は、保護に値せず」という格言がある。男性が権利の上に眠り続ける(マスキュリン(男性の立場の) + イズム(主張) を怠り続ける)限り、女性ばかりが保護され、男性は保護されなくなってしまう。

「女性と男性の裁判」に例えるなら、フェミニズムは「男女平等な裁判官」ではなく、「女性側の弁護士」である。
マスキュリズムが「男性側の弁護士」となり、勇気をもって弁論に望まなければ、この裁判は女性に有利に偏ってしまう。

だからこそ、男性はフェミニストの言いなりにならず、男性の視点からジェンダー平等をもっと考え、主張していく必要があると筆者は考える。

そしてジェンダー論界隈の女性は、平等を主張するのであれば、「性淘汰による男性の弱い立場」に気づき、ジェンダー論にもっと男性(フェミ騎士を除く)の意見を取り入れるようにすべきだと筆者は考える。

  • 「ジェンダー学会の事務局を女子大の内部に設置する」という露骨な男性排斥をしておきながら、「平等」を主張するのはもうやめよう
  • 「企業の管理職の女性比率が低い」ことを問題視するのであれば、「ジェンダー研究者の男性(フェミ騎士を除く)比率が低い」ことも問題視しよう

そして筆者自身も、一人の男性プログラマとして、プログラミングや工学の観点から、これからも男性の弱い立場を解き明かし、それを社会に訴えていく活動を続けていく所存である。

  1. https://www.cram-school-anfini.com/2017/01/13/%E9%AB%98%EF%BC%93%E7%94%9F%E3%81%A8%E7%94%B7%E6%80%A7%E5%8F%97%E9%A8%93%E8%80%85%E3%81%AF%E8%A6%81%E6%B3%A8%E6%84%8F-%E7%9C%8B%E8%AD%B7%E5%AD%A6%E6%A0%A1%E5%8F%97%E9%A8%93%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4/

  2. https://ja.wikipedia.org/wiki/%E6%80%A7%E6%B7%98%E6%B1%B0#%E6%80%A7%E6%B7%98%E6%B1%B0%E3%81%AE%E5%8E%9F%E5%9B%A0

  3. 人間において、女性と男性のどちらがより異性を性淘汰してきたかについては、歴史的には諸説あるが、現代では性的二形や実効性比、Y染色体とミトコンドリアDNAの世界的な分布の差などから、他の動物と同じように男性がより強く選択されたと考えられているそうだ。

  4. これらは「権利のための闘争」という著に現れる主張である 2

  5. あくまでも例え話である。実際の乱数生成アルゴリズムが本当に予め乱数列を用意しているわけではない。乱数生成アルゴリズムにおけるシードの意味や、シードが実際にはどのように使われているかを知りたければ、例えば次の記事がおすすめである。 https://acompany.tech/privacytechlab/pseudorandom-number_1

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?