tobiuo1990の日記

プログラマになるブログ

CODEVS2019の体験版でJava製の自前AIを動かす。

f:id:tobiuo1990:20190412011353p:plain

適当にやるとNormalAIにも圧倒的に負けます。

【追記 19/04/14】

この記事の内容的に重要なことなので最初に追記します。

以下のようなアドバイスをいただきました。

 で、実際に自分でも体験版クライアントで

java -jar xxx.jar

と「赤チームコマンド」欄に入力して実行してみるとできました!

(もちろん赤じゃなくて青チームのほうでも同様です。)

この「赤チームコマンド」というのは文字通り「コマンド」を入力する欄だったということだったんですね。(言われてみれば、それはそうという感じですけど。。恥)

なので、以下に記載している実行ファイルに変換する作業は不要となります。

もし、こちらを参考にしていた方がいらっしゃったら申し訳ございません。

これでLinux環境での問題もなくなりました。よかった。

(でも、これだと言語不問ということは、運営側があらゆる言語のランタイムを用意してくれるということなのかな?めちゃくちゃマイナーな言語とかでも大丈夫なのかな?Javaだけでもすべてのバージョン用意するのかな?)

【追記ここまで】

 

CODE VSの予選が来週月曜(4/15)から始まります。

codevs.jp


そのCODEVSにはじめて参戦してみようと思っています。

 

 まずは動くものを作ってみようとしたのですが、少し詰まったところがあったので自分の備忘録として(+おそらくいない同様な状態の人向けに)やったことを書いておきます。


環境OS:Windows10

言語:Java8


①体験版のクライアントアプリを入手する

公式サイトから入手できます。
ただ、このクライアントアプリが微妙らしく以下のツイートのようにjarファイルを直接実行するほうが安定しそうです。

 
②とりあえずルールに沿った入出力ができるようにする。

私の場合はJava8で実装しています。ほんとに入力を受け取って、ランダムに出力するだけの中身のないAIです。(これではAIと呼ばない気もする)

 

③クライアントで自分で作ったAIを実行する。

はい、ここで詰まりました。

疑問1:クライアントにどうやって自分のAIを指定するの?

クライアントにはAIを指定する場所が「赤チームコマンド」「青チームコマンド」とあるのですが、自分のファイルを指定するための「参照」ボタンみたいなのがない!となって焦りました。公式サイトをよくよく見ていると、参加方法ページの"03 CODING"のところの画像にローカルのファイルを指定している様子がありました。

コマンド欄にファイルの絶対パスを指定すればよいだけです。(気づいてみればそりゃそうだという感じではありますが。)


疑問2:作ったAIってどの形式で動作させるの?

最初は競プロ(AtCoder)のイメージで、ソースコードのファイルを一つだけ提出するもんだと勝手に思ってました。ただサイトには『※使用言語の制限はありません。』と記載があります。最初これを読んだときは「すべての言語の実行環境をそろえているなんてすごいな!」と感心したのですが、冷静になってみればそんなことありえません。でまたさっきの画像を見てみると.exeを指定しているのがわかります。なので、実行ファイルの形にしてあげれば良さそうです。今までJavaを.exeにしたことなかったので少し調べてみると以下の手順でできました。

1.AIを実装したJavaソースコードからjarを作成する。

2.exewrapでjarをexeに変換(ラップ)する

 

これで○○.exeを作成して、「赤チームコマンド」欄にそのexeのファイルを指定して、実行を押すとうまくいきました。


※jarを作成する際に、自分はeclipseのエクスポートで作成したのですが、「生成されるJARに必須ライブラリーをパッケージ」を選択すると以下のようなエラーメッセージが出てうまくいきませんでした。

Missing attributes for JarRsrcLoader in Manifest (Rsrc-Main-Class, Rsrc-Class-Path)java.lang.Error: factory already defined at java.net.URL.setURLStreamHandlerFactory(URL.java:1112) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:45)

「生成されるJARに必須ライブラリーを抽出」を選択するとうまくいきました。パッケージするかどうかで少し構成が変わったり、最初に実行されるクラスが変わったりするのが原因です。

(参考)

[Java]Eclipseで実行可能JARファイルでエクスポートした時のディレクトリ構成の違い - daybreaksnow's diary

最初に実行するクラスはMANIFEST.MFを無理やり書き換えればどうにかなりそうなので、ここら辺はもう少し試してみます。(パッケージできるようになれば、ライブラリ使用して実装できるので良さそう。)

※あと、最終的にexeの形にすることで体験版クライアントで動かせるようになりましたが、Windowsでしか動かないらしいのでLinuxで動かせるようにしないといけません。(大問題)