こんにちは、エンジニアの鳥井です。
最近家ではスプラトゥーン2しかやってないような気がします。
さて、8月4日の夜から3日間あったICFP Programing Contestに、RCOプロコン部のエンジニア10名ほどでホテルに泊まり込んで参加しました!
ICFP Programing Contest(通称ICFPC)は関数型言語の国際学会ICFPが毎年夏頃に開催しているプログラミングコンテストです。
72時間の制限時間の中で、出題された問題について取り組み、ほかの参加者と順位を競うという形式のコンテストです。 問題は年によって様々で、去年は与えられた折り紙を展開して元に戻す、というような問題が出題されました。
アルゴリズムの知識やセンスが必要なのはもちろんですが、インフラ、ヴィジュアライザ、さまざまな自動化ツールなどいろいろなスキルが必要となってくるのがICFPCの面白いところで、複数人でチームを組んで参加することも多いようです。
弊社では途中参加離脱なども含めて11名で、合宿形式で3日間がっつりコンテストに参加しました。
今年のコンテストページはこちらになります。
今年の問題を簡単に説明すると、「辺取りゲーム:与えられたグラフの辺を他のチームと取り合って、いくつかあるMineノードからできるだけ長い辺を引いてスコアを増やせ!」というものでした。
これだけでもなかなか難しい問題なのですが、コンテストの途中で3回ほど仕様追加が発生し、それに対応する必要があったのでさらに大変でした。 またグラフの大きさや対戦人数の下限上限などが明記されておらず、AI開発でどのようにアプローチしていくかが難しかったです。
チームの中では主に、AI開発担当、対戦システムなどのインフラ担当、プロトコル周りを担うブリッジとAIを出し分けるジャンクション担当、ヴィジュアライザ担当、提出用スクリプト担当などに分かれて作業していきました。
自分は一人でヴィジュアライザ担当することになり、公式のヴィジュアライザを改造して様々な機能を追加していきました。 普段あまりフロント周りのコードを書かないのでなかなか苦労しましたが、ほぼヴィジュアライザのみに専念できたので、3日間それぞれのタイミングで必要な機能を実装でき、なんとか役割を果たせたのでよかったです。
インフラチームは主に、作成されたAIの強さを判定するための自動対戦システムの整備を担ってくれていました。 最終的にはEC2を100台以上稼働させるなど、かなりリッチなインフラ環境を作ってくれていたので頼もしい限りでした。
AIは4名がそれぞれ最強のAIを目指して開発を続けていきました。 最初に述べたように問題の制約が明記されていなかったので、それぞれが制約に合わせていくつかのAIを作成していたようです。
AI開発担当は全員競技プログラミング経験者だったので、ブリッジプログラムがAIに対してプロコン形式でデータ出力・受取を担う形式にしていましたが、この設計のおかげでAI開発者はアルゴリズム部分に集中できたようです。 最終的には対戦結果をもとに、グラフの大きさ、対戦人数などによってAIを出し分けるジャンクションプログラムを担当の人が実装していました。
このあたりはチームの成果をひとまとめにするところで、見ていてとてもワクワクする光景でした。
コンテスト期間が72時間だったので、各人が進捗具合などに合わせて適当なタイミングで睡眠を取っていました。 自分はこの3日間で完全に生活習慣が崩壊したので睡眠調整の難しさを感じました。
順位決めについては、
という3つのラウンドからなっており、ラウンド1には120チームほどがエントリーしたようです。(本番動作はぶっつけ本番なので、正しく動作しなかったエントリーがこれ以外に30ほどあったようです。)
弊チームはラウンド1は突破しましたが、残念ながらラウンド2でプログラムがうまく動作せずに足切りにあってしまいました。 AIの戦略の問題ではなく、どこかにちょっとしたプログラムミスがあるためだと思いますが、提出前に何度も確認したときは問題なく動いていたので悲しい限りです…。
最終順位は9月3日からオックスフォードで開催されるICFP2017で発表されるそうです。 去年優勝のUnagiチームの活躍に期待です!
弊チームの書いたコードはこちらになります。
3日間ひたすら開発をする合宿は初めてでしたが、チームで同じ問題に3日間全力で取り組むのは非常に楽しく、他の人の仕事ぶりなども間近で見れて大変勉強になりました。 このような合宿に業務として参加させてくれて本当にありがたい限りです。
個人的には来年もぜひ参加したいと思っています。 今年はフロント一本で3日間を過ごしましたが、来年は他の部分も担当できるようにスキルアップしてコンテストに臨みたいです。
あと、宿泊した都内のホテルは快適でしたが、温泉地で温泉に入って気分転換するとさらに捗るかもと思ったので、温泉宿などに泊まり込むのも検討したいですね。
RCO アドテク部では、コンテストや開発が好きなエンジニアはもちろん、チームでわいわいプロダクトを作るのが好きなエンジニアも募集しています。