スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

電王トーナメント PV && 参加ソフト 発表!!!

遂に

電王Tの参加ソフトが公開されました!!!

Noviceも載っていますね〜(感激)

(手動調整が全然うまく行かないよぉ..........(;_;))

PR文書にも書かせて頂きましたが今回は初参戦ということで、

反則無く最後まで!

をなんとか達成したいと思います。

1勝するのはその後で.......(難易度的にはこっちのほうが簡単かも.......)

あと勝手にライバル視しているソフト&目標にしているソフトを紹介します。

ライバル視しているソフト。
・きふわらべ
 前回大会に引き続きPR文書への力の入れ方は最高レベル
 Noviceを作り始めた頃から最初の目標としてきたソフトです。
 是非お手合わせして勝ちたいソフトです。

・ねこ将棋
 アプリも楽しませていただいだいております。(タイムアタックが伸びない.......笑)
 Noviceと同じ初参戦のソフト。同期になるのですかね。
 グラフィック&デザインに関してはクジラちゃんGUIに引けを取らないソフト。
 こちらも勝ちたい相手。

目標にしているソフト
・カツ丼将棋
 「美味しく頂きました」「カツ丼スペシャル」でお馴染みのカツ丼将棋。
 個人的には後述のLabyとライバル関係なのではないかなと勝手読みしております。
 対局がついたら出来る限り食いつきたいソフトです。

・Labyrinthus+

 「辱め詰め」や「喋るソフト」で有名なLaby。
 今大会の手動評価関数勢では、おそらく最強
 色々と機能が増えた?上にBonanzaにそれなりに食いつける程に実力を伸ばしている模様。
 うん。一年後くらいに追い付きたいな........。

と、まあこんなかんじです。

今回は色々と楽しむ&&他の開発者様に挨拶出来たらなあと思います。

大会後、ソースかバイナリは公開したいなと考えております。

ではまた。


スポンサーサイト

評価関数 ボツ案 1 ーーーーKGGーーーー


Noviceは評価関数を手動調整していますが、ボツ案をここに貼っていこうと思います。

//--------------------KGG-----------------------
//

// -2 -1 0 +1
//-------------
// [] 2 1 [] | +1
// [] 3 OU [] | 0
// [] 4 5 [] | -1

int S_OUGI_KI[5][3][4]={

// Criteria is OU

/*-2 -1 0 +1
[] [] GI [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 0 , 3 , 0 , 2 }, //+1
{ 1 , 7 , 0 , 2 },// 0
{ 1 , 5 , 2 , 0 }//-1
},
/*-2 -1 0 +1
[] GI [] [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 2 , 0 , 5 , 2 }, //+1
{ 3 , 7 , 0 , 2 }, // 0
{ 1 , 1 , 2 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] GI OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 4 , 6 , 5 , 2 }, //+1
{ 2 , 0 , 0 , 2 }, // 0
{ 7 , 3 , 2 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] GI [] [] -1
*/
{
// -2 -1 0 +1
{ 0 , 3 , 3 , 2 }, //+1
{ 5 , 7 , 0 , 2 }, // 0
{ 1 , 0 , 2 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] [] GI [] -1
*/
{
// -2 -1 0 +1
{ 0 , 3 , 3 , 2 }, //+1
{ 2 , 7 , 0 , 2 }, // 0
{ 2 , 4 , 0 , 0 } //-1
}

};

//---------------------------------------------
//

// -2 -1 0 +1
//-------------
// [] 2 1 [] | +1
// [] 3 OU [] | 0
// [] 4 5 [] | -1

int S_OUGI_GI[5][3][4]={

// Criteria is OU

/*-2 -1 0 +1
[] [] GI [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 3 , 2 , 0 , 2 }, //+1
{ 2 , 4 , 0 , 2 },// 0
{ 3 , 2 , 2 , 0 }//-1
},
/*-2 -1 0 +1
[] GI [] [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 1 , 0 , 0 , 2 }, //+1
{ 4 , 4 , 0 , 2 }, // 0
{ 2 , 2 , 4 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] GI OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 5 , 0 , 0 , 2 }, //+1
{ 2 , 0 , 0 , 2 }, // 0
{ 7 , 3 , 2 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] GI [] [] -1
*/
{
// -2 -1 0 +1
{ 0 , 0 , 0 , 2 }, //+1
{ 5 , 0 , 0 , 2 }, // 0
{ 1 , 0 , 2 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] [] GI [] -1
*/
{
// -2 -1 0 +1
{ 3 , 0 , 0 , 2 }, //+1
{ 1 , 0 , 0 , 2 }, // 0
{ 3 , 0 , 0 , 0 } //-1
}

};
//------------------------------------------
// -2 -1 0 +1
//-------------
// [] 2 1 [] | +1
// [] 3 OU [] | 0
// [] 4 5 [] | -1

int S_OUKI_GI[5][3][4]={

// Criteria is OU

/*-2 -1 0 +1
[] [] KI [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 3 , 0 , 0 , 2 },//+1
{ 2 , 0 , 0 , 2 },// 0
{ 3 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] KI [] [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 5 , 0 , 0 , 2 }, //+1
{ 2 , 0 , 0 , 2 }, // 0
{ 3 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] KI OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 5 , 0 , 0 , 2 }, //+1
{ 4 , 0 , 0 , 2 }, // 0
{ 2 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] KI [] [] -1
*/
{
// -2 -1 0 +1
{ 3 , 0 , 0 , 2 }, //+1
{ 2 , 0 , 0 , 2 }, // 0
{ 1 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] [] KI [] -1
*/
{
// -2 -1 0 +1
{ 4 , 0 , 0 , 2 }, //+1
{ 2 , 0 , 0 , 2 }, // 0
{ 3 , 0 , 0 , 0 } //-1
}

};
//------------------------------------------
// -2 -1 0 +1
//-------------
// [] 2 1 [] | +1
// [] 3 OU [] | 0
// [] 4 5 [] | -1

int S_OUKI_KI[5][3][4]={

// Criteria is OU

/*-2 -1 0 +1
[] [] KI [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 2 , 0 , 0 , 2 },//+1
{ 5 , 0 , 0 , 2 },// 0
{ 3 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] KI [] [] +1
[] [] OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 5 , 0 , 0 , 2 }, //+1
{ 2 , 0 , 0 , 2 }, // 0
{ 4 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] KI OU [] 0
[] [] [] [] -1
*/
{
// -2 -1 0 +1
{ 3 , 0 , 0 , 2 }, //+1
{ 7 , 0 , 0 , 2 }, // 0
{ 2 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] KI [] [] -1
*/
{
// -2 -1 0 +1
{ 1 , 0 , 0 , 2 }, //+1
{ 3 , 0 , 0 , 2 }, // 0
{ 2 , 0 , 0 , 0 } //-1
},
/*-2 -1 0 +1
[] [] [] [] +1
[] [] OU [] 0
[] [] KI [] -1
*/
{
// -2 -1 0 +1
{ 1 , 0 , 0 , 2 }, //+1
{ 3 , 0 , 0 , 2 }, // 0
{ 3 , 0 , 0 , 0 } //-1
}

};

/*
if(tesu[0]>25){
for(int s=0;s<5;s++){
//------sente-------------------------------------------------
if(KingPos[0]%10>=5){
if(board[KingPos[0]+dir[s]]==SGI){
for(int t=0;t<11;t++){
if(board[KingPos[0]+dir2[t]]==SKI){
P_dan=(KingPos[0]+dir2[t])/10;
P_suji=(KingPos[0]+dir2[t])%10;
score+=S_OUGI_KI[s][P_dan-s_king_d+1][P_suji-s_king_s+2];
}else if(board[KingPos[0]+dir2[t]]==SGI){
P_dan=(KingPos[0]+dir2[t])/10;
P_suji=(KingPos[0]+dir2[t])%10;
score+=S_OUGI_GI[s][P_dan-s_king_d+1][P_suji-s_king_s+2];
}
}
}else if(board[KingPos[0]+dir[s]]==SKI){
for(int t=0;t<11;t++){
if(board[KingPos[0]+dir2[t]]==SGI){
P_dan=(KingPos[0]+dir2[t])/10;
P_suji=(KingPos[0]+dir2[t])%10;
score+=S_OUKI_GI[s][P_dan-s_king_d+1][P_suji-s_king_s+2];
}else if(board[KingPos[0]+dir2[t]]==SKI){
P_dan=(KingPos[0]+dir2[t])/10;
P_suji=(KingPos[0]+dir2[t])%10;
score+=S_OUKI_KI[s][P_dan-s_king_d+1][P_suji-s_king_s+2];
}
}
}
}else{
if(board[KingPos[0]-dir[4-s]]==SGI){
for(int t=0;t<11;t++){
if(board[KingPos[0]-dir2[t]]==SKI){
P_dan=(KingPos[0]-dir2[t])/10;
P_suji=(KingPos[0]-dir2[t])%10;
score+=S_OUGI_KI[s][P_dan-s_king_d+1][-(P_suji-s_king_s)+2];
}else if(board[KingPos[0]-dir2[t]]==SGI){
P_dan=(KingPos[0]-dir2[t])/10;
P_suji=(KingPos[0]-dir2[t])%10;
score+=S_OUGI_GI[s][P_dan-s_king_d+1][-(P_suji-s_king_s)+2];
}
}
}else if(board[KingPos[0]-dir[4-s]]==SKI){
for(int t=0;t<11;t++){
if(board[KingPos[0]-dir2[t]]==SGI){
P_dan=(KingPos[0]-dir2[t])/10;
P_suji=(KingPos[0]-dir2[t])%10;
score+=S_OUKI_GI[s][P_dan-s_king_d+1][-(P_suji-s_king_s)+2];
}else if(board[KingPos[0]-dir2[t]]==SKI){
P_dan=(KingPos[0]-dir2[t])/10;
P_suji=(KingPos[0]-dir2[t])%10;
score+=S_OUKI_KI[s][P_dan-s_king_d+1][-(P_suji-s_king_s)+2];
}
}
}
}
//------gote-------------------------------------------------
if(KingPos[1]%10<=5){
if(board[KingPos[1]-dir[s]]==EGI){
for(int t=0;t<11;t++){
if(board[KingPos[1]-dir2[t]]==EKI){
P_dan=(KingPos[1]-dir2[t])/10;
P_suji=(KingPos[1]-dir2[t])%10;
score-=S_OUGI_KI[s][-(P_dan-s_king_d)+1][-(P_suji-s_king_s)+2];
}else if(board[KingPos[1]-dir2[t]]==EGI){
P_dan=(KingPos[1]-dir2[t])/10;
P_suji=(KingPos[1]-dir2[t])%10;
score-=S_OUGI_GI[s][-(P_dan-s_king_d)+1][-(P_suji-s_king_s)+2];
}
}
}else if(board[KingPos[1]-dir[s]]==EKI){
for(int t=0;t<11;t++){
if(board[KingPos[1]-dir2[t]]==EGI){
P_dan=(KingPos[1]-dir2[t])/10;
P_suji=(KingPos[1]-dir2[t])%10;
score-=S_OUKI_GI[s][-(P_dan-s_king_d)+1][-(P_suji-s_king_s)+2];
}else if(board[KingPos[1]-dir2[t]]==EKI){
P_dan=(KingPos[1]-dir2[t])/10;
P_suji=(KingPos[1]-dir2[t])%10;
score-=S_OUKI_KI[s][-(P_dan-s_king_d)+1][-(P_suji-s_king_s)+2];
}
}
}
}else{
if(board[KingPos[1]+dir[4-s]]==EGI){
for(int t=0;t<11;t++){
if(board[KingPos[1]+dir2[t]]==EKI){
P_dan=(KingPos[1]+dir2[t])/10;
P_suji=(KingPos[1]+dir2[t])%10;
score-=S_OUGI_KI[s][-(P_dan-s_king_d)+1][(P_suji-s_king_s)+2];
}else if(board[KingPos[1]+dir2[t]]==EGI){
P_dan=(KingPos[1]+dir2[t])/10;
P_suji=(KingPos[1]+dir2[t])%10;
score-=S_OUGI_GI[s][-(P_dan-s_king_d)+1][(P_suji-s_king_s)+2];
}
}
}else if(board[KingPos[1]+dir[4-s]]==EKI){
for(int t=0;t<11;t++){
if(board[KingPos[1]+dir2[t]]==EGI){
P_dan=(KingPos[1]+dir2[t])/10;
P_suji=(KingPos[1]+dir2[t])%10;
score-=S_OUKI_GI[s][-(P_dan-s_king_d)+1][(P_suji-s_king_s)+2];
}else if(board[KingPos[1]+dir2[t]]==EKI){
P_dan=(KingPos[1]+dir2[t])/10;
P_suji=(KingPos[1]+dir2[t])%10;
score-=S_OUKI_KI[s][-(P_dan-s_king_d)+1][(P_suji-s_king_s)+2];
}
}
}
}
}
}
*/

Novice ver.0.9 配布

Noviceは現在、0から作り直しており、ver0.9はこのままお蔵入りさせようと考えていたのですが、

うさぴょんの製作者の池さんから弱いソフトと戦いたい人も一定数いると聞いたので、公開します。

ただ、バグだらけなので反則手を指すかもしれませんし、なんと言っても弱いです。

推定棋力は20級くらいかと笑

あと、将棋所では何故か落ちますww

今回はプチ将棋での動かし方を書きますが、プチ将棋では動作テストしていないので、これもまた落ちるかもしれませんww

Noviceでは初期局面からの対局機能しか使えません。評価値も出ませんし、読み筋も出ません。

それでも遊びたい方だけDLしてください。

〜Noviceを動かすまで〜

1,http://www.geocities.jp/shogi_depot/  
 
このサイトからプチ将棋をDLしてください。

novice.png



2,Novice_ver0.9_DL

次に、ここからNoviceをDLしてください。




3,DLしたプチ将棋とNoviceを展開してください。その際に、Readme.txtはしっかり読んでください。

novice2.png

novice3.png


novice5.png

4,プチ将棋を起動し、ツール→エンジン管理を開いてください。

novice4.png
novice6.png

5,エンジン名のところにNoviceと入力し、実行ファイルの右の方にある ...... から先ほど展開したNovice_ver0.9を選択、開き、追加ボタンを押してください。

novice7.png
novice8.png
novice9.png

エンジン一覧にNoviceの名前が表示されればOKです。


6,OKを押し、対局→開始を開いてください。


novice10.png
novice11.png


7,ここで先手番と後手番を決め、開始ボタンから対局を開始してください。このバージョンのNoviceには時間制御をいれていないので、時間制御は設定してもいみがありません。

novice12.png

対局が始まればOKです。















開発環境(ハード側)の構築


昨日今日とパソコン周りを弄りまして色々と開発環境を整えました。

実は今まで使っていたPCはLinux Mint 17.1を載せたVAIO P と win7を載せたloox U/g90 だったんですが、

どちらもいわゆるモバイルPCという非常に小型のPCで、それはそれは画面が見づらくソースも書きにくい状況でした。

さすがにこのままじゃマズイと思い、外部ディスプレイとUSBキーボード、さらにBluetoothのマウスを用意し、VAIO P に接続。

非常に開発しやすい環境になりました。

それにしてもVScodeは使いやすいですね。

Linux使っていると、VimかEmacsかEclipseくらいしかエディタ(or IDE)は選択肢がなかったのですが、
初心者にVimやEmacsはちょっと取っ付きにくいですし、Eclipseもなんか微妙でした。

そこでVS code がリリースされたので使ってみたら、非常に使いやすいですww

僕はVisual C++ でプログラミングを始め、現在も併用して使っているので同様の使い心地であるVS codeはとても重宝しています。

ところでNoviceの制作についてですが、

いままでのソースに無駄がありすぎたこともあり、新しくNovice Xとして作り直しています。

現状は、とりあえず作れるとこは作り終えて、反復深化と手のオーダリングをどうやって作ろうか悩んでいるところです。

一応、反復深化にはハッシュの代わりに配列を使うことで対応しようかと考えています。

まあ、なかなか進まず難しいところです笑

電王トーナメントまでに作りあげられるかなぁ.............

MinMax法による2手先読みの実装


Novice ver0.5では王手を放置したので、さすがにそれは駄目だろうと思い2手先を読ませ、王が取られる場合の評価値を-15000に設定することにした。

そこで2手先を読ませる際の評価の付け方にはMinMax法と全幅探索を採用することを決めMinMax法とはなんぞや?というところから始めた。

MinMax法とは、簡単に言えば自分が指した手に対し相手が最善手を選ぶことを前提に評価値を決めるもの。(だと思う)

Wikipediaを見たら

function MIN_MAX(position:局面, depth:integer): integer
begin
if depth=0 then return STATIC_VALUE(position); {読み深さに達した}
positionを展開→すべての子ノードをchildren[]に。子ノードの数をwに。
if w=0 then return STATIC_VALUE(position); {終局}

if positionは自分の局面 then begin
max := -∞;
for i:=1 to w do begin
score = MIN_MAX( children[i], depth-1);
if(score>max) max := score;
end;
return max;
end else begin{positionは相手の局面}
min := ∞;
for i:=1 to w do begin
score = MIN_MAX( children[i], depth-1);
if(score end;
return min;
end;
end;

というのが貼ってあったんだが、プログラミング初心者の私には何がなにやらさっぱり分からない。
ということで、我流でやってみた。

まず、ver0.5の仕様を見てみる。
ver0.5では盤の端から1マスずつ自分の駒を探していき、すべての駒を全ての方向に動かして最大の評価値の手を採用していた。
その際の方法は、動かしてみた手が最善手であれば次の一手をその手に書き換えるというものである。

2手先を読ませるために、これと同じことを相手の駒でもう一度させたのである。
つまり、自分の駒を動かしてみる→その後相手の駒を動かしてみる→そのタイミングでの評価値をつけて、先手から見てそれが一番高いものを採用するということだ。

理論上、この関数を増やし続ければ、いくらでも先読みするのだが、一手指すのに恐ろしく時間がかかる。だから、いずれαβ法を実装したいと思う。

その前にUSIに対応させないといけない。
手動で手を入力していくのは大変だ(笑)

そういえば、電王戦に関する会見が6/3に行われるようなので、電王トーナメントの有無に関してもそこで発表されると予想される。私としては是非とも開催して欲しいと思う。
その際には、きふわらべに一発入れて欲しい(笑)
プロフィール

kuma

Author:kuma
FC2ブログへようこそ!

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。