ラベル 将棋 の投稿を表示しています。 すべての投稿を表示
ラベル 将棋 の投稿を表示しています。 すべての投稿を表示

symbolimageでグラフのシンボルに好きな画像を使う方法。例えば散布図で将棋盤を表現

SAS9.4から、SG系グラフでsymbolimageを使うことができ、プロットのシンボルを自由な画像にすることができます。

印象としては、実装遅くない?って感じですよね。結構大事な機能だと思うので9.2から入れりゃいいのに、、。


で、今回はGTL&SGRENDERで散布図書きます。
で、どうせなら、散布図の概念に捉われない使い方をしたいと思います。

今、以下のようなデータセットがあったとします。

data Q1;
X=1;Y=9;KOMA='▲香車';output;
X=2;Y=9;KOMA='▲桂馬';output;
X=3;Y=9;KOMA='▲銀将';output;
X=4;Y=9;KOMA='▲金将';output;
X=5;Y=9;KOMA='▲王将';output;
X=6;Y=9;KOMA='▲金将';output;
X=7;Y=9;KOMA='▲銀将';output;
X=8;Y=9;KOMA='▲桂馬';output;
X=9;Y=9;KOMA='▲香車';output;
X=2;Y=8;KOMA='▲飛車';output;
X=8;Y=8;KOMA='▲角行';output;
X=1;Y=7;KOMA='▲歩兵';output;
X=2;Y=7;KOMA='▲歩兵';output;
X=3;Y=7;KOMA='▲歩兵';output;
X=4;Y=7;KOMA='▲歩兵';output;
X=5;Y=7;KOMA='▲歩兵';output;
X=6;Y=7;KOMA='▲歩兵';output;
X=7;Y=7;KOMA='▲歩兵';output;
X=8;Y=7;KOMA='▲歩兵';output;
X=9;Y=7;KOMA='▲歩兵';output;
X=1;Y=1;KOMA='△香車';output;
X=2;Y=1;KOMA='△桂馬';output;
X=3;Y=1;KOMA='△銀将';output;
X=4;Y=1;KOMA='△金将';output;
X=5;Y=1;KOMA='△王将';output;
X=6;Y=1;KOMA='△金将';output;
X=7;Y=1;KOMA='△銀将';output;
X=8;Y=1;KOMA='△桂馬';output;
X=9;Y=1;KOMA='△香車';output;
X=8;Y=2;KOMA='△飛車';output;
X=2;Y=2;KOMA='△角行';output;
X=1;Y=3;KOMA='△歩兵';output;
X=2;Y=3;KOMA='△歩兵';output;
X=3;Y=3;KOMA='△歩兵';output;
X=4;Y=3;KOMA='△歩兵';output;
X=5;Y=3;KOMA='△歩兵';output;
X=6;Y=3;KOMA='△歩兵';output;
X=7;Y=3;KOMA='△歩兵';output;
X=8;Y=3;KOMA='△歩兵';output;
X=9;Y=3;KOMA='△歩兵';output;
run;

ちなみに▲は先手を表し、△は後手を表す将棋の符号です。

で、任意のフォルダに、フリー素材画像のサイトから駒の画像をとってきて保存します。
先手と後手で画像の向きがひっくり返りますが、ここは単純に反転した画像を用意して使います。
(使用したサイト:http://sozai.7gates.net/docs/japanese-chess/)























でコードは

ods path(prepend) work.templat(update);
proc template;
 define statgraph syogi;
 begingraph;
 symbolimage name=S_OU image='/folders/myfolders/koma/▲王将.png';
 symbolimage name=S_HISYA image='/folders/myfolders/koma/▲飛車.png';
 symbolimage name=S_KAKU image='/folders/myfolders/koma/▲角行.png';
 symbolimage name=S_KINN image='/folders/myfolders/koma/▲金将.png';
 symbolimage name=S_GINN image='/folders/myfolders/koma/▲銀将.png';
 symbolimage name=S_KYOUSYA image='/folders/myfolders/koma/▲香車.png';
 symbolimage name=S_KEIMA image='/folders/myfolders/koma/▲桂馬.png';
 symbolimage name=S_HU image='/folders/myfolders/koma/▲歩兵.png';
 symbolimage name=G_OU image='/folders/myfolders/koma/△王将.png';
 symbolimage name=G_HISYA image='/folders/myfolders/koma/△飛車.png';
 symbolimage name=G_KAKU image='/folders/myfolders/koma/△角行.png';
 symbolimage name=G_KINN image='/folders/myfolders/koma/△金将.png';
 symbolimage name=G_GINN image='/folders/myfolders/koma/△銀将.png';
 symbolimage name=G_KYOUSYA image='/folders/myfolders/koma/△香車.png';
 symbolimage name=G_KEIMA image='/folders/myfolders/koma/△桂馬.png';
 symbolimage name=G_HU image='/folders/myfolders/koma/△歩兵.png';

 discreteattrmap name='kifmap';
   value '▲王将' / markerattrs=(symbol=S_OU);
   value '▲飛車' / markerattrs=(symbol=S_HISYA);
   value '▲角行' / markerattrs=(symbol=S_KAKU);
   value '▲金将' / markerattrs=(symbol=S_KINN);
   value '▲銀将' / markerattrs=(symbol=S_GINN);
   value '▲香車' / markerattrs=(symbol=S_KYOUSYA);
   value '▲桂馬' / markerattrs=(symbol=S_KEIMA);
   value '▲歩兵' / markerattrs=(symbol=S_HU);
   value '△王将' / markerattrs=(symbol=G_OU);
   value '△飛車' / markerattrs=(symbol=G_HISYA);
   value '△角行' / markerattrs=(symbol=G_KAKU);
   value '△金将' / markerattrs=(symbol=G_KINN);
   value '△銀将' / markerattrs=(symbol=G_GINN);
   value '△香車' / markerattrs=(symbol=G_KYOUSYA);
   value '△桂馬' / markerattrs=(symbol=G_KEIMA);
   value '△歩兵' / markerattrs=(symbol=G_HU);
 enddiscreteattrmap;
 discreteattrvar attrvar=KOMAC var=KOMA attrmap='kifmap';

 layout overlay /yaxisopts=(reverse=true griddisplay=ON
                            linearopts=(tickvaluesequence=(start=1 end=9 increment=1)))
                 xaxisopts=(reverse=true  griddisplay=ON
                            linearopts=(tickvaluesequence=(start=1 end=9 increment=1)));
    scatterplot x=X y=Y /group=KOMAC markerattrs=(size=25pt);
 endlayout;
 endgraph;
 end;

proc sgrender template=syogi data=Q1;
run;

結果は

































てな、感じです。まだマス目がうまく表現できてないので、今後の課題ですね。

最後に「新手一生」を掲げられた升田幸三の言葉を2つほど

『文化なんてしょせん無駄なもんなんだ。でもその明かりが、届く範囲の人に何かをもらたしている。将棋も同じじゃないか』

『若い頃、全く生産性のない「将棋指し」という職業に寂莫とした思いをしたことがあります。国家に、国民に、いかほどの貢献をしているだろうかと。でも、文化というものはムダから発展していくのだ、ということを会得してからは「将棋指し」に打ち込めるようになりました。』



FINANCE関数の紹介。電王戦タッグマッチ行ってきました

SASにはfinance関数というものがあって、この関数一つで何十種類もの財務処理計算ができてしまう凄い子です。

関数のリファレンスがめちゃくちゃ長い!
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003180371.htm

第一引数に、まずどんな財務処理を行うのかを指定するのですが、実はここに指定する名前はEXCELの財務関数の名前と同期していて、以下引数の指定もEXCELと同じなんです。

なので、まずEXCELでやりたいことを探して、使い方を調べてから利用した方が、SASの説明読むより早いです。

例えば300万円を年利5%の3年ローン払いにした場合、月々の支払額はいくらになるかという問題なら

data A1;
 X=finance('pmt',0.05/12,36,3000000);
run;





求めるのが1月あたりの支払額なので、年利を12で割って、月単位にしています。
同じく3年という単位を36カ月に直しています。

月々だいたい9万円返済すればいいってことですね。


ここからは例のごとく、全く関係のない話。
電王戦タッグマッチのファイナルランドにいってきました。















もう、想像以上に熱く、面白い戦いでした。
前の記事で、人間が無駄な探索を刈り取って、読ませるべき局面を直感で選択することに
よって、コンピューターより強くなるといった話をしました。

それに加えて、今回見て関心したのが、西尾六段が、あらかじめ自分が有利になるであろう何手先もの局面を対局と並行してプログラムで探索しておき、そこに実際の局面をうまく誘導するといった戦術をとられたことでした。アドバンスチェスで研究されている戦い方を参考にしたと後でツイッターでおっしゃってました。

また、森下九段が、普段の対局では、必殺技のような過激な手順、構想を思いついても、何か弱点や反撃される隙、つまり読み抜けがあるのではないかと不安になって、より堅実で無難な手を選んでしまうが、コンピューターとタッグを組むと、手順に読み抜けがないことを検証してから実行できるといった趣旨のことをおっしゃってました。

その言葉通り、実際決勝戦では、誰も見たことのないようなド派手な手順の応酬で会場は大いに盛り上がりました。

プログラムに頼って指す将棋なんて面白くないという意見もあると思いますが、僕の個人的な意見としては、人間の思考の創造性を拡張するためにプログラムの力を使うというのは悪いことでなく、寧ろそれこそがプログラムと人間のあるべき方向ではないかなと思いました。

実際、盤面を真剣に睨み、またタブレットを操作して膨大な情報を処理しながら戦う棋士の姿は、奇異ながらも大変美しかったと思います。

あと、終わった後、一緒に付き合ってもらったmatsuさんとSASの話たくさんできたのがまた楽しかったです。







駒交換における得点計算プログラム_Formatプロシジャのinvalueで入力形式を作成して計算する話にかこつけて

【※注意】後で、SASの話も一応でてきますので、、


将棋において、なんの犠牲も払わずに、タダで相手の駒をとることができる状況はまれです。
序盤は特にそうですが、
例えば、相手の「銀」を取れる代わりに、自分の「桂馬」がとられるといったように、戦う以上、駒の交換は避けられません。
しかし、避けられないならば、できる限り、自分に得になって、相手に損になるように交換するのが、勝つための大原則です。

例えば、「歩」と「飛車」の交換であれば、明らかに「飛車」の方が価値が高いので、喜んで「歩」を差し出していいでしょう。

では、例えば、相手の「飛車」を取れる代わりに、こちらの「香車」と「桂馬」の2つを犠牲にしなければならない攻め方の場合、その交換を行うべきか、避けるべきかどちらでしょう?

当然、状況によって駒の価値は変わるので、答えはでませんが、単純化して考える方法として駒の得点化ということをよく言います。


谷川浩司九段の有名な点数化例では、以下の通りです。


飛=15点
竜=17点
角=13点
馬=15点
金=9点
銀=8点
成銀=9点
桂=6点
成桂=10点
香=5点
成香=10点
歩=1点
と金=12点

これをみると「香車」と「桂馬」の2つの点数の合計は11点、対して「飛車」は15点なので、積極的に交換してもよいという理屈になります。



さて、ここからはおまけみたいなもんですが、とりあえず、やっとSASの話です。

以下のようなデータセットがあったとします。

data TRADE;
SENTE='桂';GOTE='金';output;
SENTE='香';GOTE='銀';output;
SENTE='香';GOTE='';output;
SENTE='歩';GOTE='';output;
run;









変数名SENTEは「先手」、GOTEは「後手」です。
このように、交換対象の駒をオブザベーションごとにいれます。

今回は先手4枚と後手2枚の交換ですが、どっちが得をするかぱっとわかりますか??

SASに計算させたいのですが、これ文字なんで、そのままじゃどうしようもないわけです。
アプローチはたくさんありそうですが、今回はインフォーマットでいきましょう

proc format;
invalue  koma '飛'=15 '竜'=17 '角'=13 '馬'=15 '金'=9 '銀'=8 '成銀'=9
              '桂'=6 '成桂'=10 '香'=5 '成香'=10 '歩'=1 'と金'=12;
run;

として点数換算表をインフォーマットにしちゃいましょう!
valueステートメントはよく使いますが、invalueって個人的にはあまりつかわないので新鮮です。

あとはもう

proc sql;
 select sum(input(SENTE,koma.)) as SPOINT label='先手の駒の得点合計'
       ,sum(input(GOTE,koma.)) as GPOINT label='後手の駒の得点合計'
  from TRADE;
 quit;

なんでもいいんで計算しちゃえば










こんなアウトプットがでて、損とも得ともいえない交換ということがわかります。
でも、僕が先手ならこの交換は絶対やりますけどね。まあ目安です。

この得点化プログラム、将棋の際に是非使ってください。

遊びで作ったコードの方が、実戦的なものよりプログラム能力を上達させる効果があるというのが僕の持論(言い訳)です。






新手一生 升田幸三実力制第4代名人について

いきなり何の話だよ、ということなんですが
SASの全く関係ない、趣味の押し売り話です。

新手一生は「しんていっしょう」と読みます。
升田幸三という偉大な将棋棋士の言葉です。
将棋、やるのはからっきしなのですが、棋士話好きです。
升田幸三についてはぜひ、検索や書籍を読んでいただいて、その人となりと成し遂げた功績を調べていただきたいのですが、すこしだけ。

⇒
「魅せる将棋」を大切にし、既成の定跡にとらわれず「新手一生」を掲げ、常に序盤でのイノベーションを数多く起こした。振り飛車・居飛車共に数々の新手を指し、「将棋というゲームに寿命があるなら、その寿命を300年縮めた男」と評された (wikipediaから一部転載)

名言
⇒
「大切なのは創造です。人真似を脱し、新しいものをつくり出すところに、進歩が生まれる」

⇒
「私は将棋は創作だと考えている。何はともあれ、一歩先に出た方が勝つ。もし一局ごとに新手を出す棋士があれば、彼は不敗の名人になれる。その差はたとえ1秒の何分の一でもいい。専門家というものは、日夜新しい手段を発見するまでに苦しまねばならぬ」

⇒
「錯覚いけない、よく見るよろし」

⇒
(将棋史上初の三冠(名人・王将・九段)制覇を成し遂げた際に)
「たどり来て、未だ山麓」

⇒
「僕には不利だ、不可能だといわれるものに挑戦する性癖がある。全部が全部成功するわけではないけれどそれが新型になり、新手を生み、つまり将棋の進歩に繋がる。他の人は安全に先を考えるから先輩の模倣を選ぶ。 」

などなど。

ここからは僕の勝手な感想なのですが、プログラミングと将棋の思考は似ている点が多いと思っていて、またプログラミングにおいても新手一生の精神が大切だと考えています。

例えば、「8つのマージ」としてよく紹介される、2009SAS Global forumの発表「Merging Data Eight Different Ways」では、単純なキーを使った結合処理に対して、Mergeステートメント以外に7つの方法を列挙し、ルーチンワークに行っている処理も、実は様々な方法・視点があり、それぞれに長短や世界観があることを証明してくれました。

一つの処理に対して一つのやり方を知っていればよい。一度書いたプログラムや誰かが作って既に十分枯れたものになったコードをコピペして使い回すのが、一番安全で速いという考え方が悪いとは思いません。

ある意味、それは将棋でいう定跡のようなもので、とても大切なものです。
しかし、定跡を疑うことで新手が生み出せるように、本当に常に結合処理はMergeが最善手なのか?そうではないんじゃないか?といった疑問をあらゆるステップで、それこそ1ステートメントをかく毎に考え、日夜新しい手段を発見するまでに苦しまねばならぬと思うのです。

いやいや、そのモチベーションは、統計解析の方、例えば新理論とか新しい手法の追求、SASでの実現にまわせよ。って感もあるのですが、まあ、プログラミング言語としてのSASの発展も重要だと思うのです。というか、日本ではそっちを真剣に考える人がちょっと少ないと思ったので。

あと、全然関係ないのですが、今年のSASユーザー総会、東京大学の本郷キャンパスで開催だったのですが、あそこって、電王戦(プロ棋士とコンピューターが対局する棋戦)で最終局のGPS将棋が開発され、また当日、クラスタリングされた数百台のパソコンが稼動していた舞台なんですよね。
もう、あそこにいった瞬間、電王戦の様々な場面が胸にこみ上げてきて、泣きそうになりました。

SASもなんか最近のバージョンでは並列処理やらHadoopやら、その辺全然わからないんですが、大規模なデータ処理ができるみたいなんで、コンピューター将棋プログラムつくれないですかね?
最近のコンピューター将棋の原理は、過去の数万局のプロの棋譜からロジスティック回帰を利用して、局面を点数化するための評価関数を作成して、それを使って探索するっていう感じらしいのですが、なんかSASとかいけそうな気がするんですが、やっぱ速度の追求っていみでは別のシンプルな言語の方がいいんでしょうか?詳しい方がいらっしゃればご教示下さい。

ながながと趣味の話、すみませんでした