ICFP2009-いかにして我々は戦ったか

796 views

Published on

ICFP残念な戦いの記録

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
796
On SlideShare
0
From Embeds
0
Number of Embeds
49
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

ICFP2009-いかにして我々は戦ったか

  1. 1. ICFP 2009 いかにして我々は戦ったのか? 2009/07/02  変ゼミ inajob inajob の所属している研究室 で毎週木曜 16:30 から行われ るゼミのような何か
  2. 2. スケジュール ● 6/27( 土 ) 3:00:16 から決戦開始 ● ● (実際は朝から) ● 未明まで作業( for lightning round) ● 6/28( 日 ) ● 結局間に合わず orz ● 昼まで寝る ● 引き続き作業 ● ゼミに備えて帰宅 ● 6/29( 月 ) ● 軌道を考えながらゼミに参加 ● ラストスパートと叫びながら未明まで作業 ● 6/30( 火 ) ● 演習 TA
  3. 3. メンバー ● U さん ● さすが、アルゴリズム、きれいなコード ● T さん ● ユーティリティ作成、デバッグ、投稿 ● inajob ● アルゴリズム、がんばってるコード ● S 氏 ● 数学・物理 リソース不足が否めなかった (常時稼動は僕と U さん)
  4. 4. 問題の概要 ● 衛星を飛ばしましょう ● 指定された軌道に乗る ● ある衛星とドッキングする ● etc... シミュレータ 今の座標など 衛星制御 binary コード VM 制御 (Δv) 我々の作る部分
  5. 5. VM ● 問題の前半 ● 内容はそれほど複雑ではないが ● よくわからないアーキテクチャ ● メモリは 2 つ (ハーバードアーキテクチャ) ● 2^14 のアドレス instruction data ● 命令メモリは 32 ビット ● データメモリは 64 ビット pc ● レジスタ ● プログラムカウンタ ● ステータスレジスタ
  6. 6. 命令 ● destination が謎の命令
  7. 7. バイナリの形式 ● 命令とデータメモリの初期値が連続して書いて ある ● なぜか順序がおかしい data instruction instruction data data instruction instruction data
  8. 8. さぁ衛星を飛ばそう ● 問1 ● ある円軌道から別の円軌道にうつれ ● 使用燃料が少ないほうが点が高い ● 時間が短いほど点が高い
  9. 9. ヒントと利用した解放 ● ホーマンさんの考えたエ ネルギー消費最小の移動 方法 ● Δv を求めたい ● 力学的エネルギー保存則 ● 面積速度一定の法則 ● 連立方程式
  10. 10. 出力形式 ● 航行データを指定された形式で提出する ● U さんが一晩で作ってくれました ● はやい
  11. 11. トラブル ● 僕の書いたコードと U さんの書いたコード ● 僕のほうが性能が悪い ● 燃料を多く使う、時間も長く使う ● Vm にバグがあるのか?! ● すでに VM のコードを読めるようになってい る U さん! ● FAQ を発見! Q: The fuel scoring in the first binary appears backwards. Is it? Q: It seems the scoring scheme is wrong. Our program gets better score when we accomplish the task with LESSER fuel remained. A: Yes. It is. Burn as much fuel as possible on the first example, b ut not too much! Doing two transfers is one possible solution here. The published fuel formula is the correct direction for problem 2 and 3 A: The given binaries are the specifications, and the formulas may be approximations. Use the binaries!
  12. 12. つぎっ! ● 問2 ● ある円軌道から別の円軌道の衛星とドッキング しろ ● ドッキング ● 900 秒間 1000km 内に噴射をせずに居ること ● 使用燃料が少ないほうが点が高い ● 時間が短いほど点が高い
  13. 13. 利用した解放 ● 機が熟すまで待つ作戦 ● 問 1 の方法を流用 ● ただ移るだけでなく相手にあわせる必要が ある ● A→C == B→C  のとき軌道を切り替えれば OK ● A→C の時間が出せないっ!(楕円の公転周期 ) C S 氏の公式(ケプラーの第三法則) 惑星の公転周期の 2 乗は、軌道の半長径 の 3 乗に比例する。 A B
  14. 14. ごり押し ● S 氏の公式に基づきタイミングを合わせて軌道 変更 ● かなり近づくことができた ● 1km は近づけない and 姿勢を維持できない ● 小刻みに噴射を繰り返し離れないようにする ( U さんの方法) ● 閾値より小さいずれになるまで繰り返す
  15. 15. つ、次っ! ● さっきの問題の楕円バージョン ● そろそろ時間もやばくなってきた
  16. 16. アイデア (1/2) ● とりあえず自分は円軌道に戻す(ややこしいの で)
  17. 17. アイデア (2/2) ● target の楕円の外接する円に移動する C T B ● タイミングを見計らう ● A→B == C→D  は自明 ● B→D == T→C を探る D A
  18. 18. 計算式が思いつきません ● シミュレーションしましょう( U さん) ● T から C までをシミュレーションする ● 敵の位置、速度を利用する ● うまくいきそうなら A-B 楕円軌道に入る C T B D A
  19. 19. TimeUp ● と、ここまで作ったところで火曜の 3 時 ● バグは取れず ● 問題はまだまだ続いています 気になる人は資 料を読もう!
  20. 20. U さんのフレームワーク ● KameTL っぽい actuate(ACT_SCENARIO, (double) scenario); yield(0); sense_state(&prev, sense); rs = norm2(prev.sx, prev.sy); rt = norm2(prev.tx, prev.ty); alpha = (rs + rt) / (2 * rt); alpha = sqrt(alpha * alpha * alpha); fprintf(stderr, "rs: %lf rt: %lf alpha: %lfn", rs, rt, alpha); yield(0); sense_state(&curr, sense); sign_s = dir_sign(prev.sx, prev.sy, curr.sx, curr.sy); sign_t = dir_sign(prev.tx, prev.ty, curr.tx, curr.ty); fprintf(stderr, "sign_s %d, sign_t %dn", sign_s, sign_t); yield(0); while (1) { double delta_th;
  21. 21. 普通に書いたコード ● はじめはこういう風に書いていた switch(step){ case 0: step++; actuate( ACT_SCENARIO, scenario); break; case 1: step++; break; case 2: // fire to circular { double ax,ay; accel_to_circular_orbit(sx, sy, sx - prev.sx, sy - prev.sy, &ax, &ay); actuate(ACT_Vx, ax); actuate(ACT_Vy, ay); fprintf(stderr,"fire! %lf %lf",ax,ay); step++; } break; case 3: // analyze oval // in circuler
  22. 22. 作業に使った道具 ● C 言語 ● getopt ( U さん) 引数の処理 ● pthread ( U さん) ● yield 導入のために利用 ● ● SVN ● 複数人でのコードの共有 ● 以前のコードにすぐ戻せる ● 人のソースを自分のソースとマージする ● Gnuplot ● 軌道を描いてデバッグする ● アニメーションが苦手 ● Make ( U さん) ● ビルド作業を自動化
  23. 23. 個人的な感想 ● 自分のコードのへたくそさが身にしみる ● コードを共有すると、特に ● 同じことをするコードも比較しやすい   ( ICPC も同様の理由で身にしみる) ● 努力します! ● ツールの使い方に少し詳しくなった ● svn,gnuplot,... ● 数学を思い出す ● 余弦定理って何だっけ?
  24. 24. おしまい ● 次回は誰が発表するかな?

×