今回の目標
これまで遺伝的アルゴリズムを用いて有用な評価値を探していましたが、今回は方法を変えて探したいと思います。
ここから本編
評価値を探す方針として、無理やりではありますが、
- 強そうな評価値を自分で何パターンか考える
- それらの評価値を対決させ、勝率の高かった評価値の特徴を人力で抽出し、その特徴を持った評価値をさらに作る
- 人が見ても実際の戦績を見ても申し分ない評価値が得られるまで繰り返す
という方法を考えました。
つまり人力機械学習です。
ヘッダ・ソースファイル
今回仕様でbw_score変数を追加しcount_last関数を追加しました。
#ifndef osero_genetic_h
#define osero_genetic_h
#include "osero.h"
class osero_genetic : public osero{
private:
void count_last(void);
public:
osero_genetic(int player_b, int player_w):
osero(player_b, player_w){};
osero_genetic(int player_b, double * eva, int player_w):
osero(player_b, eva, player_w){};
osero_genetic(int player_b, int player_w, double * eva):
osero(player_b, player_w, eva){};
osero_genetic(int player_b, double * eva1, int player_w, double * eva2):
osero(player_b, eva1, player_w, eva2){};
~osero_genetic();
virtual int play(void);
int bw_score[2];
};
#endif
void osero_genetic::count_last(void){
int black, white;
black = popcount(this -> bw[0]);
white = popcount(this -> bw[1]);
this -> bw_score[0] = black;
this -> bw_score[1] = white;
}
第1世代
とりあえず10通りの評価値を作りました。
その前に、まず書いたのはこれ。
(拡張子がpyになっていますが、実際はipynbを使っています)
eva = []
name = []
一人目
まず全て1の評価値です。
name_ele = "normal"
eva_ele = [
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
二人目
次に、13で登場したカスタムスコアをスケールダウンして再現しました。
あの時は四隅を10点としていましたが、ここでは1点としています。
そして対角線が0.5点、その他0.1点となっています。
name_ele = "custom"
eva_ele = [
[1.0, 0.1, 0.5, 0.1, 0.1, 0.1, 0.1, 1.0],
[0.1, 0.5, 0.1, 0.1, 0.1, 0.1, 0.5, 0.1],
[0.1, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.1],
[0.1, 0.1, 0.1, 0.5, 0.5, 0.1, 0.1, 0.1],
[0.1, 0.1, 0.1, 0.5, 0.5, 0.1, 0.1, 0.1],
[0.1, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.1],
[0.1, 0.5, 0.1, 0.1, 0.1, 0.1, 0.5, 0.1],
[1.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
三人目
20で使用したeva_myです。
四隅が1点、そのすぐ隣が-1点、そのさらに隣が0.5点、その他が0.1点です。
name_ele = "eva_my"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.1, 0.1, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
[ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.1, 0.1, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
四人目
三人目であるeva_myを改造し、四隅とそのすぐ隣を除く外縁部を0.5点としました。
name_ele = "corner"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
五人目
三人目であるeva_myを改造し、初期位置の斜め上方・下方を1点としました。
name_ele = "box"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.1, 0.1, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 1.0, 0.1, 0.1, 1.0, 0.1, 0.5],
[ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
[ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
[ 0.5, 0.1, 1.0, 0.1, 0.1, 1.0, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.1, 0.1, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
六人目
五人目であるboxを改造し、四人目と同様に四隅とそのすぐ隣を除くすべての外縁部を0.5点としました。
name_ele = "box_corner"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 1.0, 0.1, 0.1, 1.0, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 1.0, 0.1, 0.1, 1.0, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
七人目
逆に、弱い評価値とは何だろう? と考え、とりあえず三人目であるeva_myの符号を反転させてみました。
name_ele = "weak"
eva_ele = [
[-1.0, 1.0, -0.5, -0.1, -0.1, -0.5, 1.0, -1.0],
[ 1.0, 1.0, -0.1, -0.1, -0.1, -0.1, 1.0, 1.0],
[-0.5, -0.1, -0.5, -0.1, -0.1, -0.5, -0.1, -0.5],
[-0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1],
[-0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1],
[-0.5, -0.1, -0.5, -0.1, -0.1, -0.5, -0.1, -0.5],
[ 1.0, 1.0, -0.1, -0.1, -0.1, -0.1, 1.0, 1.0],
[-1.0, 1.0, -0.5, -0.1, -0.1, -0.5, 1.0, -1.0]
]
name.append(name_ele)
eva.append(eva_ele)
八人目
15の学習結果として出てきた評価値の一つ。なお有効数字二桁に丸めています。
name_ele = "fifteen"
eva_ele = [
[ 0.2, -0.2, 0.3, -0.9, -0.2, 0.5, 0.5, -0.5],
[ 0.9, 0.9, -0.4, 0.3, 0.8, -0.5, 0.4, -0.6],
[ 0.9, -1.0, -0.3, 0.8, 0.1, -0.1, -0.9, 0.8],
[-0.8, 0.6, 0.1, -0.2, 0.8, -0.7, 0.1, 0.4],
[ 0.3, 0.9, 1.0, 0.4, -0.7, -0.7, 0.7, -0.1],
[ 0.2, 0.7, 0.6, -0.1, -0.1, -0.5, -0.9, 0.2],
[ 0.0, 0.0, 0.8, 0.3, -0.3, 0.6, 0.6, -0.7],
[-0.3, 0.2, -0.9, 1.0, 0.0, 0.5, -0.2, -0.1]
]
name.append(name_ele)
eva.append(eva_ele)
九人目
17の学習結果として出てきた評価値の一つ。こちらも丸めています。
name_ele = "seventeen"
eva_ele = [
[ 0.6, 0.6, 0.7, 0.1, -0.8, -0.8, -0.4, -0.4],
[ 0.0, 0.5, -0.7, -0.1, 0.1, 0.2, 0.5, 0.4],
[ 0.8, -0.4, -0.4, -0.4, 0.3, -0.9, -0.9, 0.8],
[-0.4, 0.9, 0.2, 0.8, -0.3, -0.7, 0.7, -0.9],
[-0.4, 0.1, 0.6, 0.1, -0.4, 0.8, 1.0, 0.9],
[ 1.0, 0.3, 0.3, -0.3, -0.2, -0.4, -0.7, 0.1],
[ 0.1, 0.3, 0.7, 0.4, -0.6, 0.3, -0.8, 0.9],
[ 0.4, 0.2, 0.8, -1.0, 0.4, -0.7, -0.9, -0.6]
]
name.append(name_ele)
eva.append(eva_ele)
十人目
21で出てきた評価値の一つ。丸めています。
name_ele = "twenty"
eva_ele = [
[-0.4, 0.2, -0.4, 0.1, 0.9, 0.9, 0.9, 0.3],
[ 0.2, 0.3, -0.8, -0.4, -0.4, 0.9, -0.2, 1.0],
[ 0.2, 0.4, -0.3, 0.4, 0.2, -0.5, 0.5, -0.5],
[-0.4, 0.6, -0.2, -0.3, -0.7, 0.4, -0.9, -0.1],
[-0.4, -0.3, 1.0, -0.5, -0.4, 0.9, 0.8, 0.8],
[ 0.2, 1.0, -0.6, 0.8, 0.9, 0.3, 0.8, 0.1],
[-0.4, -0.5, -0.5, 0.9, 0.0, -0.9, -0.6, 0.5],
[ 0.6, 0.2, -0.8, -0.1, 0.4, 0.9, -0.8, 0.5]
]
name.append(name_ele)
eva.append(eva_ele)
実行ファイル
まず、作成した評価値及びそれらの名前をファイル保存します。
eva_file = open("eva_file.txt", "w")
for i in range(len(eva)):
for j in range(8):
for k in range(8):
eva_file.write(str(eva[i][j][k]))
eva_file.write("\n")
eva_file.close()
name_file = open("name_file.txt", "w")
for i in range(len(name)):
name_file.write(name[i])
name_file.write("\n")
name_file.close()
次に、c++のプログラムで評価値及び名前を読み取り総当たりで戦わせます。なお、黒も白も1handです。
なお、各一回ずつの対戦ではデータ数が不足することを予想し、18で調べた中からなるべく勝敗に関係ない数字40個を選び出し、srand関数の引数を変えながら実験することにしました。
つまり試合数は10x10x40の四千です。
最近1500万試合したり150万試合したりしたので少なく感じますね。
プログラムは特に難しいところはないので変数説明のみ行います。
- eva_num 評価値の数です。
- board_size 盤面サイズです。8x8の盤面なので64。
- eva 評価値を入れておく箱です。
- name 各評価値の名前を入れて億箱です。
- srand_init_arr 18から選び出した数字を入れています。
また、osero_geneticコンストラクタに与えている1という数字はnhand_customのことです。
#include <string>
#include "osero_genetic.h"
#define SIZEOF(arr) (sizeof(arr) / sizeof(int))
const int eva_num = 10;
const int board_size = 64;
void set_eva(double ** eva, char ** name);
int main(void){
int i, j;
double ** eva = new double *[eva_num];
char ** name = new char *[eva_num];
FILE * datap;
osero_genetic * run;
int srand_init_arr[] = {
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
616, 617, 618, 619, 620, 621, 622, 623, 624, 625,
626, 627, 628, 629, 630, 631, 632, 633, 634, 635
};
for (i = 0; i < eva_num; i++){
eva[i] = new double[board_size];
name[i] = new char[20];
}
set_eva(eva, name);
datap = fopen("data.csv", "w");
fprintf(datap, "black,white,srand_num,black_score,white_score\n");
for (i = 0; i < eva_num; i++){
printf("[");
for (j = 0; j < i + 1; j++){
printf("#");
}
for (; j < eva_num; j++){
printf(" ");
}
printf("]\n");
for (j = 0; j < eva_num; j++){
run = new osero_genetic(1, eva[i], 1, eva[j]);
for (int srand_init = 0; srand_init < SIZEOF(srand_init_arr); srand_init++){
run -> reset();
run -> srand_num = srand_init_arr[srand_init];
run -> play();
fprintf(
datap,
"%s,%s,%d,%d,%d\n",
name[i],
name[j],
srand_init_arr[srand_init],
run -> bw_score[0],
run -> bw_score[1]
);
}
delete run;
}
}
fclose(datap);
for (i = 0; i < eva_num; i++){
delete[] eva[i];
delete[] name[i];
}
delete[] eva;
delete[] name;
return 0;
}
void set_eva(double ** eva, char ** name){
int i, j;
FILE * eva_read = fopen("eva_file.txt", "r");
FILE * name_read = fopen("name_file.txt", "r");
i = 0, j = 0;
while (fscanf(eva_read, "%lf", &eva[i][j]) != EOF){
j++;
if (j == board_size){
j = 0;
i++;
}
}
i = 0;
while (fscanf(name_read, "%s", name[i]) != EOF){
i++;
}
fclose(eva_read);
fclose(name_read);
}
実行結果
拡張子がpyになっていますが今回もipynbを使いました。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv("data.csv")
name = []
with open("name_file.txt", "r") as name_file:
for i in name_file:
name.append(i.rstrip("\n"))
def bar(save_dir, xlabel, ylabel, fig_name):
global x, y
fig = plt.figure(figsize=(10, 10))
plt.bar(x, y)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.title(fig_name)
plt.savefig(save_dir % fig_name)
plt.clf()
plt.close()
x = name
y = []
for i in name:
df_ele = df.query("black == '%s'" % i)
y.append(df_ele["black_score"].mean() - df_ele["white_score"].mean())
bar("fig/%s", "eva", "score - average", "each eva's score - average (black)")
# whiteのグラフも同様に作成(プログラムは省略)
グラフはこちら。
まず、weakがちゃんとマイナススコアをゲットしているのがうれしいですね。大方の予想はあっていたようです。
また、学習によって作った評価値はまさかの低い値となりました。
黒、白ともにcorner、box_corner、eva_my、customの順で高いスコアとなりました。
customがbox以上に有能とは意外でした。
次世代ではこれらの特徴を抽出しつつ新たな評価値を作りたいと思います。
また、黒と白のグラフで異なる形状になっていることが気になりました。これはつまり、srand関数の引数が後手有利または先手有利を作り出しているということです。
そこでsrand関数への引数ごとに黒のスコアから白のスコアを引いた平均をグラフ化しました。
x = df["srand_num"].unique()
y = []
for i in x:
df_ele = df.query("srand_num == %d" % i)
y.append(df_ele["black_score"].mean() - df_ele["white_score"].mean())
x_save = x
y_save = y
x = [i for i in x_save if i <= 100]
y = y_save[:len(x)]
bar("fig/%s", "srand_num", "score average", "each srand_nums score average (81~100)")
x = [i for i in x_save if i > 100]
y = y_save[len(x):]
bar("fig/%s", "srand_num", "score average", "each srand_nums score average (616~635)")
0に近い優秀な引数は81、82、99、619、625、628、629、630、633、635でした。
第2世代
第1世代の結果から第2世代のメンバーを作っていきます。
まず、第1世代で高い評価を得たcorner、box_corner、eva_my、customの四人は続投したいと思います。
五人目
customが意外にも強かったので、cornerにcustom要素を取り入れ、中心四つを0.5点に設定しました。
同様にbox_corner、eva_myにもcustom要素を取り入れたものを作りました。
name_ele = "corner+custom"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.5, 0.5, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.5, 0.5, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
八人目
boxが弱かったので、cornerにboxを足した結果もboxのおかげではなくcornerのおかげで戦績が伸びた可能性があります。
そのため、cornerからboxを引いてみました。
name_ele = "corner-box"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
九人目
cornerが予想以上に強かったので、外縁部をより取りやすくなるよう外縁部のすぐ内側の一回りを-0.5点に変更しました。
名前は思いつかなかったので適当です。
name_ele = "doughnut"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, -0.5, -0.5, -0.5, -0.5, -1.0, -1.0],
[ 0.5, -0.5, 0.5, 0.1, 0.1, 0.5, -0.5, 0.5],
[ 0.5, -0.5, 0.1, 0.1, 0.1, 0.1, -0.5, 0.5],
[ 0.5, -0.5, 0.1, 0.1, 0.1, 0.1, -0.5, 0.5],
[ 0.5, -0.5, 0.5, 0.1, 0.1, 0.5, -0.5, 0.5],
[-1.0, -1.0, -0.5, -0.5, -0.5, -0.5, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
十人目
doughnutにcustomを足しました。
name_ele = "doughnut+custom"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, -0.5, -0.5, -0.5, -0.5, -1.0, -1.0],
[ 0.5, -0.5, 0.5, 0.1, 0.1, 0.5, -0.5, 0.5],
[ 0.5, -0.5, 0.1, 0.5, 0.5, 0.1, -0.5, 0.5],
[ 0.5, -0.5, 0.1, 0.5, 0.5, 0.1, -0.5, 0.5],
[ 0.5, -0.5, 0.5, 0.1, 0.1, 0.5, -0.5, 0.5],
[-1.0, -1.0, -0.5, -0.5, -0.5, -0.5, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
実行ファイル
第1世代の検証で、スコア平均の絶対値が1を下回ったsrand関数の引数を以下のプログラムで探し使用することにしました。
place = []
for i in range(len(y_save)):
if abs(y_save[i]) < 1.0:
place.append(i)
srand_num = []
for i in place:
srand_num.append(x_save[i])
print(srand_num)
[81, 82, 85, 89, 92, 93, 95, 97, 98, 100, 618, 619, 620, 621, 625, 626, 628, 629, 630, 632, 633, 635]
あとは第1世代のプログラムと全く同じで実行します。
実行結果
データ分析プログラムはx軸のラベルを少し回転させ、乱数のプログラムを以下のように変えただけで第1世代と全く同じものを使用しました。
x = df["srand_num"].unique()
y = []
for i in x:
df_ele = df.query("srand_num == %d" % i)
y.append(df_ele["black_score"].mean() - df_ele["white_score"].mean())
x_save = x
y_save = y
x = [i for i in x_save if i <= 100]
y = y_save[:len(x)]
bar("fig/%s", "srand_num", "score average", "each srand_nums score average (81~100)")
x = [i for i in x_save if i > 100]
y = y_save[len(x_save) - len(x):]
bar("fig/%s", "srand_num", "score average", "each srand_nums score average (616~635)")
その結果がこちら。
ここでも大きな存在感を示したのはcornerでした。黒白ともにトップの成績です。
逆に最下位となったのは第1世代で4位のcustom、しかも圧倒的な内容。もしかしたら、と思いましたがcustomはここまでのようです。ただ組み合わせることで強くはなるらしく、corner+customおよびeva_my+customは悪くない成績。
不思議なのがbox_cornerとbox_corner+custom、そしてdoughnut。黒白で正負が逆転しています。どれも黒では負ですが白では正という結果に。box_corner+customは実験的な参加でしたが評価の難しい結果となりました。
corner-boxはトップ層ではないものの安定した強さを発揮しました。
乱数ですが、第1世代ほどではないにせよばらけてしまいました。
第1世代のデータのみで引数としての有効性を判断するのは早計だったかもしれません。
第3世代
第2世代からcorner、eva_my、corner+custom、eva_my+custom、corner-boxを続投させ検証します。
作り出す評価値ですが、第1第2ともに好成績を残しているcornerの亜種を作るような形で行きたいと思います。
またsrand関数の引数は第1世代と同様にします。
六人目
cornerの0.1点部分を-0.1点としました。
名前はminusから。
name_ele = "corner_mi"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, -0.1, -0.1, -0.1, -0.1, -1.0, -1.0],
[ 0.5, -0.1, 0.5, -0.1, -0.1, 0.5, -0.1, 0.5],
[ 0.5, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, 0.5],
[ 0.5, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, 0.5],
[ 0.5, -0.1, 0.5, -0.1, -0.1, 0.5, -0.1, 0.5],
[-1.0, -1.0, -0.1, -0.1, -0.1, -0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
七人目
cornerの外縁部のなかでも、四隅から遠い部分を0.3点としました。
名前は、点数の低い部分がプラスマークのように見えたのでplusから。
name_ele = "corner_pl"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.3, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3],
[ 0.3, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
八人目
cornerの0.5点部分を0.7点に、0.1点部分を0.3点にしました。
名前はheavyから。
name_ele = "corner_he"
eva_ele = [
[ 1.0, -1.0, 0.7, 0.7, 0.7, 0.7, -1.0, 1.0],
[-1.0, -1.0, 0.3, 0.3, 0.3, 0.3, -1.0, -1.0],
[ 0.7, 0.3, 0.7, 0.3, 0.3, 0.7, 0.3, 0.7],
[ 0.7, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.7],
[ 0.7, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.7],
[ 0.7, 0.3, 0.7, 0.3, 0.3, 0.7, 0.3, 0.7],
[-1.0, -1.0, 0.3, 0.3, 0.3, 0.3, -1.0, -1.0],
[ 1.0, -1.0, 0.7, 0.7, 0.7, 0.7, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
九人目
八人目とは逆に、cornerの0.1点部分を0.0点にしました。
名前はzeroから。
name_ele = "corner_he"
eva_ele = [
[ 1.0, -1.0, 0.7, 0.7, 0.7, 0.7, -1.0, 1.0],
[-1.0, -1.0, 0.3, 0.3, 0.3, 0.3, -1.0, -1.0],
[ 0.7, 0.3, 0.7, 0.3, 0.3, 0.7, 0.3, 0.7],
[ 0.7, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.7],
[ 0.7, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.7],
[ 0.7, 0.3, 0.7, 0.3, 0.3, 0.7, 0.3, 0.7],
[-1.0, -1.0, 0.3, 0.3, 0.3, 0.3, -1.0, -1.0],
[ 1.0, -1.0, 0.7, 0.7, 0.7, 0.7, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
十人目
cornerの内側、4x4の四角形の外縁部も0.5点にしました。
name_ele = "corner_corner"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.5, 0.5, 0.5, 0.5, 0.1, 0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.5, 0.1, 0.5, 0.5, 0.5, 0.5, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.5, 0.5, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
実行ファイル
割愛します。
実行結果
プログラムについては割愛します。
今回も黒と白でスコアの符号が逆転するものがありました。しかしよく考えれば、後手が従うべき評価値と先手が従うべき評価値があるのかもしれません。ですが今回欲しいのは戦況を見極めるための評価値なので、普遍的に有効なもの、つまり先手後手関係なく正の数をとる評価値を次世代で採用したいと思います。
そしてついに、cornerを上回る評価値が得られました。corner_plとcorner_zeのふたつです。
黒白ともに0以上のスコアをとったのはこの二つとcornerの合計三つのみでした。
srand関数の引数ですが、第1世代とあまり似ていないグラフになりました。一応プラスとマイナス療法にばらけているのでこのままいきたいと思います。
第4世代
第3世代からcorner、corner_pl、corner_zeを引き継ぎ、さらに発展形を作っていきます。
四人目
まず考えたのは、シンプルにcornerにplとzeを足した評価値です。
name_ele = "corner_pl_ze"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0],
[ 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.5],
[ 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3],
[ 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3],
[ 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.5],
[-1.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
五人目
corner_plにcustomを足してみました。
同様にcorner_ze+custom、corner_pl_ze+customも作成しました。
name_ele = "corner_pl+custom"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.3, 0.1, 0.1, 0.5, 0.5, 0.1, 0.1, 0.3],
[ 0.3, 0.1, 0.1, 0.5, 0.5, 0.1, 0.1, 0.3],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
八人目
corner_plにboxを足してみました。
同様にcorner_ze+box、corner_pl_ze+boxも作成しました。
name_ele = "corner_pl+box"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 0.5, 0.1, 0.5, 0.5, 0.5, 0.5, 0.1, 0.5],
[ 0.3, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.3],
[ 0.3, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.3],
[ 0.5, 0.1, 0.5, 0.5, 0.5, 0.5, 0.1, 0.5],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
実行ファイル
割愛します。
実行結果
また難しい結果になりました。
とりあえず以外にもcorner_pl_ze+boxが健闘していることが分かりましたのでこれとcornerを次世代につなぎたいと思います。
第5世代
cornerおよびcorner_pl_ze+boxを第4世代から引き継ぎます。
三人目
とりあえずcorner_pl_zeにcostomとboxを足してみました。
name_ele = "corner_pl_ze+custom+box"
eva_ele = [
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0],
[-1.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0],
[ 0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.5],
[ 0.3, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.3],
[ 0.3, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.3],
[ 0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.5],
[-1.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -1.0],
[ 1.0, -1.0, 0.5, 0.3, 0.3, 0.5, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
四人目
cornerの外縁部の-1.0点部分を-0.5点に変更しました。同様にcorner_pl_ze+box_miおよびcorner_pl_ze+custom+box_miも作りました。
名前はmildから。
name_ele = "corner_mi"
eva_ele = [
[ 1.0, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 1.0],
[-0.5, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[-0.5, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -0.5],
[ 1.0, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
六人目
cornerの-1.0点部分を-0.5点に変更しました。同様にcorner_pl_ze+box_mimiおよびcorner_pl_ze+custom+box_mimiも作りました。
name_ele = "corner_mimi"
eva_ele = [
[ 1.0, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 1.0],
[-0.5, -0.5, 0.1, 0.1, 0.1, 0.1, -0.5, -0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.5, 0.1, 0.1, 0.5, 0.1, 0.5],
[-0.5, -0.5, 0.1, 0.1, 0.1, 0.1, -0.5, -0.5],
[ 1.0, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
十人目
cornerの、-1.0点の隣を1.0点にしました。
名前はincreaseから。
name_ele = "corner_in"
eva_ele = [
[ 1.0, -1.0, 1.0, 0.5, 0.5, 1.0, -1.0, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, 0.1, 1.0, 0.1, 0.1, 1.0, 0.1, 1.0],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5],
[ 1.0, 0.1, 1.0, 0.1, 0.1, 1.0, 0.1, 1.0],
[-1.0, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -1.0],
[ 1.0, -1.0, 1.0, 0.5, 0.5, 1.0, -1.0, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
実行ファイル
評価値の名前が長すぎたのでname変数の長さを変えました。
実行結果
名前が長すぎて一部被ってしまうので傾きを大きくしました。
はじめてcornerの平均スコアがマイナスに。
一方、黒白ともに強かったのはcorner_mi、corner_pl_ze+box_mi、corner_pl_ze+box_mimiの三人でした。pl_ze、そしてmiの組み合わせが強い結果となりました。
第6世代
第5世代からcorner_mi、corner_pl_ze+box_mi、corner_pl_ze+box_mimiを引き継ぎます。
また、名前が長いのでcorner_pl_ze+box_miをcorner_mi2、corner_pl_ze+box_mimiをcorner_mi3と呼び改めることにします。
四人目
corner_miの0.1点部分を0.2点に、0.5点および-0.5点部分を0.6点、-0.6点にしました。同様に、0.3、0.7、-0.7点としたcorner_mi++も作りました。
name_ele = "corner_mi+"
eva_ele = [
[ 1.0, -0.6, 0.6, 0.6, 0.6, 0.6, -0.6, 1.0],
[-0.6, -1.0, 0.2, 0.2, 0.2, 0.2, -1.0, -0.6],
[ 0.6, 0.2, 0.6, 0.2, 0.2, 0.6, 0.2, 0.6],
[ 0.6, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.6],
[ 0.6, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.6],
[ 0.6, 0.2, 0.6, 0.2, 0.2, 0.6, 0.2, 0.6],
[-0.6, -1.0, 0.2, 0.2, 0.2, 0.2, -1.0, -0.6],
[ 1.0, -0.6, 0.6, 0.6, 0.6, 0.6, -0.6, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
六人目
corner_miの0.5点および-0.5点部分を0.4点、-0.4点にしました。
name_ele = "corner_mi-"
eva_ele = [
[ 1.0, -0.4, 0.4, 0.4, 0.4, 0.4, -0.4, 1.0],
[-0.4, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -0.4],
[ 0.4, 0.1, 0.4, 0.1, 0.1, 0.4, 0.1, 0.4],
[ 0.4, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.4],
[ 0.4, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.4],
[ 0.4, 0.1, 0.4, 0.1, 0.1, 0.4, 0.1, 0.4],
[-0.4, -1.0, 0.1, 0.1, 0.1, 0.1, -1.0, -0.4],
[ 1.0, -0.4, 0.4, 0.4, 0.4, 0.4, -0.4, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
七人目
corner_mi2の0.3点部分を0.4点に、0.5点および-0.5点部分を0.6点、-0.6点にしました。同様に0.5、0.7、-0.7点としたcorner_mi2++も作りました。
name_ele = "corner_mi2+"
eva_ele = [
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0],
[-0.6, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.6],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[-0.6, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.6],
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
九人目
corner_mi3の0.3点部分を0.4点に、0.5点および-0.5点部分を0.6点、-0.6点にしました。同様に0.5、0.7、-0.7点としたcorner_mi3++も作りました。
name_ele = "corner_mi2+"
eva_ele = [
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0],
[-0.6, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.6],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[-0.6, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.6],
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
実行結果
黒白ともにスコアが正の値となったのは、corner_mi3、corner_mi2+、corner_mi3+、corner_mi3++でした。corner_mi3がかなり強いようなので、次世代ではこの四人とcorner_mi3の発展形六人で対戦させたいと思います。
第7世代
corner_mi3、corner_mi2+、corner_mi3+、corner_mi3++と、corner_mi3の発展形で試合を行います。
五人目
corner_mi3+の発展形として、以下に示すcorner_mi3+++を作りました。同様にcorner_mi3#、corner_mi3#+も作りました。
name_ele = "corner_mi3+++"
eva_ele = [
[ 1.0, -0.8, 0.8, 0.6, 0.6, 0.8, -0.8, 1.0],
[-0.8, -0.8, 0.0, 0.0, 0.0, 0.0, -0.8, -0.8],
[ 0.8, 0.0, 0.8, 0.8, 0.8, 0.8, 0.0, 0.8],
[ 0.6, 0.0, 0.8, 0.0, 0.0, 0.8, 0.0, 0.6],
[ 0.6, 0.0, 0.8, 0.0, 0.0, 0.8, 0.0, 0.6],
[ 0.8, 0.0, 0.8, 0.8, 0.8, 0.8, 0.0, 0.8],
[-0.8, -0.8, 0.0, 0.0, 0.0, 0.0, -0.8, -0.8],
[ 1.0, -0.8, 0.8, 0.6, 0.6, 0.8, -0.8, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
八人目
corner_mi3の0.3点部分を0.2点に、0.5、-0.5点部分を0.4、-0.4点に変更しました。
name_ele = "corner_mi3-"
eva_ele = [
[ 1.0, -0.4, 0.4, 0.2, 0.2, 0.4, -0.4, 1.0],
[-0.4, -0.4, 0.0, 0.0, 0.0, 0.0, -0.4, -0.4],
[ 0.4, 0.0, 0.4, 0.4, 0.4, 0.4, 0.0, 0.4],
[ 0.2, 0.0, 0.4, 0.0, 0.0, 0.4, 0.0, 0.2],
[ 0.2, 0.0, 0.4, 0.0, 0.0, 0.4, 0.0, 0.2],
[ 0.4, 0.0, 0.4, 0.4, 0.4, 0.4, 0.0, 0.4],
[-0.4, -0.4, 0.0, 0.0, 0.0, 0.0, -0.4, -0.4],
[ 1.0, -0.4, 0.4, 0.2, 0.2, 0.4, -0.4, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
九人目
corner_mi3の0.5、-0.5点部分のみ0.7、-0.7点に変更しました。0.3点部分はそのままです。
name_ele = "corner_mi3+5"
eva_ele = [
[ 1.0, -0.7, 0.7, 0.3, 0.3, 0.7, -0.7, 1.0],
[-0.7, -0.7, 0.0, 0.0, 0.0, 0.0, -0.7, -0.7],
[ 0.7, 0.0, 0.7, 0.7, 0.7, 0.7, 0.0, 0.7],
[ 0.3, 0.0, 0.7, 0.0, 0.0, 0.7, 0.0, 0.3],
[ 0.3, 0.0, 0.7, 0.0, 0.0, 0.7, 0.0, 0.3],
[ 0.7, 0.0, 0.7, 0.7, 0.7, 0.7, 0.0, 0.7],
[-0.7, -0.7, 0.0, 0.0, 0.0, 0.0, -0.7, -0.7],
[ 1.0, -0.7, 0.7, 0.3, 0.3, 0.7, -0.7, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
十人目
あまり変わらないかもしれませんが、九人目とは逆に、corner_mi3の0.3点部分のみ0.4点としました。0.5、-0.5点部分はそのままです。
name_ele = "corner_mi3+3"
eva_ele = [
[ 1.0, -0.5, 0.5, 0.4, 0.4, 0.5, -0.5, 1.0],
[-0.5, -0.5, 0.0, 0.0, 0.0, 0.0, -0.5, -0.5],
[ 0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.5],
[ 0.4, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.4],
[ 0.4, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.4],
[ 0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.5],
[-0.5, -0.5, 0.0, 0.0, 0.0, 0.0, -0.5, -0.5],
[ 1.0, -0.5, 0.5, 0.4, 0.4, 0.5, -0.5, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
実行結果
判断が難しいですが、安定して強かったのはcorner_mi2+とcorner_mi3+でしょうか。corner_mi3シリーズについては前の世代でも強さを発揮していたので、corner_mi3+のみ次世代へつなぎ、ここから細かく数字を変えた発展形たちで決勝戦を行いたいと思います。
第8世代
corner_mi3+とその発展形で試合を行います。
二人目
corner_mi3+の内縁部の0.6点部分を0.5点に戻しました。
name_ele = "corner_mi3+_in"
eva_ele = [
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0],
[-0.6, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.6],
[ 0.6, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.6],
[ 0.4, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.4],
[ 0.4, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.4],
[ 0.6, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.6],
[-0.6, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.6],
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
三人目
corner_mi3+の外縁部の0.6、-0.6点部分を0.5、-0.5点に戻しました。
name_ele = "corner_mi3+_out"
eva_ele = [
[ 1.0, -0.5, 0.5, 0.4, 0.4, 0.5, -0.5, 1.0],
[-0.5, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.5],
[ 0.5, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.5],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.5, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.5],
[-0.5, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.5],
[ 1.0, -0.5, 0.5, 0.4, 0.4, 0.5, -0.5, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
四人目
corner_mi3+のクロス方向の0.6、-0.6点部分を0.8、-0.8点としました。同様にcorner_mi3+x10も作成しました。
name_ele = "corner_mi3+x8"
eva_ele = [
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0],
[-0.6, -0.8, 0.0, 0.0, 0.0, 0.0, -0.8, -0.6],
[ 0.6, 0.0, 0.8, 0.6, 0.6, 0.8, 0.0, 0.6],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.6, 0.0, 0.8, 0.6, 0.6, 0.8, 0.0, 0.6],
[-0.6, -0.8, 0.0, 0.0, 0.0, 0.0, -0.8, -0.6],
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
六人目
corner_mi3+の0.4点部分を0.3点に、0.6、-0.6点部分を0.7、-0.7点に変更しました。
名前はwideから。
name_ele = "corner_mi3+wi"
eva_ele = [
[ 1.0, -0.7, 0.7, 0.3, 0.3, 0.7, -0.7, 1.0],
[-0.7, -0.7, 0.0, 0.0, 0.0, 0.0, -0.7, -0.7],
[ 0.7, 0.0, 0.7, 0.7, 0.7, 0.7, 0.0, 0.7],
[ 0.3, 0.0, 0.7, 0.0, 0.0, 0.7, 0.0, 0.3],
[ 0.3, 0.0, 0.7, 0.0, 0.0, 0.7, 0.0, 0.3],
[ 0.7, 0.0, 0.7, 0.7, 0.7, 0.7, 0.0, 0.7],
[-0.7, -0.7, 0.0, 0.0, 0.0, 0.0, -0.7, -0.7],
[ 1.0, -0.7, 0.7, 0.3, 0.3, 0.7, -0.7, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
七人目
corner_mi3+の内縁部の0.6点部分の内側を0.4点にしました。
name_ele = "corner_mi3+pl"
eva_ele = [
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0],
[-0.6, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.6],
[ 0.6, 0.0, 0.6, 0.4, 0.4, 0.6, 0.0, 0.6],
[ 0.4, 0.0, 0.4, 0.0, 0.0, 0.4, 0.0, 0.4],
[ 0.4, 0.0, 0.4, 0.0, 0.0, 0.4, 0.0, 0.4],
[ 0.6, 0.0, 0.6, 0.4, 0.4, 0.6, 0.0, 0.6],
[-0.6, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.6],
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
八人目
corner_mi3+の四隅部分の-0.6点を-0.8点としました。同様にcorner_mi3+o10を作成しました。
name_ele = "corner_mi3+o8"
eva_ele = [
[ 1.0, -0.8, 0.6, 0.4, 0.4, 0.6, -0.8, 1.0],
[-0.8, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.8],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.4, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.4],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[-0.8, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.8],
[ 1.0, -0.8, 0.6, 0.4, 0.4, 0.6, -0.8, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
十人目
corner_mi3+の中心部分を0.5点に変更しました。
name_ele = "corner_mi3+ce"
eva_ele = [
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0],
[-0.6, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.6],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[ 0.4, 0.0, 0.6, 0.5, 0.5, 0.6, 0.0, 0.4],
[ 0.4, 0.0, 0.6, 0.5, 0.5, 0.6, 0.0, 0.4],
[ 0.6, 0.0, 0.6, 0.6, 0.6, 0.6, 0.0, 0.6],
[-0.6, -0.6, 0.0, 0.0, 0.0, 0.0, -0.6, -0.6],
[ 1.0, -0.6, 0.6, 0.4, 0.4, 0.6, -0.6, 1.0]
]
name.append(name_ele)
eva.append(eva_ele)
実行結果
かなり尖った結果となりました。
そこで新たに以下のプロブラムを書き、実行してみました。
x = df["black"].unique()
y = []
for i in x:
df_ele = df.query("black == '%s'" % i)
y.append(\
len(df_ele.query("black_score > white_score"))\
-len(df_ele.query("white_score > black_score"))\
)
bar("fig/%s", "eva", "number of win", "each eva's number of win (black)")
# 白についても同様(プログラムは省略)
その結果がこちら。
この世代で終わりにするつもりでしたが、仕方がないのでcorner_mi3+in、corner_mi3+out、corner_mi3+x8の三人のみで決勝戦を行いたいと思います。
決勝戦
corner_mi3+in、corner_mi3+out、corner_mi3+x8の三人のみで決勝を行います。
実行結果
黒の結果がすべてマイナス、白の結果がすべてプラスというまさかの結果となってしまいました。
しかし勝利数のグラフでは黒の成績が比較的悪くなく、白の勝利数では二位につけているcorner_mi3+x8がこの中では普遍的に優秀といえるのではないでしょうか。
納得のいく結果とはなりませんでしたが、これからはcorner_mi3+x8をこのシリーズでの評価値として扱うことにします。
corner_mi3+x8を色付きで表現した図を下に載せておきます。
一応乱数のグラフも載せておきます。
フルバージョン
genetic_surフォルダ内には医いています。
次回は
評価値が求められたので、ついに機械学習にリベンジしたいと思います。