高専プロコン2017 備忘録

高専プロコン2017

序文

競技部門7位、特別賞いただきました。

 このたび、時間にやっと余裕が出来たので2ヶ月遅れとはなりますが、感想を書こうと思い立ち、こうしています。

 今年で私は高専プロコン3年目となります。
 思えば入学当初からいろいろありました。
 1年生では、高専プロコン開発メンバーに入れていただいて、何したらいいのかさっぱりなので「うーん、先輩お願いしマース。」ってしてたら、いざ1ヶ月前になったら先輩がドタキャンしたり。しかも、新幹線取ってなかったり。
 思えば1年生の夏前ごろでしたね、K先輩と出会ったのもあの時はここまで長い付き合いになるとは思ってもいませんでした。(実は当初同学年だと思ってたり、)
 1年生の高専プロコンは、前日夜にバグが見つかってなきながらデバッグしてました。
 そんなこんながありながらも、2年生でもまたやろうとおもったのは奇跡でしたね。
 それもこれも、K先輩がいたとか、悔しかったとか、いろいろあったせいでしたね。

 2年生では、夏休み朝から晩まで一緒に開発したり、K先輩と一緒にPCK本選行ったり、あの人のコミュ力爆発にはいつもおどろかされました。
 けど、結局あまりいい終わり方が出来なかったのはあの人力パズコンが悪かったんでしょう。
 (ちなみにこの年私はJOI無事落ち)

 さて、前前置きも長くなりました。

3年生

 今年は、去年の計画不足という反省を踏まえ

f:id:nasatame:20171203003836p:plain

 なんて物をつくったりしましたが、後輩にわざわざ、作業に煩雑さを増やすんじゃないとかおこられたりしちゃいました。
 ほかにもメンバーとぶつかったりもしました。来年は後輩に多めに仕事(マネージャー)をふってみようかななんてね。

 5月、設計

 6月、設計、基本の実装。回転関数など、後テストだったのであまり活動できませんでした。

 7月、個人的にコーディング、ビームサーチ、チョクダイサーチの勉強をしてました。またもやテスト。

 8月、夏休み(2ヶ月間)です。これを生かして全力でコーディングしました。1日200行ぐらい書いてましたね。それでも学校に集まらなくなって、連絡が疎になったせいかあまり、すすみませんでした。今年もK先輩と1週間ほど二人で6時間コーディング。クーラーがあったおかげで干からびずに済みました。来年も欲しいです。K先輩はその後インターン

 9月前半、PCK予選で2週間ほど開発をお休みしました。結構でかかったですね。ただでさえ予定が遅れに遅れまくってたので。
PCK終わった次の日からまたK先輩とコーディング、でも課題で忙しそう。なんとか一通りの機能は実装し終わって、高速化、省メモリ化に移れました。(8月中には移ってるはずだったのに)。

 9月後半、学校も始まりまして、コーディングもあまり出来なくなりました。しかし、時間は待ってくれないわけで時間を見つけては書いてました。その結果、なんとか高速化、省メモリ化も一段落しました。(バグはある)
 ソースリスト提出。まじめにやりましょう。入賞するのにとても重要です。

 10月前半、バグは再現性、頻度ともに低かったので無視して、評価関数と列挙関数を作りまくって後は練習してました。

 本選前日、急に配置情報を使えたほうがいい気分になってきて、配置情報に関する機能を新幹線の中1日で実装。(いままでは使っても減点でまけるだろうから、使わない方針でした。)ハードコーディングでした。

 深夜先輩の評価関数の調整中に神が舞い降りてきました。「列挙関数良いとこどりをしたらもっとよくなるんじゃない」と、そこで良いとこどりする関数を製作しましたところ、大成功。実質本番はこれだけでいけました。

 本選1日目、運よくアンチパターンである灯台の問題を避けることが出来たので、決勝トーナメントに進出することができました。K先輩、K君パズルが上手い。

 本選2日目、準決勝またもや当たりがよく30秒で解き切り、並べるのに3分かかりました。思えばここら辺から予兆はあったのかもしれません。

 勝戦。ソルバーの調子がよくまたもや30秒回答、並べ始めます、、、あれ、1,2,3,4,5みんな完成させていくぞ、、、完成には6分ほどを要しました。
 人力ゲーとはいいません。人力部分の工夫が足りませんでした。
 ときには”プログラム以外の部分も重要”、覚えておかなければいけないことです。

 でもなんとか、審査員特別賞を頂きました。三年間の集大成なのかななんてね。ちょっとなきそうでした。(そして先生、なぜ写真撮影のタイミングでタバコを吸いに行ってますか。)
 
 先生にステーキを振舞っていただきました。おいしかったです。K先輩よく食べるなあ。

 ちなみに初日、ふにゃさんとその後輩と一緒にご飯食べたり、最終日も深夜一緒にお話したりいろいろありました。たのしかったです。

 名刺、滅茶苦茶交換しました。けど、企業名刺ではないのでコンテストは不参加。

 私は楽しんでました。一緒にいった二人も楽しんでくれていたらそれを超えることはありません。

本題に入ります。ソルバー公開します。

 
 今回作ったソルバー公開することにしました。
 2ヶ月もありましたが、やっつけで作った当時のままなのでまあそれっぽい雰囲気があっていい。ということにして置いてください。(一応コメントは付け足しました。)
 正直参考になるかは怪しいところですが、この文章とあわせて何かを受け取ってくれたらうれしいです。

開始時
f:id:nasatame:20171203010554p:plain

終了時
f:id:nasatame:20171203010546p:plain

 基本的には、人間の目で探索状況をGUIにより把握しながら、探索手法、列挙関数、評価関数を付け替えて探索をすすめて解に近づいていくというのが基本方針でした。

 参考までにそれぞれの主な手法
 探索手法は、chokudaiサーチ、ビームサーチ
 列挙関数は、辺、角度
 評価関数は、ピースの接した辺の長さ、割合
 
動画
決勝1年生勧誘用.mp4 - Google ドライブ

 正直、問題が簡単すぎてGUI、練習をつんだ人間を生かせませんでした。

ソースコードへのリンク
https://bitbucket.org/nasatame/procon2017ofnatori

 ダウンロードのほうから一括でダウンロードできます。もし質問があればぜひtwitterのnasatameのほうまでどうぞなるべく対応させていただきます。

反省

探索中にGUIとまるの嫌だったからスレッドごとに分けたんですが、よく考えずに分けたせいで結合がいたるところに出来たりして気持ち悪くなってしまいました。

(特にポインタ周りがアンスレッドセーフなのにスレッドにぶち込んでる。)

実はバグがあります。バグが発生するのは100回に1回ぐらいで再現性も取れなかったので無視して大会に突っ込んだんですが。多分メモリ周りがやばいんだと思ってます。正直心当たりがありすぎてどうしようという感じです。

命名規則が乱れまくりました。日によって変わってた、ぽいのが怖いです。

いろいろと一人で独断専行しすぎました。結局6割一人で書いてます。やっぱりマネージャー業はむいてません。

反省から来年へ

  1. コミュニケーションを取ろう。#最重要#
  2. 設計をちゃんとやろう。(なるべくクラス図を描く勢いで)
  3. 予定、予想なんか立つか!!というのも分かるけど一応予定ここまでこの日までというのはきちんと決めて守る努力をする。
  4. GUIとSolverを一緒に製作するときは、並列化前提で設計する。

以下できれば

  1. みんなでコーディング規約を決めよう。守ろう。
  2. お互いにコードレビューしよう。
  3. ツールとしてのGitを使おう。(オンラインストレージ化しないようにしよう)

さて、この入賞を良い機会として、講習会+アルゴリズム講習会でうちの部活の今の血脈が脈々と受け継がれていってくれればうれしいです。
(しかし、歴史はそう上手くいかないと語っています。だからこそ全力で努力をしなければ。)

一、仙台高専ソフ研部員として、この駄文を全ての後輩にささげます。

(感想くれたらないて喜びます。質問があったら聞いてね。twitter,nasatame)


来年もK先輩と一緒に高専プロコンに出れたらいいなあ。