Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Icfp2009

1,860 views

Published on

Published in: Technology
  • Be the first to comment

Icfp2009

  1. 1. ICFPProgramming Contest 2009参加記<br />田中英行<br />
  2. 2. ICFP Programming Contest とは<br />ICFP(関数型プログラミング言語に関する学会)が主催するプログラミングコンテスト<br />チーム人数、使うマシン、使うプログラミング言語、なんでもありの72時間耐久レース<br />
  3. 3. 今年の課題<br />物理シミュレータと達成すべき状態が与えられるので、衛星を操ってそれを達成せよ<br />課題は4つ<br />4つ目の課題は24時間目以降に発表<br />物理シミュレータは独自のマシン語によって記述されている<br />そのマシンのIOのトレースをサブミットする<br />
  4. 4. 解く流れ<br />VMを実装する<br />VMとやり取りして目標を達成するためのプログラムを作る<br />サブミットする<br />改善する<br />繰り返し<br />
  5. 5. 課題1Hohmann<br />地球の周りを円運動する衛星がある。その衛星をある別の高度で円運動するようにせよ。加速なしで誤差1000m以内で900秒維持せよ。<br />衛星を動かすには燃料がいる<br />少ないほどスコアがいい(と書いてあるが、実は逆)<br />
  6. 6. 課題1解法<br />ホーマン遷移<br />http://en.wikipedia.org/wiki/Hohmann_transfer_orbit<br />エネルギー最小<br />実装するだけ<br />微調整が必要?<br />
  7. 7. 課題2Meet and Greet<br />円運動をする衛星を別の円運動をする衛星にぴったりくっつけろ。静止状態で誤差1000m、900秒間維持せよ。<br />燃料消費、時間消費が少ない方がスコアが高い<br />
  8. 8. 課題2解法<br />(回転方向が同じなら)必要なだけ待ってから、ホーマン遷移すればよい。<br />ホーマン遷移にかかる時間をシミュレーションで予測(t)<br />対象の角加速度を計算(ω)<br />自機と対象の角度が π – ωtになったら出発<br />回転方向が違う場合<br />ないことを祈る<br />
  9. 9. 課題2解法:図<br />ωt<br />
  10. 10. 課題3Eccentric Meet and Greet<br />楕円軌道を描く衛星を別の楕円軌道を描く衛星にくっつけろ。静止状態で1000m以内、900秒維持せよ。<br />
  11. 11. 課題3解法<br />楕円軌道->円軌道に遷移<br />円軌道->目標の楕円軌道に重なる円軌道に”タイミングを計って”ホーマン遷移<br />楕円軌道->目標の楕円軌道との交点で、目標の楕円軌道に遷移<br />
  12. 12. 課題3解法:図<br />青⇒赤⇒緑⇒黄 の順に遷移<br />
  13. 13. 解法3紛糾<br />…て、こんなもんできるか!<br />宇宙物理の専門家じゃあるまいに<br />難しいところ<br />主にタイミングを合わせるところ<br />残り時間も少なかったので、別解を考えることにした<br />
  14. 14. 課題3:別解<br />ひたすら追いかける<br />以上<br />なんとこれで解けた<br />やけくそになったのが功を奏した<br />
  15. 15. 解法3:別解<br />ただやみくもに追ってもぴったりくっつけられるわけではない<br />位置とベクトルの両方をぴったり合わせる必要がある<br />次のような式が良いようだった<br />Δv= (unit (tx-x) * unit (tv-v)) * γ<br />x(tx), v(tv) = 自機の(目標の)座標と速度<br />γ=距離に応じて変える定数<br />
  16. 16. Intermission<br />LightningDivision終了<br />課題3は間一髪のところだった<br />課題4が発表される<br />月が追加されてnushioさん涙目<br />無理ゲー臭がそこはかとなく漂う中、いったん睡眠をとることにした。<br />
  17. 17. 課題4Operation Clear Skies<br />地球と、月と、衛星11個と、燃料補給所がある。地球と月にぶつからないように、衛星11個に接近せよ。接近は1000m以内、1フレーム近付けば十分。燃料補給所に接近すると、燃料が満タンまで補給される。しかし、燃料補給所にある燃料にも限りがある。スコアは、なるべく速く多く、燃料消費少なく衛星を回収して回れば高くなる。<br />
  18. 18. 課題4方針<br />まず、適当に考えたもの<br />一番近い衛星を回収<br />燃料補給所に帰還<br />繰り返し<br />起動の遷移に課題3のものを使う<br />
  19. 19. 問題点<br />だが、うまくいかない<br />燃料が足りない<br />自機に積める燃料は10000で、うまくやらないと帰ってくることすらままならない<br />地球にぶつかる<br />適当に進んでいるだけでは、地球越しの目標に向かう時にぶつかる<br />
  20. 20. 課題3の改良<br />ほぼ一発で合わせられるようにする<br />加速する方向を進行方向に限定<br />三分探索で目標に最接近する加速量を探索<br />うまくいきそうなのがあれば出発<br />燃費がかなり良くなる<br />だが、問題点<br />シミュレーションが正確ではなかったので、近づいてから補正する必要があった<br />
  21. 21. 課題4に組み込み<br />これで大体5,6個捕まえられるようになった<br />だが、捕まえてから帰ってこれなくなってくる<br />なんでかわからないまま定数をいじって時間だけが過ぎてゆく…<br />残すところ数時間となったとき、ついに思いつく<br />
  22. 22. 高度調節<br />この方法での遷移は細長い楕円を経由する<br />これで地球付近の補給所にあてるのは、地球から月にホールインワンするようなもの。これではあてられない。<br />なら、高度を下げてやればいいだけなのではないか?<br />
  23. 23. 高度調節<br />高度調節自体は、ようするにホーマン遷移っぽいことをすればよい<br />地球から遠ければそれをするとする<br />
  24. 24. 高度調整組み込み<br />これで、燃料のある限り回収できるようになった<br />4001-4003で10個回収<br />
  25. 25. 逆走問題<br />4004番はほかの衛星が逆走している<br />これはつかまりにくい<br />なら、最初に自機をひっくり返すか<br />大体うまくいく<br />最初の宙返りに10000ぐらい燃料を使ってしまうので、9個しか集められなかったが<br />
  26. 26. チューニング<br />明らかに、衛星にくっつくために、軌道まで合わせるのは燃料の無駄<br />位置だけ微調整して何とかならないか<br />時間が足りず、残念ながら何ともならなかった<br />シミュレーション精度さえよければなあ・・・<br />
  27. 27. 月へ<br />月の近くに衛星がある(こともある)ようなので、月に行きたいが、時間も燃料もだめぽ…<br />
  28. 28. 終わり<br />定数をうまい具合にチューニングして、スコアをせこく伸ばして、終了<br />最終的には、3890ぐらいだった<br />暫定スコアボードで<br />トップが5171.5322 (pepsiso)<br />10位が3377.7318 <br />
  29. 29. 結果<br />http://icfpcontest.org/scoreboard.php<br />スコア的にはトップ10には入れているかどうかも微妙なライン<br />トップにはぼろ負け<br />無念…<br />
  30. 30. 動画<br />4001<br />http://www.youtube.com/watch?v=aTvd99IPRgQ<br />4002<br />http://www.youtube.com/watch?v=c19dSxB9Yco<br />4003<br />http://www.youtube.com/watch?v=IBO0vnGNRMw<br />4004<br />http://www.youtube.com/watch?v=1M255RhBbfM<br />
  31. 31. 敗因分析:戦術面<br />よくなかった点<br />シミュレーションは実機でやるべきだった<br />すごい遅そうで倦厭していたが、燃料消費を考えると…<br />そうでなければ、リバースエンジニアリングしてとか…<br />は面倒ですけど…<br />毎回補給基地に帰るという方針<br />これは上ができてれば自然と改善されていたはずではあるが<br />
  32. 32. 敗因分析:戦略面<br />人的リソースな面<br />PFIからでるなら、十分に確保できると思ったらそうでもなかった<br />期間中それだけ考えてくれる人が4人ぐらいは欲しい…<br />作業分担の面<br />問題そのものに取り組んでくれる人が少なかった<br />(nushioさんの軌道修正をしてあげるべきだったか)<br />
  33. 33. 感想<br />問題は相変わらずよくできてて、楽しかった<br />無理ゲーが楽勝になる感覚が3回ぐらい味わえた<br />主催者は相変わらず期間中にデバッグしてた<br />これはどうしようもないのか<br />負けたのは悔しい<br />また来年<br />

×