/*********************************************************************/ /* */ /* マルチエージェントシミュレータ Version 1.0 */ /* */ /*********************************************************************/ //------------------ コンポーネントツリー --------------- WORLD { space 空間(10,10),SQUARE_2D(12, 12, LOOP) { agent PLAYER(10,10)[0] { dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); dim 戦略(10,10) AS Integer = (0); dim 戦略_B(10,10) AS Integer = (0); dim 履歴(10,10)[501][8] AS Integer = (4008*0); dim 点数(10,10) AS Integer = (0); } } dim 対戦回数(10,10) AS Integer = (0); dim 戦略(10,10)[50] AS Integer = (50*0); dim 結果(10,10)[6] AS Integer = (6*0); dim 対戦ステップ(10,10) AS Integer = (0); dim シャッフル(10,10) AS Boolean = (0); } //------------------ コンポーネントパレットツリー --------------- //------------------ エージェント変数初期値データ --------------- INITIAL_VALUE { WORLD.対戦回数 = 1(10); WORLD.戦略 = 1(50*0); WORLD.結果 = 1(6*0); WORLD.対戦ステップ = 1(0); WORLD.シャッフル = 1(71708672); } //------------------ エージェント共通ルール --------------- #begin_rule common_agent_rule Function SetLog(mset as integer, oset as integer) as integer{ Dim i as integer if mset == 1 then if oset == 1 then i = 1 else i = 2 end if else if oset == 1 then i = 3 else i = 4 end if end if return(i) } //自分のログ Function GetMLog(Log as integer) as integer{ Dim i as integer if Log == 1 OR Log == 2 then i = 1 else i = 2 end if return(i) } //相手のログ Function GetOLog(Log as integer) as integer{ Dim i as integer if Log == 1 OR Log == 3 then i = 1 else i = 2 end if return(i) } // RGB値指定 Function RGB(red As Integer, green As Integer, blue As Integer) As Integer { Return(red * (256^2) + green * 256 + blue) } //裏切りの回数を数える //未完 //Function countDef(Obj as object, pn as integer) as integer{ // Dim i as integer // Dim j as integer // i = 0 // For j = 1 to world.対戦ステップ - 1 // if GetOLog(Obj.履歴(world.対戦ステップ-1,pn)) == 2 then i = J +1 end if // next j // return(i) //} //対戦回数の和を求める(練習用  //Function sum_steps(a as integer) as integer{ // Dim i as integer // for i =0 to world.対戦ステップ -1 // a = a + world.対戦ステップ // next i // return(a) //} //戦略関数の定義 //i=1が協調(C)、i=2が裏切り(D) Function Str_TFT(obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ > 1 then i = GetOLog(obj.履歴(world.対戦ステップ - 1,pn)) else i = 1 end if return(i) } //T2FT //基本はTFTだが、2回続けて裏切られて初めて裏切り返す Function Str_T2FT(Obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ>= 3 then if GetOLog(obj.履歴(world.対戦ステップ-1,pn)) == 2 AND GetOLog(obj.履歴(world.対戦ステップ-2,pn)) == 2 then i = 2 else i = GetOLog(obj.履歴(world.対戦ステップ - 1,pn)) end if else i = 1 end if return(i) } //hardTFT //最初の2回は協調。最近の相手の二回の手で一回でも裏切りなら裏切り。それ以外は協調。 Function Str_hardTFT(Obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ>= 3 then if GetOLog(obj.履歴(world.対戦ステップ-1,pn)) == 2 AND GetOLog(obj.履歴(world.対戦ステップ-2,pn)) == 1 then i = 2 elseif GetOLog(obj.履歴(world.対戦ステップ-1,pn)) == 1 AND GetOLog(obj.履歴(world.対戦ステップ-2,pn)) == 2 then i = 2 else i = GetOLog(obj.履歴(world.対戦ステップ - 1,pn)) end if else i = 1 end if return(i) } //2CforD //最初はC。相手が二回続けてCならD Function Str_2CforD(Obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ > 3 then if GetOLog(obj.履歴(world.対戦ステップ - 1,pn)) == 1 AND GetOLog(obj.履歴(world.対戦ステップ - 2,pn)) == 1 then i = 2 else i = 1 end if else i = 1 end if return(i) } Function Str_Freedman(Obj as object, pn as integer) as integer{ // 相手が一度でもDならその後自分はずっとD Dim i as integer Dim j as integer i = 1 For j = 1 to world.対戦ステップ - 1 //過去の履歴に裏切られた経験があれば、裏切りつづける if GetOLog(Obj.履歴(j,pn)) == 2 then i = 2 end if next j return(i) } //相手が2度DならずっとD Function Str_softFreedman(Obj as object, pn as integer) as integer{ Dim i as integer Dim j as integer i = 1 For j = 1 to world.対戦ステップ - 1 if GetOLog(Obj.履歴(world.対戦ステップ -1, pn)) == 2 AND GetOLog(obj.履歴(world.対戦ステップ -2, pn)) == 2 then i = 2 end if next j return(i) } Function Str_Yossu(Obj as object, pn as integer) as integer{ // 相手がDなら次回はD、相手がCなら90%C 10%D Dim i as integer if world.対戦ステップ > 2 then if GetOLog(Obj.履歴(world.対戦ステップ - 1,pn)) == 2 then i = 1 end if if GetOLog(Obj.履歴(world.対戦ステップ - 1,pn)) == 1 then if int(rnd()*10) == 0 then i = 2 else i = 1 end if end if else if int(rnd()*10) == 0 then i = 2 else i = 1 end if end if return(i) } Function Str_Tester(Obj as object, pn as integer) as integer{ // 最初はD 相手がDなら次回自分はC その後はTFT //      相手がCなら次回次々回はC その後一回おきD Dim i as integer if world.対戦ステップ == 1 then i = 2 else if GetOLog(Obj.履歴(2,pn)) == 2 then if world.対戦ステップ == 2 then i = 1 else i = GetOLog(Obj.履歴(world.対戦ステップ - 1,pn)) end if else if world.対戦ステップ == 2 then i = 1 elseif world.対戦ステップ mod 2 == 1 then i = 2 else i = 1 end if end if end if return(i) } //CDCDCD... periodic CD Function Str_perCD(obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ mod 2 == 0 then i = 2 elseif world.対戦ステップ mod 2 == 1 then i = 1 end if return(i) } //DCCDCDCD.. periodic DC Function Str_perDC(obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ mod 2 == 0 then i = 1 elseif world.対戦ステップ mod 2 == 1 then i = 2 end if return(i) } //CDDCDD.. periodic CDD Function Str_perCDD(obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ mod 3 == 1 then i = 1 else i = 2 end if return(i) } //CCDCCD.. periodic CCD Function Str_perCCD(obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ mod 3 == 0 then i = 2 else i = 1 end if return(i) } //M.Nowak and K.SigmundによるPavlov戦略 //有田隆也「人工生命」P133よ //自分の前回の手 相手の前回の手 Pavlov TFT // C C C C // C D D C // D C D C // D D C C Function Str_Pavlov(obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ > 1 then // CCC if GetMlog(obj.履歴(world.対戦ステップ - 1,pn)) == 1 and GetOlog(obj.履歴(world.対戦ステップ - 1,pn)) ==1 then i=1 elseif //CDD GetMlog(obj.履歴(world.対戦ステップ - 1,pn)) == 1 and GetOlog(obj.履歴(world.対戦ステップ - 1,pn)) ==2 then i=2 elseif //DCD GetMlog(obj.履歴(world.対戦ステップ - 1,pn)) == 2 and GetOlog(obj.履歴(world.対戦ステップ - 1,pn)) ==1 then i=2 elseif //DDC GetMlog(obj.履歴(world.対戦ステップ - 1,pn)) == 2 and GetOlog(obj.履歴(world.対戦ステップ - 1,pn)) ==2 then i=1 end if else i = 1 end if return(i) } //Worse and worse //最初は協調.相手が裏切るにつれて、裏切り確率が上昇する //裏切り回数をカウントするcountDef //Function Str_Worse(obj as object, pn as integer) as integer{ // Dim i as integer // //} //Gradual //最初は協調 //2手目以降は、相手が協調を前回出したなら協調。 //もし前回の相手が裏切りの場合 //それがn回目の裏切りならばn回裏切りつづけ、その後2奄ヘ強協調 //記憶を必要とする //裏切り回数をカウントするcountDef //Function Str_Gradual(obj as object, pn as integer) as integer{ // Dim i as integer // if world.対戦ステップ>2 then //} //forgiving //TFTの改良版 //何回か報復したら忘れる(許す) //相手が5回Dを続けたら、再び協調しようとするCC //繰り返し戦略は搾取する(未完) Function Str_Forgive(Obj as object, pn as integer) as integer{ Dim i as integer if world.対戦ステップ >= 5 then if GetOLog(obj.履歴(world.対戦ステップ -5, pn)) ==2 AND GetOLog(obj.履歴(world.対戦ステップ -4, pn)) ==2 AND GetOLog(履歴(world.対戦ステップ -3,pn)) == 2 AND GetOLog(obj.履歴(world.対戦ステップ-2,pn)) == 2 AND GetOLog(履歴(world.対戦ステップ -1,pn)) == 2 then i = 1 //一度Cを返す(本当は二度続ける) else i = GetOLog(obj.履歴(world.対戦ステップ - 1,pn)) end if else i = 1 end if return(i) } #end_rule common_agent_rule //------------------ エージェントルール --------------- #begin_rule WORLD //各戦略の定義は「共通ルールエディタ」で編集されている //戦略を増やす場合は、world.戦略 の配列数を下記の戦略数より多くしなければいけない Agt_Init{ dim i as integer, j as integer, ic as integer, n as integer n = 0 i = 0 //空間の大きさだけエージェントを配置 Do while n < _GetWidthSpace(world.空間) * _GetHeightSpace(world.空間) _CreateAgent(world.空間.PLAYER) if i == 0 then ic = COLOR_BLUE end if if i == 1 then ic = COLOR_RED end if if i == 2 then ic = COLOR_GREEN end if if i == 3 then ic = COLOR_YELLOW end if if i == 4 then ic = COLOR_CYAN end if if i == 5 then ic = COLOR_MAZENTA end if if i == 6 then ic = RGB(0,150,100) end if if i == 7 then ic = RGB(100,100,50) end if if i == 8 then ic = RGB(100,100,100) end if if i == 9 then ic = RGB(100,100,150) end if if i == 10 then ic = RGB(100,100,200) end if if i == 11 then ic = RGB(100,100,250) end if if i == 12 then ic = RGB(150,0,0) end if if i == 13 then ic = RGB(150,100,0) end if if i == 14 then ic = RGB(200,0,200) end if if i == 15 then ic = RGB(250,100,50) end if world.空間.PLAYER.戦略(n) = ic world.空間.PLAYER.戦略_B(n) = ic n = n + 1 //i=戦略数-1 if i == 15 then i = 0 else i= i + 1 end if Loop _RandomPutAgent(world.空間.PLAYER,false) } Agt_Step{ dim i as integer, j as integer,k as integer world.結果(1)=0 world.結果(2)=0 //対戦ステップ=(現在のステップ数÷対戦回数)の余り(新規分を数える) //現在54ステップ、対戦回数30ならば24というようにコピー後の回数をかぞえる world.対戦ステップ = _GetCountStep() mod world.対戦回数 if world.対戦ステップ == 0 then world.対戦ステップ = world.対戦回数 end if if world.対戦ステップ == 1 then for i = 0 to 15 world.戦略(i) = 0 // 戦略表示の初期化 next i //エージェントの初期化 for i = 0 to _GetWidthSpace(world.空間) * _GetHeightSpace(world.空間) - 1 if world.シャッフル == True then world.空間.PLAYER.X(i) = 0 world.空間.PLAYER.Y(i) = 0 end if //点数の初期化。これをコメントアウトすると点数が残る。 world.空間.PLAYER.点数(i) = 0 //戦略のコピー world.空間.PLAYER.戦略(i) = world.空間.PLAYER.戦略_B(i) for j = 0 to world.対戦回数 for k = 0 to 15 world.空間.PLAYER.履歴(i,j,k) = 0 // 履歴の初期化 next k next j next i if world.シャッフル == True then _randomPutAgent(world.空間.PLAYER,false) end if end if } #end_rule WORLD //------------------ エージェントルール --------------- #begin_rule WORLD.空間.PLAYER Agt_Init{ } Agt_Step{ dim i as integer, j as integer, k as integer, l as integer dim col as collection, obj as object dim pn as integer,pnr as integer,maxp as integer if world.対戦ステップ == 1 then //Blue:allC //Red:Yossu //Green:TFT //Yellow:Random //Cyan:2CforD //Mazenta:Tester //RGB(0,150,100):Friedman //RGB(100,100,50):allD //RGB(100,100,100):perCD //RGB(100,100,150):perDC //RGB(100,100,200):perCCD //RGB(100,100,250):perCDD //RGB(150,0,0):T2FT //RGB(150,100,0):hardTFT //RGB(200,0,200):softFreedman //RGB(250,100,50):Pavlov if my.戦略 == COLOR_BLUE then i = 0 end if if my.戦略 == COLOR_RED then i = 1 end if if my.戦略 == COLOR_GREEN then i = 2 end if if my.戦略 == COLOR_YELLOW then i = 3 end if if my.戦略 == COLOR_CYAN then i = 4 end if if my.戦略 == COLOR_MAZENTA then i = 5 end if if my.戦略 == RGB(0,150,100) then i = 6 end if if my.戦略 == RGB(100,100,50) then i = 7 end if if my.戦略 == RGB(100,100,100) then i = 8 end if if my.戦略 == RGB(100,100,150) then i = 9 end if if my.戦略 == RGB(100,100,200) then i = 10 end if if my.戦略 == RGB(100,100,250) then i = 11 end if if my.戦略 == RGB(150,0,0) then i = 12 end if if my.戦略 == RGB(150,100,0) then i = 13 end if if my.戦略 == RGB(200,0,200) then i = 14 end if if my.戦略 == RGB(250,100,50) then i = 15 end if world.戦略(i) = world.戦略(i) + 1 end if // j = 自分の出す手 k = 相手の出す手 // それぞれ 1 が 協調 2 が裏切り //周囲8近傍のエージェントの数を取得する col = _CollectAround(my.X, my.Y, 1, world.空間, ALL) _RemoveCollection(col,my) //自分自身は除く for each obj in col pn = assign_n(my.X, my.Y, obj.X, obj.Y) //相手の相対位置(ユーザー定義関数) if my.履歴(world.対戦ステップ,pn) == 0 then // 自分の手 if my.戦略 == COLOR_BLUE then // All C j = 1 elseif my.戦略 == COLOR_RED then j = Str_Yossu(my,pn) elseif my.戦略 == COLOR_GREEN then //TFT j = Str_TFT(my,pn) elseif my.戦略 == COLOR_YELLOW then //Random j = int(rnd()*2) + 1 elseif my.戦略 == COLOR_CYAN then //2C for D j = Str_2CforD(my,pn) elseif my.戦略 == COLOR_MAZENTA then // 最初はD 相手がDなら次回自分はC その後はTFT //      相手がCなら次回次々回はC その後一回おきD j = Str_Tester(my,pn) elseif my.戦略 == RGB(0,150,100) then // 相手が一度でもDならその後自分はずっとD j = Str_Freedman(my,pn) elseif my.戦略 == RGB(100,100,50) then //allD j = 2 elseif my.戦略 == RGB(100,100,100) then //perCD j= Str_perCD(my,pn) elseif obj.戦略 == RGB(100,100,150) then //perDC j = Str_perDC(obj,pnr) elseif obj.戦略 == RGB(100,100,200) then //perCCD j = Str_perCCD(obj,pnr) elseif obj.戦略 == RGB(100,100,250) then //perCDD j = Str_perCDD(obj,pnr) elseif obj.戦略 == RGB(150,0,0) then //T2FT j = Str_T2FT(obj,pnr) elseif obj.戦略 == RGB(150,100,0) then //hardTFT j = Str_hardTFT(obj,pnr) elseif obj.戦略 == RGB(200,0,200) then //softFreedman j = Str_softFreedman(obj,pnr) elseif obj.戦略 == RGB(250,100,50) then //Pavlov j = Str_Pavlov(obj,pnr) end if pnr= assign_n(obj.X, obj.Y, my.X, my.Y)//相手から見た自分の相対位置 // 相手の手 if obj.戦略 == COLOR_BLUE then // All C k = 1 elseif obj.戦略 == COLOR_RED then //「ヨッス」TFT同様相手に裏切られると即座に裏切り返すが、相手が協調した後では //必ず協調するのではなく9割協調して1割裏切るStr_Yossuの定義は「共通ルールエディタ」に k = Str_Yossu(obj,pnr) elseif obj.戦略 == COLOR_GREEN then k = Str_TFT(obj,pnr) elseif obj.戦略 == COLOR_YELLOW then //random k = int(rnd()*2) + 1 elseif obj.戦略 == COLOR_CYAN then //2C for D 相手が2度CならDを返す「共通ルールエディタ」参照 k = Str_2CforD(obj,pnr) elseif obj.戦略 == COLOR_MAZENTA then k = Str_Tester(obj,pnr) elseif obj.戦略 == RGB(0,150,100) then k = Str_Freedman(obj,pnr) elseif obj.戦略 == RGB(100,100,50) then //allD k = 2 elseif obj.戦略 == RGB(100,100,100) then k = Str_perCD(obj,pnr) elseif obj.戦略 == RGB(100,100,150) then k = Str_perDC(obj,pnr) elseif obj.戦略 == RGB(100,100,200) then k = Str_perCCD(obj,pnr) elseif obj.戦略 == RGB(100,100,250) then k = Str_perCDD(obj,pnr) elseif obj.戦略 == RGB(150,0,0) then k = Str_T2FT(obj,pnr) elseif obj.戦略 == RGB(150,100,0) then k = Str_hardTFT(obj,pnr) elseif obj.戦略 == RGB(200,0,200) then k = Str_softFreedman(obj,pnr) elseif obj.戦略 == RGB(250,100,50) then k = Str_Pavlov(obj,pnr) end if world.結果(j)=world.結果(j) + 1 world.結果(k)=world.結果(k) + 1 //ペイオフマトリックスの計算 //___|___C__|___D__| //_C_| (3,3)| (0,4)| //_D_| (4,0)| (1,1)| if k == 1 then //相手が信頼 if j == 1 then //自分も信頼 my.点数 = my.点数 + 3 obj.点数= obj.点数+ 3 else //自分は裏切り my.点数 = my.点数 + 4 obj.点数= obj.点数 + 0 end if else //相手が裏切り if j == 1 then //自分は信頼 my.点数 = my.点数 + 0 obj.点数= obj.点数 + 4 else //自分も裏切り my.点数 = my.点数 + 1 obj.点数= obj.点数 + 1 end if end if my.履歴(world.対戦ステップ,pn) = SetLog(j,k) obj.履歴(world.対戦ステップ,pnr)= SetLog(k,j) end if next obj if world.対戦ステップ == world.対戦回数 then // 最終回 col = _CollectAround(my.X, my.Y, 1, world.空間, all) maxP = 0 for each obj in col //相手の点数がよければ、戦略をコピーする if obj.点数 > maxP then maxP=obj.点数 my.戦略_B = obj.戦略 end if next obj end if } Function assign_n(nX as integer,nY as integer,pX as integer,pY as integer) as integer { Dim MaxX as integer, MaxY as integer, pn as integer MaxX = _GetWidthSpace(world.空間) -1 MaxY = _GetHeightSpace(world.空間) -1 if nX == MaxX AND pX == 0 then pX = MaxX + 1 end if if nX == 0 AND pX == MaxX then pX = -1 end if if nY == MaxY AND pY == 0 then pY = MaxY + 1 end if if nY == 0 AND pY == MaxY then pY = -1 end if if pX == nX + 1 then if pY == nY - 1 then pn = 1 end if if pY == nY then pn = 2 end if if pY == ny + 1 then pn = 3 end if elseif pX == nX then if pY == nY - 1 then pn = 0 end if if pY == nY + 1 then pn = 4 end if else if pY == nY - 1 then pn = 7 end if if pY == nY then pn = 6 end if if pY == nY + 1 then pn = 5 end if end if return(pn) } #end_rule WORLD.空間.PLAYER //------------------ コンポーネントメモ --------------- #begin_compo_memo WORLD.空間.PLAYER.履歴 1次元目の配列数は world.対戦回数の最大値 + 1を 設定すること #end_compo_memo WORLD.空間.PLAYER.履歴 //------------------ コンポーネントメモ --------------- #begin_compo_memo WORLD.戦略 配列数=戦略の種類数 #end_compo_memo WORLD.戦略 //------------------ コンポーネントメモ --------------- #begin_compo_memo WORLD.結果 配列数=[戦略の種類‐1] #end_compo_memo WORLD.結果 //------------------ シミュレーション設定部 --------------- SINGLE_SIMULATION { STEP_MAX = 0; TIME_MAX = 0; END_CONDITION = ""; EXEC_WAIT = 0; EXEC_ORDER = RANDOM; RANDOM_SEED = 0; LOG_FILE = "",FIXED,OVERWRITE,0; } //------------------ ループ設定部 --------------- REPEAT_SIMULATION { VALUE_CHANGE = NONE; REPEAT_MAX = 1; VARIABLES = ""; START_VALUE = 0.000000; STEP_VALUE = 1.000000; END_VALUE = 1.000000; EXEC_TIMES_SAME = 1; RANDOM_RANGE = 0.000000, 1.000000; SAME_VALUE = YES; EXEC_TIMES_DIFFERENT = 1; } //------------------ 二次元マップ表示出力設定部 --------------- MAP_OUTPUT { MAP_SPACE_NAME = "WORLD.空間"; MAP_NAME = "Space"; TITLE = "Strategy space"; AXIS_LABEL = "", ""; DRAW_RANGE = 0, 0, 11, 11; RULED_LINE = NO; REMARKS = NO; SPACE_KIND = SQUARE_2D; BG_PICT = NO; BG_TYPE = 0; BG_VAR_NAME = ""; BG_FILE_NAME = ""; DISABLE = NO; POSITION_X = 330; POSITION_Y = -1; SIZE_X = 323; SIZE_Y = 683; OUTPUT { MAP_ELEMENT_NAME = "PLAYER"; MAP_ELEMENT = AGENT_VARIABLE; OUTPUT_EXPRESSION = "WORLD.空間.PLAYER"; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_COLOR_MIN = 255,255,255; SPACE_COLOR_MAX = 0,0,255; AGENT_COLOR = "WORLD.空間.PLAYER.戦略"; MARKER_ID = 1; ICON_TYPE = 0; ICON_VAR_NAME = ""; ICON_FILE_NAME = ""; MAP_COLOR = 0,0,0; NUM_DISPLAY = YES; NUM_VAR_NAME = "WORLD.空間.PLAYER.点数"; } } //------------------ 数値画面出力設定部 --------------- NUMERIC_OUTPUT { NUMERIC_NAME = "Numbers"; TITLE = ""; DISABLE = NO; POSITION_X = 18; POSITION_Y = 105; SIZE_X = 323; SIZE_Y = 679; OUTPUT { OUTPUT_ELEMENT_NAME = "Steps"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "_GetCountStep()"; } OUTPUT { OUTPUT_ELEMENT_NAME = "C"; FIGURES = 0; FORMAT_ID = 778333298; OUTPUT_EXPRESSION = "world.結果(1)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "D"; FIGURES = 0; FORMAT_ID = 778333298; OUTPUT_EXPRESSION = "world.結果(2)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "ALL-C"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(0)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "Joss"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(1)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "TFT"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(2)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "Random"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(3)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "2CforD"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(4)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "Tester"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(5) "; } OUTPUT { OUTPUT_ELEMENT_NAME = "Friedman"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(6) "; } OUTPUT { OUTPUT_ELEMENT_NAME = "ALL-D"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(7)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "perCD"; FIGURES = 0; FORMAT_ID = 6579300; OUTPUT_EXPRESSION = "world.戦略(8)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "perDC"; FIGURES = 0; FORMAT_ID = 800; OUTPUT_EXPRESSION = "world.戦略(9)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "perCCD"; FIGURES = 0; FORMAT_ID = 5; OUTPUT_EXPRESSION = "world.戦略(10)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "perCDD"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(11)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "T2FT"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(12)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "hardTFT"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(13)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "softFriedman"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "world.戦略(14)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "Pavlov"; FIGURES = 0; FORMAT_ID = 1; OUTPUT_EXPRESSION = "world.戦略(15)"; } } //------------------ 時系列グラフ出力設定部 --------------- TIME_GRAPH { GRAPH_NAME = "Strategy"; TITLE = "Strategies"; AXIS_LABEL = "", ""; SCALE = 0.000000, 0.000000, 300.000000, 0.000000, 0.000000, 0.000000; REMARKS = YES; DISABLE = NO; POSITION_X = 646; POSITION_Y = 0; SIZE_X = 323; SIZE_Y = 683; OUTPUT { GRAPH_ELEMENT_NAME = "ALL-D"; LINE_COLOR = 0,0,0; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(7)"; } OUTPUT { GRAPH_ELEMENT_NAME = "ALL-C"; LINE_COLOR = 255,0,0; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(0)"; } OUTPUT { GRAPH_ELEMENT_NAME = "Joss"; LINE_COLOR = 0,0,255; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(1)"; } OUTPUT { GRAPH_ELEMENT_NAME = "TFT"; LINE_COLOR = 0,255,0; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(2)"; } OUTPUT { GRAPH_ELEMENT_NAME = "Random"; LINE_COLOR = 0,255,255; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(3)"; } OUTPUT { GRAPH_ELEMENT_NAME = "2CforD"; LINE_COLOR = 255,255,0; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(4)"; } OUTPUT { GRAPH_ELEMENT_NAME = "Tester"; LINE_COLOR = 255,0,255; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(5)"; } OUTPUT { GRAPH_ELEMENT_NAME = "Friedman"; LINE_COLOR = 100,150,0; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(6) "; } OUTPUT { GRAPH_ELEMENT_NAME = "perCD"; LINE_COLOR = 0,128,128; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(8)"; } OUTPUT { GRAPH_ELEMENT_NAME = "perDC"; LINE_COLOR = 255,128,128; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(9)"; } OUTPUT { GRAPH_ELEMENT_NAME = "perCCD"; LINE_COLOR = 192,128,128; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(10)"; } OUTPUT { GRAPH_ELEMENT_NAME = "perCDD"; LINE_COLOR = 255,128,128; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(11)"; } OUTPUT { GRAPH_ELEMENT_NAME = "T2FT"; LINE_COLOR = 0,0,128; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(12)"; } OUTPUT { GRAPH_ELEMENT_NAME = "hardTFT"; LINE_COLOR = 0,128,128; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(13)"; } OUTPUT { GRAPH_ELEMENT_NAME = "softFriedman"; LINE_COLOR = 211,171,200; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(14)"; } OUTPUT { GRAPH_ELEMENT_NAME = "Pavlov"; LINE_COLOR = 0,128,255; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "world.戦略(15)"; } } //------------------ コントロールパネルデータ設定部 --------------- CONTROL_PANEL { PANEL_ITEM { ITEM_NAME = "対戦回数"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.対戦回数; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 49; SLIDER_VALUE_MIN = 10.000000; SLIDER_VALUE_STEP = 10.000000; } PANEL_ITEM { ITEM_NAME = "場所のシャッフル"; ITEM_TYPE = TOGGLE; VAR_NAME = WORLD.シャッフル; CONTROL_ON = YES; CONTROL_ON_INT = 0; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 1; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } } //------------------ 説明用HTMLテキスト --------------- #begin_html 「囚人のジレンマ」ゲームのマルチエージェント版です 。対戦回数分だけ回りの8近傍と繰り返し対戦を行います。回数を消化すると8近傍+自分の中で最も点数の高い戦略をコピーします。はたしてAxelrodの主張するようにTFT(しっぺがえし)戦略が最強であると言えるでしょうか。 #end_html //------------------ 空間初期値データ設定部 --------------- SPACE_INITIAL { } //------------------ レポート出力情報設定部 --------------- REPORT_INFO { REPORT_NAME = ""; FIELD_DELIMITER = " "; } //------------------ その他のデータ設定部 --------------- OTHERS_DATA { INDENT = 1; FONT_NAME = "MS ゴシック"; FONT_WIDTH = 0; FONT_HEIGHT = -13; FONT_WEIGHT = 200; FONT_ITALIC = 0; FONT_CHARSET = 128; WINDOW_HIDE_RUN = 1; POSITION_X = 0; POSITION_Y = 0; SIZE_X = 0; SIZE_Y = 0; } //------------------ 再生用ログデータ ---------------