jj1gujのブログ

アイコン画像は音速の奇行子 様よりいただきました

WCSC31参加記

第31回世界コンピュータ将棋選手権(WCSC31)に参加したよ!!

世界コンピュータ将棋選手権って何?

毎年ゴールデンウィークに行われる最強の将棋ソフトを決める大会. 特徴としてはマシン構成に制限がないこと.(過去に行われていた電王戦ではマシンスペックはすべて統一されていた) 例年川崎産業振興会館で開催されているけど今年はコロナのせいでオンラインになった. 今年で31回目(第30回はアイツのせいで中止)の由緒ある大きい大会. わかんなかったらとりあえずググればいいと思うの.

どんなソフトで出たの?

名前はponkotsu(色々準備できたらgithubのURL貼る)

ソフト名の由来はもし勝てたら負けたソフトor人はぽんこつに負けたってことになって悔しくなるだろうなあ笑って思ったからです(邪悪)
どんな技術突っ込(みたかった)んだかはアピール文書見てください.

さあ, こっから本文です!!

11月

電竜戦をやると聞き, 出てみたいなあと思いつつ色々調べて開発しようとするも間に合わなくて断念する. というかそもそもどのライブラリ使うかとか仕様が固まってなかった.

12月

学会発表で無事死亡

1月

卒論で無事死亡

2月

卒論発表終わってから嬉々として本格的に開発を始めるもlibtorchとcshogiの仕様にあまり詳しくないため開発が難航し大泣きする. てかこれ愚痴なんですけどlibtorchのことググるとpytorch出てくるのあれ何なんすか?pytorchとかいじって自称AIやってるいけいけエンジニアたちちゃんとlibtorchの記事も書けや*1 まあおかげで英語のドキュメント読むの苦にならなくなったりわかんなくなったらgithubのissueとかソースコード読んだりする習慣がついたのでね… クソ記事がでてこないというのもね…おっと, 誰かきたようだ…

3月

帰省したり諸事情で若干メンタルやられたりするものの一応進捗は生む.
AHC001に時間を吸われて進捗が虚無になる.

4月

4月末まで一切進捗を産まない*2*3.
4/18 に作業通話しながら一応動くものを完成させる.

4月末

弊研のボスにWCSC31出るんすよ~笑って言ったらめちゃくちゃ応援されたのでがんばって進捗を生む.
もともと探索機能を入れる予定はなかったけどABCで培った早解き力()*4MCTSを実装する.

4/25

AHC002に出る.
ギリギリで提出した解で順位が上がったのでいいコンテストだった.

4/29~5/2

盤面を特徴量ベクトルに変換するところでバグり散らかしてることに気づき格闘する.
5/2とか徹夜状態でバグと格闘して椅子の上で1時間寝たためか腰を痛める*5

当日朝4時

前日20時とかに寝たので4時くらいに目が冷めてバグがないか確認する.

当日朝5時

MCTS周りでバグを見つける. 全俺が泣いた.

当日朝9時

ローカルでできる限りロールバックしてとりあえず動く状態(でいるつもり)のバイナリを生成する.

1回戦(対ねね将棋)

生成しておいたバイナリがクラッシュして負ける. かなしい… 残った時間で朝発見したバグと格闘する.

2回戦(対こまあそび)

朝発見したバグと格闘しつつあっけなく負ける.

3回戦(対Aoba Zero)

開発者の方とお話しつつバグと格闘する*6 ponkotsuの飛車が単振動してるのみて「やっぱバグってますね~」って言われる.

4回戦(対きふわらべ)

たしかここらへんでお昼ごはんに納豆ご飯食べてたと思う. 史上初めてきふわらべが頭金打って勝つという歴史的快挙を達成する.

敗者コメントだぞっ☆

5回戦(対Easy Shogi)

デバッグしながら見てたら千日手になったのでとりあえず全敗は免れて安心するが棋譜中継だとわいの反則負けになっててまじいい?ってお気持ちになる. 後でEasy Shogi側の連続王手による千日手ということで反則勝ちに. 初勝利!やったね!

なおこれでバグと格闘するモチベーションが消え諦める.

6回戦(対BFP)

バグつぶしを諦めて落ち着いてうちのぽんこつポンコツっぷりを発揮して瞬殺されるところを見届ける.

7回戦(対A.I. AN shogi ver.1)

今度はちゃんと詰まして2勝目を上げる. やったね!

ちなみに親に詰まして勝ったって報告したときの親からのコメントです.f:id:jj1guj:20210505023734p:plain

ちくちく言葉は, やめようね笑

8回戦前

おなか空いたのでご飯を勝ってくる.

8回戦(対山田将棋)

あっけなく順当に負ける.

終結

なんかソルコフ?の関係で28位フィニッシュ, 2勝勢ではトップの成績だった.

感想

正直全敗かな~って思ってたし1勝できれば御の字だと思ってたのでまさか2勝できるとは思ってもいませんでした!!某2冠の言葉を借りれば望外の結果, 僥倖ってやつですね!今回はとりあえず動いたから就活のネタにする*7&世界ランクをもらうっていうかなり軽くて薄いモチベーション*8で本当にやりたいことの1割もできてなかったので来年はやりたいことを全部出しきった状態で出ます!!

今後の展望

とりあえず探索がバグってるのでそこを潰して強くしたいです!あと, 今日やってた2次予選の棋譜とかみてここに追いつきたいってなったのでがんばりたいです!!
うっ…院の課題…
うっ…就活…
うっ…学会発表…

*1:書かれたら書かれたでくっっっっっっっっっそよみにくいクソ記事しかでなさそう

*2:大学院入学とか春アニメチェックするので忙しかったのでね… ところで今期は86とスライム倒して300年とVivyが好きです!!

*3:完全な愚痴なんですが弊所属, めちゃくちゃ名前長いしコンピテンス?とかいう変なやつを考えながら履修組まなきゃいけなくてむちゃくちゃめんどくさくてまじでクソ

*4:月刊競技プログラミングは役に立つ案件

*5:腰痛めたの人生で初めてだった

*6:なんか2080Ti 6台くらいつなげてたらしい. すげ~

*7:将棋AI作って世界大会でて2勝しました!!って言ったらちやほやしてくんねえかなあ

*8:本当は自分より強い状態で出したかったが無理だとわかった途端こんなに軽く薄く…ウッウ…

Chokudai Contest 005参加

お久しぶりです.
9月は研究したり風邪引いたり闇落ちしたり闇堕ちしたりものすごく忙しかったです…
それはそうとChokudaiContest005に参加しました.
NyanyanHonazoの3人でOpenEsysっていうチームを組んで参加したよ.
結果は49,985,585点の141位でした!!

前日

コンテスト開催が発表されたのでSlackで参加者募集してNyanyanをつかまえる.
Chokudai Contest 003を解いてマラソンの復習をする.

当日

Honazoをつかまえる.
Chokudai Contest003で焼きなましのお勉強してめちゃくちゃ点数を上げた.

コンテスト本番

開始直後

Honazoに入力部を, Nyanyanに貪欲解の生成を書いてもらい, ぼくは得点計算を書く.
得点計算書き終わったあたりで入出力チェッカーとテストケースの存在に気づく…
問題文は最後までしっかり読みましょう.
貪欲書き上がったところで提出して17172700点ゲットする

1回目の提出直後

Nyanyanが新しい方針で貪欲実装して49985585点を獲得する.
Nyanyanすごすぎる… †貪欲のプロ† 貪欲解のtourist!!

コンテスト終了まで

いよいよ局所探索のお仕事を始める.
とりあえず初期解のうち適当に場所を選んでそこの色を適当に変え , 変えた次の場所から再度貪欲をとき直していくって方針でやろうとしたけどバグらせたままなぜか初期解から点数を落としておわっちゃった…
かなしいね…

よかったこと

・めちゃくちゃいい点取れた!!すごい!!
・今回VSCodeのlive shareっていう拡張使ったんですけど一斉に編集できてめちゃくちゃ便利だった

反省

・局所探索がうまくいかなかった.
・入出力チェッカーを使いこなすことができなかった.
・ビジュアライザほしかった.

感想

問題見たときからちょっと局所探索難しそうだなぁとは思っていたけど実際難しかった…
貪欲書いてもらっている間に自分で局所探索の実験するとかもうちょっと時間を有効活用すればよかった…
時間があるときに今回の問題使って局所探索を書いてみます

Windows10でメモ帳が使えなくなったときの対処法

メモ帳が使えなくなったので使えるように直したよ

あらましと概要

txtファイルをメモ帳で開けなくなったので調べてみたらなぜかメモ帳がアンインストールされてたので再インストール&スタートメニューに登録するところまでやりました.
なんでアンインストールされたんだろうね…

環境

Windows10 バージョン2004

解決方法

  1. 設定>アプリと機能>オプション機能にアクセスし, インストールされている機能にメモ帳があるか確認する. ある場合は3. に進む.
  2. 機能の追加をクリックし, メモ帳と書いてあるところのチェックボックスをクリックしてインストールして再起動する(再起動はひょっとしたらいらないかも…).
  3. エクスプローラーでCドライブ>Windows>System32にアクセスし, notepad.exeを探し, ショートカットを作成する.
  4. ショートカットの名前をメモ帳に変更し, Cドライブ>ProgramData>Microsoft>Windows>スタート メニュー>プログラム>Windowsアクセサリに移動させる. ProgramDataが見つからない場合, エクスプローラーの表示タブをクリックし, 隠しファイルのチェックボックスにチェックを入れると見つかるはず.

ここまでやると下のようにメモ帳が追加されます.
f:id:jj1guj:20200802163636p:plain

最後に

他にもっといい解決方法あったら教えて下さい…

参考文献

www.atmarkit.co.jp

dekiru.net

IARU HF World Championship参加

7/11, 12に開催されたIARU HF World Championship(IARU HF)に参加したよ.

これは何?

アマチュア無線の国際組織IARU(International Amateur Radio Union)が主催するアマチュア無線のコンテストというか世界大会的ななにか.
他のメジャーなアマチュア無線のコンテストだとコンテスト時間が48時間でモード(電話とかモールスとか)が分けられているのに対しモードがごちゃまぜで時間が24時間と短いのが特徴(かな?)

ルール

ここ見て↓

2020 IARU HF Championship Contest Info

アマチュア無線あんまよくわかんない人のための用語解説

  • CW: モール信号のこと. ノイズに強いので電話よりも遠くに飛ぶしあんまり体力使わないから楽しい
  • 交換ナンバー: コンテスト時に交信が成立したことの証拠として送り合う番号. 今回のコンテストではITUゾーン番号(後述)を送る.
  • マルチプライヤー: 通称マルチ. 得点を出すときにマルチの数だけ掛け算されるのでたくさん取れば取るほどたくさん点が取れる. 今回は交信できたITUゾーンの数+HQ局の数
  • ITUゾーン: こんな感じになんか地球を90地域に分割したやつらしい(ぼくも初めて知った).
  • HQ局: なんか各国のアマチュア無線連盟が主体となってこのコンテストのためだけに運用する特別な無線局. 交信したHQ局の国の数だけマルチになる

参加記的ななにか

今回はシングルオペ(全部1人でやること) CW Low(出力を150W以下にして運用すること)で出場したよ.
18:00くらい #univradio終わって諸々セッティングとかする
19:00くらい 7MHz CWで場所取りを完了させる
21:00 コンテスト開始. 開始早々アメリカから大量に呼ばれてよろこぶ.
21:14 ロシアから呼ばれる. おそロシア…(言いたかっただけ)
21:16 インドネシアから呼ばれる. JavaJavaScriptはインドとインドネシアくらい違う(言いたかっただけ)
22:30 ニュージランドから呼ばれる.
22:48 ハワイから呼ばれる.
23:22 3.5MHz CWに移動. 雷なってたせいかノイズが酷くて早々に萎える.
23:31 フィリピンと交信成功
23:37 オーストラリアと交信成功
24:00~24:30 ABEMAでSAO見る. OPめっちゃ神!好き!久しぶりのシノンでうれしい!
24:30~25:40 3.5MHzと7MHzを行ったりきたりしながら着々と得点を重ねる.
25:40~翌5:00 ひたすら7MHzをやる. この時間帯ヨーロッパがどちゃくそとれるのでやるしかない.
5:00~6:30 松屋に朝ごはんを食べに行く

6:30~7:30 21MHzでアメリカが取れるかいう噂を聞いて21MHz に移動するもののあんまし聞こえなくて萎える.
7:30~12:00 どの周波数もあんま取れなくて泣きながら寝る. ひたすらに寝る.
12:00~15:00 がんばって21MHzをやる.
15:00~16:00 何やってたか記憶がまったくない…
16:00~20:30 7MHzに戻ってひたすらに呼びまくる
18:09 ヴァージン諸島に呼ばれてめっちゃ興奮する. なおぼくはヴァー(検閲済)
18:11 アルゼンチンに呼ばれてめっちゃ興奮する.
18:14 ベリーズに呼ばれて最初どこそれ?ってなったけどめっちゃ興奮する(カリブ海にある国らしい)

www.mofa.go.jp

18時くらいってそういう系のところから呼ばれるので楽しいね
20:30~21:00 そろそろ7MHzで呼ばれなくなったので3.5MHzに移動して得点を荒稼ぎして終わる.
21:03 暫定の得点見て思ったより取ってて大爆笑する

21:15 えらいのでコンテストのログを提出する. みなさん, ログを出すまでがコンテストですよ.
21:36 部内のwikiを書ききる
22:00 百香亭で打ち上げやろうとしたらやってなかったので麺 the Tokyoで1人さみしく打ち上げをやる. 冷やし中華めっちゃうまかった.

22:30 環境音がすべてモールス信号に聞こえる病気にかかる*1

26:55 ぐだぐだTwitterやって寝る.
翌14:50 起床. スマホを見て震える.

感想

1.9MHz

ノイズだらけで誰もいなくて泣いちゃった.

3.5MHz

1日目ノイズだらけで萎えたけどまあいい感じにできてよかった.

7MHz

カリブ海取れてよかったよまじで(アマチュア無線界隈では日本からだとアフリカとカリブ海とは交信するのが難しいことでよく知られている)

21MHz

あんまり飛ばなくて泣いちゃった.
おっきいあんてながほしいです.
だれかかってください.

まとめ

えー, アマチュア無線のコンテストは競プロのコンテスト以上に生活を崩壊させにかかるので注意が必要です()

*1:これCWやってる人あるあるだと思う

Fortranで機械学習をやりたい!!

お久しぶりです.
最近こんなことを思っています…
なんでこんなことを思ってるかって?
急に, 機械学習ってみんなPythonでやってるよなぁ…みんなと違うことしたいよなぁって思っちゃったからです.
思っちゃったものは仕方ないですよね()
ではさっそくいってみましょうか.
ソースコードはこちらにあるので合わせてお読みください.

github.com

目次

目標

なにをするにも目標を立てることが大事です.
なので目標を立てましょう.

方法

目標を立てたら次に作戦, もとい方法を考えましょう.

第1章

Pythonの入門ですね.
一時期AtCoderFortranのLanguage Owners 1位*4だったぼくには再びFortranに入門する必要もないでしょう()
ってことで飛ばします

第2章

パーセプトロンについてはFortranでやってるかたがいらっしゃるようですね.

qiita.com

ここまで難しいのはあれなので本に書いてある簡単な論理ゲートを実装してみましょう.

github.com

そういえばFortranの配列ってNumpyみたいに式かけば要素積取れるんですね.
初めて知りました.
っていうか誰ですか再びFortranに入門する必要もないとか言った人は.

第3章

ここではニュラルネットワークの説明と必要な機能の実装をしていますね.
1年ぶりくらいに読んだんですがめっちゃ勉強になりますね.
まあ研究テーマ機械学習じゃないんですが()*5
ここはまだまだ軽いのでひたすら実装していきます.

github.com

行列積はOpenMPでもりもり並列化かけました.
あと後半のMNISTはなんかFortranで実装するのつらそうだったのでとりあえず飛ばしました.
人生逃げることも大事だよ.
というかFortranの関数定義とかモジュールとかサブルーチンとか初めて触ったわ~
っていうか誰ですか(ry

第4章

ここめっちゃ学習のかなめの部分じゃないですか~
実装が途端に重くなりましたね.
とりあえず損失関数は有り余る才能()で書けて, 勾配計算もさっきなんとかなりました.

github.com

あと勾配降下法とか学習アルゴリズムの実装とかそこら辺ですね.動作確認してないですが今日あらかた完成させました. いうことでいよいよMNISTデータセットと戦います.
辛いですね. (2020年7月4日)

MNISTデータセットの読み込み

こちらは本編ではあまり触れられていませんでした(ただgithubに上がってるこのコード使ってねで終わってた)
Python機械学習用ライブラリではそこらへんもコマンド一つで勝手にやってくれるというぬるさっぷりですが()我らがFortranでは1から実装していきます.
まずはこちらのサイトからMNISTデータセットをダウンロードしてしまいましょう.

yann.lecun.com

このページを下の方にスクロールしていくとデータの格納形式が書いてありますね.
画像データについてはこんな感じらしいです.

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

ラベルデータについてはこんな感じらしいです.

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  10000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label

(いずれもMNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgesより抜粋)
とりあえずさっと書いて読んでみたのですがうまく行かないのでとりあえず今日のところは寝てまたやります.

今後の目標

まだ完成してないけど今後の目標を書いておきましょう.

最後に

い か が で し た か ? 笑
なんか進捗報告だけでほぼほぼ解説してないですがちゃんとできたら解説も書きます(ほんまか?)
あとすぐには対応できないかもですけどアドバイスとかあったらいただけると幸いです.

参考文献

斎藤 康毅 著 「ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装」(O'Reilly Japan)
Fortran 入門
Fortran Tip集
Fortran演習 (地球惑星物理学演習) — Fortran演習(地球惑星物理学演習)
MNIST:手書き数字の画像データセット:AI・機械学習のデータセット辞典 - @IT
MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

(追記)
2020/7/4 進捗を追加
2020/7/8 MNISTデータセットについて適当に解説を加えた&参考文献を追加

*1:未来屋書店アニメイトが隣同士だったから仕方ないよね

*2:未来屋書店技術書の揃えが悪すぎてさすがに悪すぎて笑ってしまった

*3:レイクタウンは球詠の聖地です. みなさん行きましょう

*4:Fortran(GNU Fortran 9.2.1)での記録

*5:進捗, やばいです

ABC169参加

久しぶりですね.
ところでABC169に参加しました!! コンテスト結果はこちら Fortranで3完, Pythonで2完でした.

A問題

Fortranで提出しました.
やるだけです.

B問題

Pythonで提出しました.
$A$をソートして下からかけていって$10 ^ {18}$を超えたら-1を出力して超えなかったら答えを出力しました.
最初ソートし忘れて1ペナ食らいました.

C問題

Pythonで提出しました.
普通に掛け算すると丸め込みでWAになってしまうので$B$を一旦整数にしてから計算し, 積を100で割った商を出力しました.
$B$を整数にするところでミスが多発して1ペナ食らいました.

D問題

Fortranで提出しました.
$N$を素因数分解してn(n+1)/2=(各素数に対する指数)の整数解を求めて足して出力しました.
整数解出すところでミスしたのとデバッグ用の出力を潰さなかったせいで2ペナ食らいました.

E問題

Fortranで提出しました.
無証明でサンプルから$B$の中央値$-A$の中央値$+1$したら行けそうだと感じたのでそれでやったら通りました.


久しぶりに5完しました!
やったね!!
サンプルエスパー無証明成功すると気持ちいいですね!

次回冷やさないようにがんばります

ABC165参加

ABC165に参加しました!! コンテスト結果はこちら Fortranで2完, Pythonで1完, C++で1完でした.

A問題

Fortranでだしました.
$A$から$B$までループ回して$K$の倍数があったら'OK', なかったら'NG'を出力しました.

B問題

Pythonでだしました.
預金額を$Y$円としたときに$\lfloor Y/100 \rfloor $をループを回して足していって$X$円を超えたところでループを止めました.

C問題

C++でだしました.
最初貪欲でやっていったらサンプル2でWAだったので発狂して先にD解いてました.
Dとき終わったあとに制約とか見返してたら先頭を固定すれば$A$の場合の数は高々$10 ^ 9$だとわかったので*1全探索で行くことにしました.
DFSで考えられる数列を全列挙し, あたえられた条件に当てはまるか全ての条件を試して得点を足していきました.

D問題

紙でsample1を解いていたときになんか周期性を感じたので(は?)頑張って数式化してみました.
$x=Bc+d$ ($0 \le d \le B-1$)とすると,
$\lfloor \frac{Ax}{B} \rfloor = \lfloor \frac{ABc+Ad}{B} \rfloor = Ac+ \lfloor \frac{Ad}{B} \rfloor$
$A \times \lfloor \frac{x}{B} \rfloor = Ac$
よって
$\lfloor \frac{Ax}{B} \rfloor - A \times \lfloor \frac{x}{B} \rfloor = \lfloor \frac{Ad}{B} \rfloor$
ここで$\lfloor \frac{Ad}{B} \rfloor$は単調増加なので, $N < B-1$なら$d$に$N$を代入して, $N \ge B-1$なら$d$に$B-1$を代入して計算し, 出力するようにしました.
今回開始が10分遅れだったのに終了時刻がいつもどおりだと勘違いしてC問題でやみくもに提出しまくって3ペナ生やしてしまいました…
やみくもに提出せず, ペナを生やしていなければパフォが30くらい上がっていたのでもったいなかったです…
ただ最近あまり精進できていなかったのに4完できたのは偉いと思います.
みんなほめてください(は?

*1:本当はそれよりもっと少なくて${} _ {20} \mathrm{C} _ {10}$らしいです