ハンドコーディング戦略 vs IPD/GA






更新情報
  • [2007-01-15] 作成中・・・.
  • [2007-01-15] 公開.
  • [2007-01-16] ソースを更新(0Readme_ja.txt 修正)
  • [2007-01-16] FAQ を追加(gnuplot トラブルへの対応策).
  • [2008-01-22] ソースを更新(利得計算表を修正)
  • [2008-01-28] FAQ を追加(gnuplot トラブル2).
  • [2013-01-18] gnuplot出力形式をsvgに変更。
  • [2014-01-07] ソースを更新(記憶数3への対応。ただしHTML出力される詳細分析結果は未対応




課題内容

課題と進め方
  1. 繰り返し囚人のジレンマ IPD において,どのような相手(戦略)に対しても勝利できる強い戦略を検討し,考えた戦略がどのような手を取るのか論じよ.なお,戦略を検討するにあたり,「過去2回までの手」を考慮できるものとし,表1「戦略マトリックス」を参照し,21項目全てに対してどういう手を取るのかを設定すること.
  2. 1で設定した戦略を GA に組み込むため,01からなるバイナリストリングとしてコーディングせよ.なお,GAの遺伝子型では「協調=0」,「裏切り=1」として表現し,表1の上から下方向へ列挙することで染色体を作成せよ.TFTの例では「0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1」となる.
  3. サンプルプログラムをダウンロードし,2で作成した戦略の強さを検証せよ.使い方はここを参照.
  4. 実行結果(順位推移)より,合理的エージェントを構築するためのポイントについて考察せよ.


表1:戦略マトリックスとTFTのコーディング例
条件(自分、相手) TFT あなたの戦略
前々回 前回
無し(初回の行動選択) 協調(0)
無し(2回目の行動選択) (協調、協調) 協調(0)
(協調、裏切り) 裏切り(1)
(裏切り、協調) 協調(0)
(裏切り、裏切り) 裏切り(1)
(協調、協調) (協調、協調) 協調(0)
(協調、裏切り) 裏切り(1)
(裏切り、協調) 協調(0)
(裏切り、裏切り) 裏切り(1)
(協調、裏切り) (協調、協調) 協調(0)
(協調、裏切り) 裏切り(1)
(裏切り、協調) 協調(0)
(裏切り、裏切り) 裏切り(1)
(裏切り、協調) (協調、協調) 協調(0)
(協調、裏切り) 裏切り(1)
(裏切り、協調) 協調(0)
(裏切り、裏切り) 裏切り(1)
(裏切り、裏切り) (協調、協調) 協調(0)
(協調、裏切り) 裏切り(1)
(裏切り、協調) 協調(0)
(裏切り、裏切り) 裏切り(1)






実行環境とサンプルプログラムの使い方

実行環境

以下の環境にて,*一応*動作確認済みですが, オリジナルと互換性を持たそうとした部分に関してはまだバグが残っている可能性がありますので,気づいた方は連絡ください.

特殊な関数は使っていないはずなので,ANSI C コンパイラがある環境なら大抵動くと思います.

  • OS: Mac OS X 10.8.5
  • gcc: Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)

サンプルプログラムの使い方

  1. ソースダウンロード

    学科リポジトリからダウンロードするか、hg clone でリポジトリのクローンを作成して利用してください。

    # youraccountは各自のアカウントを指定すること。
    hg clone ssh://youraccout@shell//net/home/hg/teacher/tnal/vsIPD
    cd vsIPD
    
  2. ファイル hand.pop の2行目に作成した戦略を書き込む.

    1行目はTFTを記載してありますので,消さないでください.

  3. コンパイル
    make test_bestpop
  4. 実行例
    ./run-bestpop.sh  1  1  100  hand.pop  2
    • 引数1個目(上記 1):集団作成用シード値
    • 引数2個目(上記 1):GA動作用シード値
    • 引数3個目(上記 100):終了世代数
    • 引数4個目(上記 hand.pop):戦略を書き込んだファイル名
    • 引数5個目(上記 2):読み込む戦略数

      TFTを含めた集団内での強さを確認するため,引数5は2以上にしてください.勿論,3個以上の戦略を読み込ませたい場合には, hand.pop に3個以上記載されている必要があります.

  5. シェルスクリプト実行後,output-ro_si_no ディレクトリ以下に実行結果が保存される.各ファイルの説明は以下の通り.今回の実験で最低限確認する必要があるのは赤文字のみ.
    1-1-100-best.pop-2-ro_si_no            #全体ファイル
    1-1-100-best.pop-2-ro_si_no.html       #サマリ
    1-1-100-best.pop-2-ro_si_no.max        #最大適応度推移
    1-1-100-best.pop-2-ro_si_no.svg        #最大適応度推移図
    1-1-100-best.pop-2-ro_si_no_1st.fit    #初期世代の適応度
    1-1-100-best.pop-2-ro_si_no_1st.pop    #初期世代の集団全体
    1-1-100-best.pop-2-ro_si_no_2.svg      #最大適応度時集団における適応度分布
    1-1-100-best.pop-2-ro_si_no_best.fit   #最大適応度時集団における適応度
    1-1-100-best.pop-2-ro_si_no_best.pop   #最大適応度時集団における全個体
    
    1-1-100-best.pop-2-ro_si_no_rank.svg   #下記の推移図
    1-1-100-best.pop-2-ro_si_no_rank0.txt  #戦略0番目(TFT)の順位推移
    1-1-100-best.pop-2-ro_si_no_rank1.txt  #戦略1番目(オリジナル戦略)の順位推移
    
    
  6. 強さの確認方法

    上記赤字の〜rank.svgは,TFTやオリジナルに作成した戦略が集団内においてどの程度の強さであったかを順位で表示しています. この順位の推移により強さを確認してください.

  7. 補足(オリジナルとの関連について)

    このプログラムは「情報工学実験III(進化計算班)」において学生が作成したシステム IPD を改変して作成しました. オリジナルの説明やソースを使いたい学生はアーカイブ公開ページにて公開していますので,参照してください. ソースコードの資料に関しては html/index.html をブラウザで参照することも出来ます.

記憶数の変更方法

デフォルトでは記憶数2として設定されている。記憶数を3に増やしたい場合には以下のように変更すること。逆に記憶数を3から2へ減らしたい場合には、以下を逆に行ってください。
  • parameter.h
    • MEM を 2 から 3 へ。
    • GENE_LENGTH を 21 から 85 へ。
  • run-bestpop.sh で実行する際に与える第4引数(戦略)を hand.pop から hand.pop3 へ。





注意点

  • [2014-01-07] MEM と GENE_LENGTH を変更するだけで記憶数の変更に対応できるはずですが、記憶数2と3しか動作確認はしていません。
  • [2014-01-07] 出力結果を分析する perlスクリプト (make_rank.pl)は未対応です。記憶数3時に生成される分析結果(HTMLファイル)は正しくありません。





FAQ

gnuplot で svg の図が出力できない場合
run-bestpop.sh と make_rank.pl 内の「svg」を「gif」や「jpeg」等に置換してください.ただし、レポート(tex)に組み込む際にはpostscript等のベクター形式にしましょう。
gnuplot で「line 0: invalid color spec, must be xRRGGBB」というエラーが出力され,図が作成できない場合.
具体的には,
gnuplot> set terminal png small picsize 640 480
^
line 0: invalid color spec, must be xRRGGBB
というエラーが出る場合の対処例です.
run-bestpop.sh 内で出力形式を指定している箇所を以下のように修正して試してみてください.
修正前: set terminal png small color picsize 640 480
修正後: set terminal png