レーティング機能

サーバのRevision 1.47以降にレーティング機能が加わりました(その後何度か仕様が見直され、ここで解説するのはRevision 1.53から導入されたものです)。 レーティング機能が導入される以前どおりに対戦していれば、自然とレーティングされていきます。 逆に、レーティングされないようにするには、ちょっとした工夫が必要です。

プレイヤーがレーティングされる条件を詳しく見ていきましょう。プレイヤーがレーティングされるには(レーティング対象となる対局をするには、にほぼ等しい)、以下のような条件(AND条件)を満たさなければなりません。

プレイヤーIDについて

ログイン時のusernameだけでは「なりすまし」が起こりうるので、レーティング上のIDはもう少し厳密なものとなっています。「username+passwordのハッシュ値」をプレイヤーIDと呼び、レーティング対象プレヤーはこの文字列で識別されます。usernameが同じであってもハッシュ値が異なれば、異なるプレイヤーです。

LOGIN例:LOGIN hoge xyz x1-> プレイヤーIDは、"hoge+d16fb36f0911f878998c136191af705e"

CSAモードではパスワードの扱いが少々異なるので、拡張モードとCSAモードとのログイン方法を改めて示します。

拡張モードでのログイン

上記のとおり、「username+passwordのハッシュ値」がプレイヤーIDとなります。ゲーム名の設定は、%%GAMEで別途行ってください。

LOGIN例:LOGIN hoge xyz x1-> プレイヤーIDは、"hoge+d16fb36f..."

CSAモードでのログイン

CSAモードでは%%GAMEコマンドが使えないため、shogi-serverでは、パスワード部分をゲーム名とみなす「拡張」があります。レーティング用のパスワード(以下トリップと呼びます。このトリップがハッシュされます)と折り合わせるため、パスワード文字列にてゲーム名とトリップとをカンマで区切れるようにしました。

(A) LOGIN username gamename,trip(例:LOGIN hoge default-1500-0,xyz -> プレイヤーIDは"hoge+d16fb36f...")

トリップをつけず、有効なgamenameのみのパスワードでもログイン可能ですが、この場合はプレイヤーIDが生成されず、レーティングには参加しません。

(B) LOGIN username gamename (例:LOGIN hoge default-1500-0 -> プレイヤーIDなし)

パスワードにカンマがなく、その文字列がゲーム名として無効なものであれば、パスワードがレーティング用に利用され、システムのデフォルトのゲーム名(default-1500-0)でログインされます。

(C) LOGIN username password (例:LOGIN hoge xyz -> プレイヤーIDは"hoge+d16fb36f...")

名前(username)の「@」拡張

usernameに利用できる文字種として「@」は有効な文字ですが、 レーティング上は特別な意味があるのでご注意ください。レーティングを集計する際、 ログイン時のusernameのうち「@」以降の部分(@も含む)は無視されます。これにより、複数のプレイヤーをレーティング上では同一視することができます。

このような配慮は将棋プログラム特有のことかもしれません。プログラムであれば、まったく同じ将棋プログラムが複数同時に動作できるからです(しかも同じスペックのマシン上で)。アットマーク拡張機能を使えば、別々のプレイヤー名でありながら、その個々の対戦結果をひとつのレーティング対象プレイヤーの結果としてレーティングすることができます。なお、同じプレイヤー同士の対戦はカウントされません。

たとえば、 プレイヤーA「testgote@p1+d81f9...」、 プレイヤーB「testgote@p2+d81f9...」の対戦結果は合計されて、 ひとりのプレイヤー「testgote+d81f9...」のレーティングとして 集計されます。

さらに、@以降の文字列には予約語があります。すべてアルファベット大文字の場合はシステム的に意味を持つ可能性があるのでご使用は避けてください。現在、@NORATEがあり、そのユーザはレーティング対象外となります。

レーティング計算の仕方

レーティング計算は対戦サーバとは別に処理されます。レーティング計算プログラムは、対戦サーバが残す対戦ログ(棋譜)から勝敗を読み取り、各プレイヤーのレーティングを割り出します。上記プレイヤーIDの話も、対戦サーバ上のフェイズとレーティング計算上のフェイズとが混在しています。

レーティング対象局の棋譜では、コメントとして、両プレイヤーのIDが付加されます。 mk_rateコマンドは、棋譜を検索して、レーティング対象局からプレイヤーのレートを 計算します。このように、レーティング計算はバッチ処理で一括して行われます。 コマンド例:

$ ./mk_rate . > players.yaml

計算結果は、players.yamlとして保存してください。 対戦サーバは、shogi-serverコマンドと同じディレクトリ内のplayers.yamlファイルを参照します。%%RATINGコマンドにて、各プレイヤーのレーティング一覧を確認できます。

レーティングの値は、相手の値との差分が意味をなすため、 全プレイヤーの値を平行移動する自由度があります。そのため、絶対値にはあまり意味がなく、 他のレーティングシステムとは直接比較できません。

players.yamlのデータをHTMLファイルに出力できます。コマンド例:

$ ./mk_html < players.yaml > players.html

計算式

計算式はこれです。

勝敗数の半減期効果

2007-02-18より、勝敗数の半減期効果を導入しました。現在のレーティングを算出するにあたり、過去の勝敗よりも現在の勝敗を重視すべきです。運用開始からだいぶ時間が経ち、過去のゲームが溜ってきたため、過去の勝敗数を目減りさせるようにしました。具体的には、60日の半減期(式で書けば、exp(-0.693/60*days))を設けました。すなわち、60日前の2勝(2敗)は今日の1勝(1敗)に相当します。

ただし、ゲームの翌日からすぐに目減りすると、短期的な自己対戦などに不都合が生じる可能性があるので、1週間をすぎてから効果を受けます。

半減期効果で目減りさせたあと、冒頭で説明したレーティング対象のフィルタリングをするため、ゲームをしていないプレーヤは、時間経過にともない、自然とレーティングには現れなくなります。

謝辞

式および実装は、http://hosi.org/a/Rating.htmlを参考にしました。作者様に感謝申し上げます。


プロジェクトの情報
$Date$