More Related Content Similar to ICFP2009-いかにして我々は戦ったか Similar to ICFP2009-いかにして我々は戦ったか (20) ICFP2009-いかにして我々は戦ったか2. スケジュール
● 6/27( 土 )
3:00:16 から決戦開始
●
● (実際は朝から)
● 未明まで作業( for lightning round)
● 6/28( 日 )
● 結局間に合わず orz
● 昼まで寝る
●
引き続き作業
●
ゼミに備えて帰宅
●
6/29( 月 )
● 軌道を考えながらゼミに参加
● ラストスパートと叫びながら未明まで作業
● 6/30( 火 )
● 演習 TA
3. メンバー
● U さん
● さすが、アルゴリズム、きれいなコード
● T さん
● ユーティリティ作成、デバッグ、投稿
● inajob
● アルゴリズム、がんばってるコード
● S 氏
●
数学・物理
リソース不足が否めなかった
(常時稼動は僕と U さん)
4. 問題の概要
● 衛星を飛ばしましょう
● 指定された軌道に乗る
● ある衛星とドッキングする
●
etc...
シミュレータ 今の座標など
衛星制御
binary コード
VM
制御 (Δv)
我々の作る部分
5. VM
● 問題の前半
● 内容はそれほど複雑ではないが
● よくわからないアーキテクチャ
● メモリは 2 つ (ハーバードアーキテクチャ)
●
2^14 のアドレス instruction data
● 命令メモリは 32 ビット
●
データメモリは 64 ビット pc
●
レジスタ
● プログラムカウンタ
● ステータスレジスタ
6. 命令
● destination が謎の命令
7. バイナリの形式
● 命令とデータメモリの初期値が連続して書いて
ある
● なぜか順序がおかしい
data instruction
instruction data
data instruction
instruction data
8. さぁ衛星を飛ばそう
● 問1
● ある円軌道から別の円軌道にうつれ
● 使用燃料が少ないほうが点が高い
● 時間が短いほど点が高い
10. 出力形式
● 航行データを指定された形式で提出する
●
U さんが一晩で作ってくれました
● はやい
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. つぎっ!
● 問2
● ある円軌道から別の円軌道の衛星とドッキング
しろ
● ドッキング
●
900 秒間 1000km 内に噴射をせずに居ること
● 使用燃料が少ないほうが点が高い
● 時間が短いほど点が高い
13. 利用した解放
● 機が熟すまで待つ作戦
● 問 1 の方法を流用
● ただ移るだけでなく相手にあわせる必要が
ある
●
A→C == B→C のとき軌道を切り替えれば OK
●
A→C の時間が出せないっ!(楕円の公転周期 )
C
S 氏の公式(ケプラーの第三法則)
惑星の公転周期の 2 乗は、軌道の半長径
の 3 乗に比例する。
A
B
14. ごり押し
● S 氏の公式に基づきタイミングを合わせて軌道
変更
● かなり近づくことができた
● 1km は近づけない and 姿勢を維持できない
●
小刻みに噴射を繰り返し離れないようにする
( U さんの方法)
● 閾値より小さいずれになるまで繰り返す
15. つ、次っ!
● さっきの問題の楕円バージョン
● そろそろ時間もやばくなってきた
17. アイデア (2/2)
● target の楕円の外接する円に移動する
C
T
B
● タイミングを見計らう
●
A→B == C→D は自明
●
B→D == T→C を探る
D
A
19. TimeUp
● と、ここまで作ったところで火曜の 3 時
● バグは取れず
● 問題はまだまだ続いています 気になる人は資
料を読もう!
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. 普通に書いたコード
● はじめはこういう風に書いていた
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. 作業に使った道具
● C 言語
●
getopt ( U さん)
引数の処理
●
pthread ( U さん)
●
yield 導入のために利用
●
● SVN
● 複数人でのコードの共有
●
以前のコードにすぐ戻せる
●
人のソースを自分のソースとマージする
●
Gnuplot
● 軌道を描いてデバッグする
● アニメーションが苦手
● Make ( U さん)
● ビルド作業を自動化
23. 個人的な感想
● 自分のコードのへたくそさが身にしみる
● コードを共有すると、特に
● 同じことをするコードも比較しやすい
( ICPC も同様の理由で身にしみる)
● 努力します!
● ツールの使い方に少し詳しくなった
●
svn,gnuplot,...
● 数学を思い出す
● 余弦定理って何だっけ?