技ったぜ。 投稿者:IT石土方 (10月12日(祝)09時46分19秒)
昨日の10月11日にいつもの専攻科生(2年生)と先日メールくれた計算機好きの本科生のにいちゃん(4年生)とわし(2年生)の3人で県北にあるホクト文化ホールの舞台の上で盛りあがったぜ。
今日は明日が敗者復活戦なんでコンビニで栄養剤とカップラーメンを買ってから滅多に釧路高専が進めない決勝を目指すんで、ホテルでしこたま栄養剤を飲んでから開発しはじめたんや。
3人で舐めるような視線を画面に這わせながらスリッパを脱いで靴下だけになりLANケーブルを3本入れあった。 しばらくしたら、DHCPでアドレスを取得して来るし、パケットが出口を求めてカーネルの中でぐるぐるしている。
プログラムに初期設定リストをけつからなめさせながら、画面を舐めるように見ていたら、先にサーバが問題をドバーっと出して来た。 それと同時にプログラムも回答を出したんや。もうマップ中、石まみれや、3台で出した回答をrescueで救いながら色をぬりあったり、石まみれのマップを眺めあって評価関数を改善したりした。ああ〜たまらねえぜ。
しばらく技術まくってから又評価関数を改善しあうともう気が狂う程気持ちええんじゃ。 石情報のリストのけつに新たな情報を突うずるっ込んでやるとメモリが0と1だけじゃ何も伝えらんないよね…。 プログラムも運営サーバに回答を突っ込んでコネクションをつかって居る。
プログラムを手書きしながら、思い切り最適化したんや。 それからも、もうめちゃくちゃにマップと石情報のリスト舐めあい、石を置きあい、二回も糞回答を出した。次はまともな回答を出したいぜ。
やはりマップが石まみれになると最高やで。こんな、IT石土方と石あそびしないか。ああ〜早く石まみれになろうぜ。 北海の道東であえる奴なら最高や。石まみれになりたいやつ、至急、メールくれや。 IT土方姿のまま回答して、石だらけでやろうや。
絶望的に汚い。
- 3台のPCを使うことを前提
- 1台のPCを「サーバ」とする
- Hikariと名付けた
- これが運営サーバと通信
- なお、模擬運営サーバも「Akane」として作っていた
- はにかむ~
- 3台のうち、1台以上に「クライアント」を設置
- ソルバ
- 「クライアント」は、「サーバ(Hikari)」と通信
- PCの状況(CPU使用率など)に応じて、1台に複数のクライアントを設置
- クライアント・サーバ間の、問題・回答送受信は、独自フォーマットにて行う
- 余計な改行を省く
- (C/C++を用いる)クライアントでパースがしやすいように
- 通信量削減
- マップ情報と石情報は、改行以外は公式フォーマットのまま、ASCII文字で'0'と'1'を送信するだけなので無駄も多かった
- その中でも、石情報は、最大16文字でいけるのに、きっちり64文字分送ってしまい、無駄が多かった
- ほとんどのクライアントで、「石を、石に含まれているあるブロックを基準として、そこからの相対座標で表現」という処理を行っていた。
- このぐらいの処理は、Hikari側でやってしまえばよかったかも知れない
- クライアント・サーバ間は、競技開始前に接続しておく
- 3-Way Handshakeの確立をうんぬん
- 競技開始と同時に人間が繋ぐと遅い
- クライアントは、サーバから応答があるまでブロック
- サーバは、競技開始と同時にクライアントに問題を送信
- 回答が来て、それがベストだったら運営サーバに報告
- Hikariを立ち上げる
- 試合に関する情報(運営サーバのアドレス、トークン、問題番号など)を設定
- Hikariが動作しているPCのIPアドレスを確認
- 運営サーバと接続確認
- 運営サーバと「コネ作り(
Connection: Keep-Alive
)」を行う - Wireshark、NetworkMinerを起動しておく
- クライアントをHikariに接続する
- 試合開始まで待つ
- 試合が開始されたら、Hikariの「試合開始」ボタンを押す
- Hikariからクライアントに向けて、問題が一斉送信(ユニキャストだけど)される
- マルチキャストを使えば良かったかな
- 時間のNASAから本来ルータを使うところをスイッチで代用したから、無理だったけど
- クライアントからHikariに、回答がやってくる
- Hikariが認識している中で、最良解であれば、運営サーバに報告
- ただし、「運営サーバに対し、短時間に解を送信してしまった」のは避ける
- 2000ms待機して、その間に解が送られてこなかったら…とする
- 回答、ためて待つぜ。
- 最良解ではない場合や、(Hikariによる)有効回答でないと判断された場合は、放置する
- 試合終了まで継続
- 試合が終わったら、クライアントとHikariを終了
- 繋ぎっぱなしを想定していたが、不安なのでこうした
- 次の試合に備えるため、最初から繰り返す
このリポジトリのディレクトリ構成について示す。
.
├── OfficialServer/
│ ├── Akane/
│ │ └── (模擬公式サーバ)
│ ├── Board/
│ │ └── (敷地情報を扱うユーザコントロール AkaneとHikariで利用)
│ └── Problem/
│ └── (問題情報を扱うクラス Akaneで利用)
├── KpcServer/
│ ├── Hikari/
│ │ └── (3台のPCを束ねるアレ)
│ └── NewProblem/
│ └── (OfficialServer/Problemの亜種 Hikariで利用)
├── Client/
│ ├── DAMEDESU/
│ │ └── (動かないソルバたち)
│ ├── KusoZako/
│ │ └── (動くけどクソザコなソルバたち。zkならぬkz(屑))
│ ├── God/
│ │ └── (神、いわゆるゴッド)
│ ├── TUYOI\_Solver/
│ │ └── (本戦で活躍した強いソルバたち)
│ └── Sample/
│ └── (ソルバのサンプル)
└── Problem/
└── (擬似問題)
- 頑張ってください
- Hikariと適当なクライアントさえビルドすれば大丈夫です
- Hikariの
-> http://172.16....
というところに問題ファイルをドラッグ&ドロップすれば、Hikariの実行ファイルと同じディレクトリに回答が出てきます