技術書典5 配置決定

2018年10月8日開催の技術書典5における当サークル「ヤマブキ計算所」の配置が決定しました。場所は「え32」となります。

ポケモンバトルの戦略を人工知能に考えさせるとどうなるか、というテーマで本を出します。 ルールは初代(赤・緑)ベースで、交換なしの1対1バトルに絞ります。 まだ技術開発が済んでいないため暫定的ではありますが、次のような内容を予定しています。

ある程度ゲームをやりこんだ人間が考える戦略には遠く及びませんが、できるだけヒントを与えずにどこまで強くできるのかが見所です。

技術書典5 当選しました

2018年10月8日に開催される技術書オンリーイベント技術書典5」に当選しました。

サークル名は「ヤマブキ計算所」です。 内容は、ポケモンバトルの戦略を自作の人工知能に考えさせるというものを予定しております。昨年末にWebで公開した内容の続編となります。

select766.hatenablog.com

現在アルゴリズムの研究を進めており、その結果は随時このブログにも掲載していきます。紙媒体の同人誌配布は初めてですが、どうぞよろしくお願いいたします。

世界コンピュータ将棋選手権でのAWSクラウド利用法(WCSC28)

世界コンピュータ将棋選手権では、コンピュータのハードウェアに関する制限がなく、開発者が用意したコンピュータを利用して対局を行います。 最近ではAmazon Web Services (AWS)をはじめとしたクラウドを利用することが多くなっています。買えば数百万円する高性能マシンを1時間当たり100円程度で借りることができるため、大会のように短期間だけ強力な計算リソースが必要な時に役立ちます。

クラウドの使い方はネット上に多数記事があるので適宜検索してもらうとして、選手権でクラウドを使うための追加情報を書きたいと思います。 ここから先はクラウドのうちAWSのEC2に絞って解説します。

AWSへのユーザ登録、EC2でインスタンス起動ができるところまではすでに済んでいるものと想定します。

  • リモート参加申請
  • SSHでの指し手送受信設定
  • 会場端末の準備

全体の接続図は次のようになります。 f:id:select766:20180509202848p:plain

リモート参加申請

選手権でクラウドを用いるためには、原則として参加登録時に「リモート参加」を申請しておく必要があります。

選手権では、本来会場内に設置したコンピュータで将棋の思考を行うのが標準です。 リモート参加の申請とは、簡単に言えば、対局中に会場内のコンピュータからインターネットに接続する権利を得るということです。 会場に行かずにネットで完結するということはできない ので注意してください。リモート参加の場合でも、会場に設置するコンピュータ(以下、端末と呼ぶ)が必要になります。

この申請をしておくことで、有線インターネット接続が可能となります。

SSHでの指し手送受信設定

この項目はやねうら王など、USIプロトコル対応のエンジンをクラウド上で動かし、対局サーバとの通信(CSAプロトコル)には会場に設置した端末上で将棋所を利用する場合の設定です。

USIプロトコルSSH経由で通信が可能なので、これを用いるのが便利です。SSH自体は極めて一般的なのでググってください。

クラウドのOSがLinuxなら、デフォルトでsshサーバがつかえると思います。 私はWindowsサーバを使いましたが、Win32 OpenSSHを活用しました。 必要に応じてOSのファイアウォールAWSのSecurity Group(ポート22を解放)を設定してクライアントからsshサーバに接続できるようにします。

端末側はsshクライアントを入れておきます。Linuxなら標準で入っているでしょうし、WindowsならGit for Windowsでインストールされるツールが使えます。 Git for Windowsをインストールすると、C:\Program Files\Git\usr\bin\ssh.exesshクライアントプログラムとして使えます。

また、公開鍵認証などの設定をして、パスワードなしで対象端末にログインできるように設定してください。USIコマンド以外の入力が必要だと、将棋所から使えません。

sshの設定とクラウド上でのUSIエンジンの設定ができたら、将棋所から使えるように設定します。

Windows端末の場合、以下のようなバッチファイルを作成します。

yaneuraou.bat

"C:\Program Files\Git\usr\bin\ssh.exe" Administrator@123.45.67.89 "C:\Users\Administrator\Documents\yaneuraou\YaneuraOu-user.exe"

123.45.67.89は、クラウド上マシンのIPアドレスです。立ち上げなおすと毎回変わると思いますので、その都度書き換えが必要です。 "C:\Users\Administrator\Documents\yaneuraou\YaneuraOu-user.exe"の部分はUSIエンジンの(クラウド上の)パスです。クラウドのOSがLinuxなら、/home/ec2-user/yaneuraouのような指定になると思います。

このバッチファイルをダブルクリックして、usiとタイプしてEnterを入力しましょう。optionなどの行が出力され、最後にusiokが出力されればOKです。

初回接続の際はThe authenticity of host...というメッセージが出て、yesと入力する必要があるかもしれません。この状態だと将棋所から使えないので注意してください。一度済ませれば2回目以降は出ないはずですが、クラウドIPアドレスが変わると再度聞かれます。

将棋所のエンジン管理画面から、このバッチファイルをエンジンとして追加します。拡張子exeのファイルしか一覧に出ませんが、ファイル名のところにyaneuraou.batと手入力すれば通ります。これでエンジン登録に成功すれば、クラウド上で動くUSIエンジンを手元の端末から使えるようになりました。

エンジン固有の設定をしたのちLesserkai等と対局させて、動作確認をしましょう。

会場端末の準備

冒頭の図で示した通り、会場で通信の仲介をするための端末が必要です。計算能力はほとんど必要ないので、軽いノートPCが便利でしょう。この中に、将棋所、SSHクライアントをインストールしておきます。

必要なもの

  • ノートPC(有線LANのポート2つ)
  • LANケーブル2本(長さ3m以上)

無線LANは使えず、有線LAN(イーサネット)のポートが 2つ 必要となります。1つは会場内の対局サーバとの接続、もう1つはインターネットへの接続に使います。1つのポートで兼用することは原則できません。2つLANポートがついているノートPCはほとんどないでしょうから、USB等で増設する必要があります。

私はLANポートなし、USB1つのタブレットPCを使ったので、2つLANポートを増設しました。USBハブ付きLANアダプタ EDC-GUA3H-Wと通常のUSB-LANアダプタETX3-US2を階層的につなぐことで乗り切りました。ただし、ETX3-US2はUSBハブ経由での接続は保証しないとなっているため、自己責任です。

会場側に用意されているのはスイッチングハブまでで、接続用のLANケーブルが各ネットワーク用に必要で、合計2本持参する必要があります。

IPアドレスの設定ですが、対局サーバとの通信ポートには主催者から指定された固定IPアドレスを設定する必要があります。 http://121ware.com/qasearch/1007/app/servlet/qadoc?QID=018061などの情報を参照して設定できるようにしておきましょう。WCSC28では、IPアドレスは"192.168.20.x"(xはユーザにより異なる)、サブネットマスクは"255.255.255.0"、デフォルトゲートウェイはなし(閉じたネットワーク)、DNSサーバもなしでした。インターネット側は無設定でつながりました。

会場に着いて接続ができたら、EC2のインスタンスを起動します。インスタンスIPアドレスが判明したら、先述のyaneuraou.batの該当部分を書き換え、接続を確認します。Lesserkai等との対局を行ってエンジンが正しく動くことを確認しましょう。最後に、他の参加者にお願いして対局サーバを介したテスト対局を行いましょう。

注意事項

クラウド特有のリスクがあるのでご注意ください。

  • インターネット接続は無保証です。接続できずに不戦敗という事態もありえないわけではありません。
  • AWSの場合東京より海外のデータセンターのほうが安いですが、その分遅延時間が増えることに注意しましょう。
  • AWSのリソースも有限なので、所望のインスタンスが他の人に占有されていて立ち上げられないという事態がありえます。

クラウドの利用は設定が面倒だったり、特有のリスクもありますが、強力な計算能力でソフトの能力を最大限発揮させる有効な手段です。検討してみてはいかがでしょうか。

第28回世界コンピュータ将棋選手権に参加しました

2018年5月3日~5日にかけて行われた、第28回世界コンピュータ将棋選手権(WCSC28)に参加しました。 大会中の記録です。技術情報はまた別の記事で書きます。

結果を述べると、1次予選で5勝3敗(1不戦勝含む)で15位となり、2次予選には進めませんでした。

大会概要

世界コンピュータ将棋選手権はコンピュータ将棋協会(CSA)主催の将棋AIの大会です。

今年は前年に引き続き、神奈川県川崎市川崎市産業振興会館にて行われました。

大会の特徴は使用するコンピュータに性能・台数・設置場所(インターネット経由で大学やクラウド上の計算機も使用可)に制限がないことで、統一ハードウェアで行われる電王トーナメントとの大きな違いになっています。 逆に言えば、自前でコンピュータを用意しないと大会に出られません。

5月2日(準備日)

大会前日の夕方から会場入りすることができます。

ねね将棋はクラウド上のマシンで思考するので、会場では通信用タブレットPCのみを用いました。初参加ということもあり、万全を期して前日に配線と動作確認をしておきました。

設営済みの状態はこんな感じで、広々としています。 f:id:select766:20180507215859j:plain

5月3日(1次予選)

ねね将棋は選手権初参加なので、1次予選(5月3日)スタートです。

AWSクラウド上のマシン(p3.16xlarge)を立ち上げ、対局を行いました。

p3.16xlargeはNVIDIA Tesla V100という最先端GPUが8台搭載されたマシンです。まともに買うと1000万円以上します。 1時間当たり27ドル、約3000円です。1局対戦するごとに3000円払うのは精神が削られますが仕方ありません。

OSはWindowsにしました。無料のLinuxとくらべ値段が少し高くなるのですが、プログラムをLinux対応させてデバッグする気力がありませんでした。 リージョンはバージニア北部です。東京のほうが通信遅延が少なくちょっと得なのですが、値段が高いです。

こんな感じの請求になりました。 f:id:select766:20180507215625p:plain 前の月にデバッグ等で動かしていたので、あわせて5万円ぐらいかかりました。

各対戦結果です。

相手 勝敗
SilverBullet 〇(不戦勝)
Hefeweizen ×
名人コブラ ×
ツツカナ ×
隠岐
オッズの魔法使い
ichibinichi
dainomaruDNNc

SilverBullet戦は、相手の準備ができていないということで不戦勝となりました。

ツツカナは最初の2戦を準備ができていないため不戦敗となっていました。その後準備ができ、ねね将棋は惜しくも敗れました。 第3局終了時点の勝ち数で並んでいたということで対戦になりましたが、結果的にはこの負けが致命傷でした。

不戦勝からの3連敗で、一度も実力で勝つことなく折り返しました。なかなか重い空気でした。

終戦のdainomaruDNNcはdlshogiライブラリを使っており、Deep Learning勢の対決となりました。70手目まで互角の緊迫した戦いをねね将棋が制し、5勝3敗、勝ち越しとなりました。 f:id:select766:20180507221142j:plain

5勝3敗のチームのうち上位2チームが2次予選に進めるという状況でしたが、ソルコフ(対戦相手の勝ち数の合計)で劣り、ねね将棋は1次予選敗退が決まりました。 同じく5勝3敗のdlshogiは2次予選に進むことができ、Deep Learning勢としては初の1次予選突破になったと思われます。

昨年11月の電王トーナメントでは3勝5敗でしたので、成績は上がりました。floodgate上のレーティングも1700から2800まで上がったので実力通りの結果というところでしょうか。

大会中は他の開発者といろいろな情報交換ができました。特にdlshogiの山岡さん、broadenの中屋敷さんなどDeep Learningを利用した方々との交流でいろいろなアイデアが得られました。 まだまだ成績が伸ばせそうなので、これからも開発を続けていきたいです。

最後に、大会運営の方々、また対局・交流してくださった開発者の方々にお礼申し上げます。

ねね将棋(WCSC28)のソースコード公開

第28回世界コンピュータ将棋選手権(WCSC28)関係者の皆様、お疲れさまでした。

私は将棋ソフト「ねね将棋」を参加させました。大会の模様は別途記事を書きたいと考えていますが、取り急ぎ、ソースコードを公開いたしました。

やねうら王ライブラリを使用しつつ過去の資産を流用した都合で3つのリポジトリに分断されてしまっています。

github.com

github.com

https://github.com/select766/ipqueue

セットアップが面倒なので、将棋ソフトの実用品としてはおすすめしません。次回こそはもう少し扱いやすい構成にしたいと思っています。

MCTSの探索部をシングルスレッドにした点が他の参加者から興味を持たれました。この辺りに関する工夫を中心に、ソースコードの解説記事を執筆するつもりです。 探索部コアはuser-search_mcts_async.cppに入っています。

ねね将棋miniを開発しました

第28回世界コンピュータ将棋選手権まで1か月を切りました。開発者の皆様いかがお過ごしでしょうか。

開発がうまくいかないので現実逃避として、将棋におけるディープラーニング評価関数の雰囲気を知ってもらうため、「ねね将棋mini」というアプリを開発しました。 アプリとはいっても、インストールは不要でWebブラウザ上で動作します。こちらからご覧ください。https://select766.github.io/neneshogi_mini/ 1MB程度のロードが発生しますが、最新のWebブラウザが載っていればスマホでも動作します。

概要

ディープラーニングを使うと、局面を受け取って次の適切な指し手を予測するDNNモデル(ディープニューラルネットワーク)を学習することができます。 DNNの表現力は大きく、先の展開を探索しなくても既存の将棋AIの指し手を40%程度の確率で当てることができます。 そこで、ねね将棋のために学習したDNNで(探索なしに)指し手を選択し、自己対局するアプリが「ねね将棋mini」です。 ディープラーニングの棋風といえるほどのものがあるかはわかりませんが、探索がないのにうまい感じに寄せたりするのは見ていて面白いですよ。

この記事では、ねね将棋miniを構成する技術要素を解説します。

主な要素は次の通りです。

  • DNN
    • 指し手を決定するコアとなるモデル(評価関数)です。
    • やねうらおさん提供の棋譜をもとに教師あり学習しています。
  • DNNのランタイムフレームワーク
    • ねね将棋miniでは、生成済みの棋譜をダウンロードするのではなく、Webブラウザ上でDNNを実行し、1手ずつ指し手を生成しています。
    • Webブラウザ上でDNNを実行するためのフレームワークWebDNNを活用しています。
  • 将棋盤の表現
    • 駒の利きなどを含めた将棋盤の表現をWebブラウザ上で行うためにShogi.jsを活用しています。
    • 王手のチェックがなく、そのままでは合法手生成に使えなかったためforkして機能を足しました。
    • 王手放置、打ち歩詰めを考慮した合法手生成機能を実装しました。
  • DNNの入力生成
    • DNNの入力は3次元のテンソル形式で行います。これは86×9×9のテンソルになっており、駒の配置の情報を加工して入力する必要があります。
    • 1次元のフラットなベクトル上で操作するのがわかりにくかったので、ndarrayというライブラリで抽象化しました。

DNN

局面(盤上の駒配置、持ち駒、王手かどうか等)を入力とし、各指し手の確率を出力するモデルです。構造としてはConvolutional Neural Networkです。

以下の棋譜を利用させていただきました。 depth10で作った110億局面の教師データ、期間限定で公開します

ねね将棋miniでは複雑さの違う2種類のモデルを提供していて、"small1"では35%、"large1"では40%程度の確率で学習元の棋譜の指し手を当てられる(その指し手の確率が最大となる)ようです。 "small1"だと圧縮した状態で1MBを切るサイズとなっています。

DNNのランタイムフレームワーク

ねね将棋miniでは、生成済みの棋譜をダウンロードするのではなく、Webブラウザ上でDNNを実行し、1手ずつ指し手を生成しています。 初公開バージョンはAI同士の自動対局のみなので生成済み棋譜のダウンロードでもよいのですが、今後人間との対局機能を追加したいと考えています。 その際にはユーザの指し手に呼応してDNNの実行をする必要があります。 DNNの実行が可能なサーバを準備するとなると無料のものはほぼなく、AWS等にお金を払い続けなければなりません。 そこで、アプリを実行するユーザ側の端末上でDNNを実行することにしました。この方式であれば、サーバからは静的なモデルファイルを配布するだけでよくgithub pagesにて無料で公開することができました。 ディープラーニング関連のことをやろうとするとNVIDIA社のGPUを用意し、CUDAのセットアップをして云々という面倒な環境構築が頭をよぎりますが、 Webブラウザの機種非依存の標準機能だけを用いて動作するようになっているため簡単に試すことができます。

DNNの学習自体はChainerフレームワークで行ったのですが、WebDNNというフレームワークによりWebブラウザ上で動作する形に変換することができます。 計算の最適化、モデルの圧縮機能等も搭載されています。今回は使用しませんでしたが、GPUを利用する機能も含まれています。 Chainerモデルの変換は特に難しいことはなく、本体部分は10行程度のpythonコードで書けました。 https://github.com/select766/neneshogi_mini/blob/master/model_convert/model_convert.py

既存のモデルクラスを読み込み、学習したパラメータをセットします。

def load_model(model_config):
    model = Model(**model_config["options"])
    chainer.serializers.load_npz(model_config["path"], model)
    return model

ダミーのデータを流し、計算グラフを取り出します。move, valueというのは方策と状態価値関数(評価値)の2つを出力とするモデルだからです。 train=Falseとし、batch normalizationを無効にしていないとおかしくなるので注意。

def get_graph(model):
    dummy_input = np.zeros((1, 86, 9, 9), dtype=np.float32)
    x = chainer.Variable(dummy_input)
    with chainer.using_config("train", False):  # disable batch normalization
        move, value = model.forward(x)
    graph = ChainerConverter().convert([x], [move, value])
    return graph

ブラウザに読み込ませるデータを生成します。ブラウザ上の計算環境としてWebGPU, WebGL, WebAssembly等が選べます。試してみたところWebAssemblyで十分な速度が出たのでこれを使いました。

exec_info = generate_descriptor("webassembly", graph, constant_encoder_name="eightbit")
output_dir = f"../docs/webdnn_model/{model_config['name']}"
exec_info.save(output_dir)

特に変わったところもないモデルなので、すんなりと変換ができました。

将棋盤の表現

JavaScriptで駒の配置や合法手の列挙等が必要なので、Shogi.jsというライブラリを利用しました。盤面の状態はシンプルに配列で表現されていて使い始めるのは簡単でした。

駒の動ける範囲の生成まではあるのですが、王手放置のチェックが実装されていませんでした。探索の指し手生成としては非効率ですが、速度は今回問題にならないため簡単な実装をしました。アイデアは、指した後に手番でなくなる側が王手をかけられていれば王手放置(開き王手を含む)ということです。手番でない側の駒の動きを生成し、その中に相手玉の位置が入っていれば王手放置、という実装になっています。

if (piece.color !== color) {
    let moves = this.getMovesFrom(i, j);
    for (let k = 0; k < moves.length; k++) {
        let move = moves[k];
        if (move.to.x === kingPos.x && move.to.y === kingPos.y) {
            return true;
        }
    }
}

全体をつなげてUIをくっつける

将棋盤とDNNをくっつけ、最後にユーザーインターフェースを実装して出来上がりです。

DNNの入力は86×9×9のテンソルになっています。テンソル上のインデックスをT(c,y,x)としたとき、座標(2, 3)に手番側の飛車があればT(6, 2, 3)=1というように値をセットします。 WebDNNの入力は6966(=86×9×9)要素の配列となっており、直接値をセットしようとするとT[6 * (9 * 9) + 2 * 9 + 3] = 1のようにインデックス計算が煩雑になります。

そこで、ndarrayというライブラリを用いて抽象化しました。先ほどの値のセットは次のようにわかりやすくなりました。

let array = ndarray(raw_array, [86, 9, 9]);
array.set(6, 2, 3, 1);

DNNの出力も、入力と同じような状況です。合法手それぞれの確率を取り出すことができるので、それに従ってランダムに手を選ぶようにしました。 最大確率の手を指すのが一番強いはずですが、それだと毎回同じ進行になってしまうため、ある程度展開がばらけつつ不自然にもならないようなパラメータを選択しました。

UI部分は極力シンプルに実装しました。10×10のテーブルに駒の文字を入れて盤面の表現にしました。後手番の駒の文字は上下逆にする必要がありますが、画像としては用意せずにCSSで文字を回転させました。

今後

やはり対人戦ができたほうが面白いと思います。そんなに複雑ではないので近日中に実装できればと思います。

このデモに組み込まれているものより強いモデルをお持ちの方、リポジトリをforkして自分だけのデモを作ってみてはいかがでしょうか。

ルンバは銀座線から東西線に乗り換えられるか?~同一ホーム乗り換えでどこまで行けるか~

一発ネタです。長らくブログを書いていなかったので生存確認を兼ねて。

イントロダクション

駅で電車同士を乗り換える時、階段を使って別のホームに行く場合と、同じホームで向かい側に止まっている電車に乗り換えたり、後続の電車を待ったりする場合がありますよね。 新潟駅では新幹線と在来線を同じホームで乗り換えられるように工事中ということで、同じホームで電車を乗り継げるというのは利便性に重要なことだと認識されています。 そのようなニュースを見ていると、ある駅を出発して、同じホームでの乗り換えだけでどこまでたどり着けるのかが気になりました。

今回は首都圏の路線で考えます。地上の路線は、同じ平面上に多数のホームが並んでいて、うまく乗り継いでいけば様々な路線に行けそうです。 一方で地下鉄は同じ駅でも路線ごとに深さが違っている場合が多く、階段なしにほかの路線へ乗り換えられる駅はあまりありません。しかし、首都圏では地上を走る他社線への直通が多く、直通先で乗り継げばなんとかなるかもしれません。

今回の目標は、銀座線浅草駅を出発点として、同一ホーム上での乗り換えを繰り返すだけでどの地下鉄路線(東京メトロ線・都営地下鉄線)に乗り換えられるか、を調べることと設定しました。 階段を使えないルンバの気持ちになって考えてみましょう*1

条件を定式化します。微妙なケースは今回存在しませんでした。

  • 同一ホーム乗換とは、駅にてある電車から降りた後、そのホームに接するいずれかの線路に入ってきた電車に乗り換えることを指します。同じ線路を走る後続列車でもかまいません。
    • 改札を通ったり高さの違う場所を通ることはできません。
    • 終着駅のくし形ホーム(Eの字)の扱いは微妙です。
  • 定期列車であれば、本数の少ない直通列車を利用してもかまいません。
  • 乗車券の発売要件は気にしません。物理的に実行可能*2なら、終点または途中駅での折り返し乗車も可です。

調べ方ですが、路線図を見ながら接続駅の構内図を検索し、ある路線と別の路線が乗り換え可能かを調べていきます。2018年3月時点の情報に基づきます。駅名から、駅の構内図等へのリンクを張っています。

それでは出発です。

PASMOエリアの路線図 を見ながらだとわかりやすいです。

銀座線→丸ノ内線半蔵門線

特段意味はないのですが、日本初の地下鉄の起点である銀座線浅草駅を出発点に選びました。

銀座線は他社との直通がありません。しかしいきなり詰み、ではありません。地下鉄としては珍しく、同一ホーム上で別路線との乗り換えが可能です。 赤坂見附丸ノ内線表参道半蔵門線と同一ホームで乗り換えられます。

丸ノ内線も同様に他路線との直通がなく、ここで行き止まりです。なお、赤坂見附から支線の方南町へは直通列車がありませんが、中野坂上で乗り換え可能です。

半蔵門線東急田園都市線東急大井町線東急目黒線南北線三田線

半蔵門線は渋谷から東急田園都市線と直通しており、ここから多数の路線につながります。

東急田園都市線二子玉川東急大井町線と乗り換えが可能、東急大井町線大岡山東急目黒線と乗り換えが可能です。 東急目黒線は目黒にて南北線三田線と直通しています。

銀座線浅草からここまでを図にすると、次のようになります。

f:id:select766:20180305214239p:plain
銀座線~東急線南北線

②では、同一路線の反対方向の線路に移るために適当な駅(中央林間等)で折り返します。

南北線はさらに埼玉高速鉄道線に直通していますが、そこまでで行き止まりです。三田線も同様に行き止まりです。

東急目黒線東急東横線副都心線有楽町線

東急目黒線田園調布にて東急東横線と乗り換えが可能、東急東横線副都心線と直通しています。

副都心線小竹向原和光市有楽町線と線路を共用しており、有楽町線へもつながります。 副都心線からは東武東上線西武池袋線への直通列車があり、西武のほぼすべての路線(孤立している西武多摩川線を除く)に乗り換えが可能でした。気が向いたら郊外私鉄同士のつながりも可視化したいところです。

東急東横線日比谷線

東急東横線中目黒にて日比谷線と乗り換えが可能です。以前は直通がありましたが、今は乗り換えが必要になっています。

半蔵門線新宿線

半蔵門線新宿線九段下で乗り換えが可能です。一応半蔵門線新宿線は別会社なので、2013年までは壁で仕切られていました。参考

新宿線からの直通で、京王線へも乗り換えが可能です。

ここからが難しい

ここまで、東急線の助けだけで多くの路線に同一ホームで乗り換えられることがわかりました。地下鉄13路線のうち、9路線を制覇できました。

残っているのは、東西線・千代田線・浅草線大江戸線です。東西線・千代田線は、ともにJRの路線に直通しています。JRの広大なネットワークにどこか「穴」があれば、これらの路線に乗り換えられそうです。

半蔵門線東武伊勢崎線東武日光線→特急スペーシア→JR湘南新宿ライン

今までに到達した路線から、JRに抜けるルートはないのでしょうか?1件だけ見つけました。東武とJRを直通する特急スペーシアの利用です。

半蔵門線東武伊勢崎線スカイツリーライン)に直通しています。途中で東武日光線東武日光行きの電車に乗り換えることが可能で、楡木(にれぎ)等で折り返すことにより栃木の浅草方面ホームに到達できます。ここでJR新宿行きの特急スペーシアに乗車でき、栗橋駅でJR線に入り、JR湘南新宿ラインの経路を通って大宮駅に到達します。

なお、栗橋駅はこの直通列車に乗る以外では東武とJRで改札が分離されており、またこの列車ではSuica/PASMOが利用できないという特殊仕様になっています。

別解として、福島県まで北上する必要がありますが東武日光線東武鬼怒川線野岩鉄道会津鉄道→JR只見線→JR磐越西線JR東北本線という経路も可能かもしれません。

さて、無理やりながらJR線に入ることができました。

JR湘南新宿ライン→JR上野東京ライン常磐快速線常磐線各駅停車→千代田線

スペーシアきぬがわ号はJR湘南新宿ラインの経路で大宮に到着するので、3番線か4番線に到着するものと考えられます。ここでJR上野東京ラインに乗り換え、新橋へ行きます。 新橋で逆方向の上野東京ライン(常磐線直通)に乗り換えられます。

常磐線複々線で、上野東京ラインから常磐線に直通する列車は快速線、一方で千代田線からの直通列車は各駅停車線を走行します。 最後のポイントは、松戸の3・4番線で常磐快速線から常磐線各駅停車に乗り換える点です。ほかの駅では快速と各駅停車のホームが別になっており乗り換えられません。

常磐線各駅停車から千代田線への直通列車に乗れば、千代田線に入ることができます。10路線目もなんとかなりました。

JR湘南新宿ライン→特急成田エクスプレス中央快速線→中央線各駅停車→東西線

東西線はJR中央・総武線各駅停車と直通しており、千代田線と同じように考えれば乗り換えられます。しかし中央線系統は意外にも他のJR路線との独立性が高く、容易には入れません。

記事公開時点では難所としていましたが、twitter@surrogatepairさんに教えてもらいました。

この情報を踏まえた解は次のようになります。

まず、スペーシアきぬがわ号を浦和で降り、同じ方向の湘南新宿ライン(大船方面横須賀線直通)に乗り鎌倉に行きます。次に逆方向の総武快速線直通列車に乗り換え、稲毛で折り返し、津田沼3番線に到着します。向かい側4番線が各駅停車なので、ここでJR中央・総武線各駅停車に入ることができました。稲毛など適当な駅で西方向に折り返し、中野を通り過ぎて高円寺などで東西線直通列車に乗り換えます。

結果として、快速と各駅停車がホームを共用する特別な駅を使う、という解法で千代田線も東西線も解けることがわかりました。@surrogatepairさんありがとうございました。

記事公開時点での想定解を残しておきます。

数少ない直通列車を使う以外では解が見つかりませんでした。その一例を紹介します。

まず、スペーシアきぬがわ号を浦和で降り、同じ方向の湘南新宿ライン(大船方面)に乗り渋谷に行きます。 次に逆方向の特急成田エクスプレス中央快速線直通、高尾行き)に乗り換え、吉祥寺で逆方向(東京方面)の中央線快速電車に乗り換えます。 御茶ノ水で中央線各駅停車に同じホームで乗り換えられます。錦糸町など適当な駅で西方向に折り返し、中野を通り過ぎて高円寺などで東西線直通列車に乗り換えます。

中央線各駅停車に入る方法はいくつか別解があります。

ですがどれも1日数本しかない列車が必要となり、どうも不完全燃焼でした。

これでどうにか東西線に入ることができました。地下鉄13路線のうち11路線制覇です。

浅草線大江戸線は孤立

大江戸線は郊外への直通もなく、完全に孤立しています。

浅草線は、両端で京急線・京成線に直通しており、広いネットワークを持っています。しかしながら、いままで挙げた11路線とそこからたどれる路線群とは孤立しているようです。 東京近郊区間大回り Wiki*を参照したところ、浅草線から直通している路線群から改札を通らずに他の地下鉄線に戻ってくることはできなさそうです。

新幹線

地下鉄線ではありませんが、東京駅などで在来線から乗り換える際にも改札がある新幹線は、他路線と同一ホームでの(改札を通らない)乗り換えは不可能なのでしょうか? 新幹線と在来線を同一ホームで乗り換えられるよう工事中の新潟駅でも、ホーム上で改札を通らなければならない構造になるようです。参考

しかし、手段は存在しました。東北新幹線から直通する山形新幹線は、普通列車と同じ線路を共用しているのがポイントです。 東北本線福島へ行き、山形線に乗り換えます。福島4番線に到着するような列車を選ぶ必要があります。 山形線赤湯へ行くと、同じホームで同じ方向の山形新幹線の列車に乗り換えられます。あとは新庄で折り返して東北新幹線の東京駅に行けます。東京駅でさらに乗り継げば、東北新幹線の仙台方面や、北海道新幹線上越新幹線北陸新幹線にも乗り継げることになります。

東海道新幹線方面は、山陽新幹線九州新幹線を含めてもこのような抜け道はなさそうです。

まとめ

東京の地下鉄路線同士を、同一ホーム上の乗り換えだけでどこまでつなげられるかという思い付きを検証してみました。

結果として、銀座線を起点としたとき、「銀座線・丸ノ内線半蔵門線新宿線」は地下鉄内で乗り換え可能、東急線を介することで「南北線三田線副都心線有楽町線日比谷線」に乗り換えられました。 東武線とJR線を直通する特急列車を用いることで、「千代田線・東西線」へもなんとか乗り換えが可能でした。一方、浅草線大江戸線は、それぞれ孤立していることがわかりました。

普通の乗り換え検索とは違う、たいして役に立たない一発ネタにお付き合いありがとうございました。

*1:電車とホームの隙間を乗り越えられるのかは知りませんが。

*2:銀座線渋谷駅のように、乗降ホームが完全に分離されている場合は不可