SlideShare a Scribd company logo
1 of 24
Download to read offline
ICFP 2009
いかにして我々は戦ったのか?




   2009/07/02  変ゼミ
         inajob


              inajob の所属している研究室
              で毎週木曜 16:30 から行われ
                   るゼミのような何か
スケジュール
●  6/27( 土 )
    3:00:16 から決戦開始
    ●

  ● (実際は朝から)

  ● 未明まで作業( for lightning round)

● 6/28( 日 )

  ● 結局間に合わず orz

  ● 昼まで寝る

  ●
    引き続き作業
  ●
    ゼミに備えて帰宅
●
   6/29( 月 )
  ● 軌道を考えながらゼミに参加

  ● ラストスパートと叫びながら未明まで作業

● 6/30( 火 )

  ● 演習 TA
メンバー
● U さん
 ● さすが、アルゴリズム、きれいなコード

● T さん

 ● ユーティリティ作成、デバッグ、投稿

● inajob

 ● アルゴリズム、がんばってるコード

● S 氏

 ●
   数学・物理

リソース不足が否めなかった
(常時稼動は僕と U さん)
問題の概要
●    衛星を飛ばしましょう
    ● 指定された軌道に乗る

    ● ある衛星とドッキングする

    ●
        etc...




シミュレータ                 今の座標など
                                 衛星制御
binary                            コード
                 VM
                       制御 (Δv)




                      我々の作る部分
VM
● 問題の前半
● 内容はそれほど複雑ではないが

 ● よくわからないアーキテクチャ



●    メモリは 2 つ (ハーバードアーキテクチャ)
    ●
      2^14 のアドレス            instruction   data

    ● 命令メモリは 32 ビット

    ●
      データメモリは 64 ビット   pc




●
     レジスタ
    ● プログラムカウンタ

    ● ステータスレジスタ
命令
●   destination が謎の命令
バイナリの形式
●    命令とデータメモリの初期値が連続して書いて
     ある
    ● なぜか順序がおかしい




                   data     instruction
          instruction     data
                   data     instruction
          instruction     data
さぁ衛星を飛ばそう
●    問1
    ● ある円軌道から別の円軌道にうつれ

    ● 使用燃料が少ないほうが点が高い

    ● 時間が短いほど点が高い
ヒントと利用した解放
● ホーマンさんの考えたエ
  ネルギー消費最小の移動
  方法
● Δv を求めたい

 ● 力学的エネルギー保存則

 ● 面積速度一定の法則

 ● 連立方程式
出力形式
●    航行データを指定された形式で提出する
    ●
      U さんが一晩で作ってくれました
    ● はやい
トラブル
 ●
      僕の書いたコードと 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!
つぎっ!
●    問2
    ● ある円軌道から別の円軌道の衛星とドッキング

       しろ
    ● ドッキング

     ●
        900 秒間 1000km 内に噴射をせずに居ること
    ● 使用燃料が少ないほうが点が高い

    ● 時間が短いほど点が高い
利用した解放
●    機が熟すまで待つ作戦
    ● 問 1 の方法を流用

       ● ただ移るだけでなく相手にあわせる必要が

          ある
    ●
      A→C == B→C  のとき軌道を切り替えれば OK
    ●
      A→C の時間が出せないっ!(楕円の公転周期 )

            C
                 S 氏の公式(ケプラーの第三法則)

                 惑星の公転周期の 2 乗は、軌道の半長径
                 の 3 乗に比例する。



            A

        B
ごり押し
●    S 氏の公式に基づきタイミングを合わせて軌道
     変更
    ● かなり近づくことができた




●   1km は近づけない and 姿勢を維持できない

●
     小刻みに噴射を繰り返し離れないようにする
     ( U さんの方法)
    ● 閾値より小さいずれになるまで繰り返す
つ、次っ!
●   さっきの問題の楕円バージョン
●   そろそろ時間もやばくなってきた
アイデア (1/2)
●   とりあえず自分は円軌道に戻す(ややこしいの
    で)
アイデア (2/2)
●   target の楕円の外接する円に移動する




       C

               T
           B
                   ●       タイミングを見計らう
                       ●
                           A→B == C→D  は自明
                       ●
                           B→D == T→C を探る

      D
A
計算式が思いつきません
● シミュレーションしましょう( U さん)
● T から C までをシミュレーションする

 ● 敵の位置、速度を利用する

● うまくいきそうなら A-B 楕円軌道に入る




                      C

                              T
                          B




                      D
                  A
TimeUp
●    と、ここまで作ったところで火曜の 3 時
    ● バグは取れず




●   問題はまだまだ続いています 気になる人は資
    料を読もう!
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;
普通に書いたコード
●   はじめはこういう風に書いていた
           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
作業に使った道具
●       C 言語
    ●
        getopt ( U さん)
       引数の処理
         ●

    pthread ( U さん)
    ●


       yield 導入のために利用
         ●


● SVN

  ● 複数人でのコードの共有

  ●
    以前のコードにすぐ戻せる
  ●
    人のソースを自分のソースとマージする
●
   Gnuplot
  ● 軌道を描いてデバッグする

  ● アニメーションが苦手

● Make ( U さん)

  ● ビルド作業を自動化
個人的な感想
●    自分のコードのへたくそさが身にしみる
    ● コードを共有すると、特に

    ● 同じことをするコードも比較しやすい

         ( ICPC も同様の理由で身にしみる)
    ● 努力します!



●       ツールの使い方に少し詳しくなった
    ●
        svn,gnuplot,...
●    数学を思い出す
    ● 余弦定理って何だっけ?
おしまい
●   次回は誰が発表するかな?

More Related Content

What's hot

[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キューYuto Takei
 
論理指向とプログラミング2010年度秋学期第9回
論理指向とプログラミング2010年度秋学期第9回論理指向とプログラミング2010年度秋学期第9回
論理指向とプログラミング2010年度秋学期第9回Noritada Shimizu
 
ライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話しライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話しnoanoa07
 
Rで学ぶデータサイエンス第1章(判別能力の評価)
Rで学ぶデータサイエンス第1章(判別能力の評価)Rで学ぶデータサイエンス第1章(判別能力の評価)
Rで学ぶデータサイエンス第1章(判別能力の評価)Daisuke Yoneoka
 
Immutable List Gem (KLab ALM版)
Immutable List Gem (KLab ALM版)Immutable List Gem (KLab ALM版)
Immutable List Gem (KLab ALM版)Sho Hosoda
 
色々なOSSで競技プログラミング
色々なOSSで競技プログラミング色々なOSSで競技プログラミング
色々なOSSで競技プログラミングnhirokinet
 
Shader読んで理解する会-4次元結び目SDF編
Shader読んで理解する会-4次元結び目SDF編Shader読んで理解する会-4次元結び目SDF編
Shader読んで理解する会-4次元結び目SDF編GearsRenard
 
平衡二分探索木の並行化
平衡二分探索木の並行化平衡二分探索木の並行化
平衡二分探索木の並行化gotoloop
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義するblackenedgold
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)MITSUNARI Shigeo
 
Undecidable Traveler
Undecidable TravelerUndecidable Traveler
Undecidable Travelerkinaba
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
最適化の手前の数学
最適化の手前の数学最適化の手前の数学
最適化の手前の数学俊介 後藤
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 

What's hot (20)

emcjp Item 42
emcjp Item 42emcjp Item 42
emcjp Item 42
 
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
 
論理指向とプログラミング2010年度秋学期第9回
論理指向とプログラミング2010年度秋学期第9回論理指向とプログラミング2010年度秋学期第9回
論理指向とプログラミング2010年度秋学期第9回
 
ライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話しライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話し
 
null使ったら負け東京版
null使ったら負け東京版null使ったら負け東京版
null使ったら負け東京版
 
Rで学ぶデータサイエンス第1章(判別能力の評価)
Rで学ぶデータサイエンス第1章(判別能力の評価)Rで学ぶデータサイエンス第1章(判別能力の評価)
Rで学ぶデータサイエンス第1章(判別能力の評価)
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Immutable List Gem (KLab ALM版)
Immutable List Gem (KLab ALM版)Immutable List Gem (KLab ALM版)
Immutable List Gem (KLab ALM版)
 
M-expr
M-exprM-expr
M-expr
 
色々なOSSで競技プログラミング
色々なOSSで競技プログラミング色々なOSSで競技プログラミング
色々なOSSで競技プログラミング
 
Shader読んで理解する会-4次元結び目SDF編
Shader読んで理解する会-4次元結び目SDF編Shader読んで理解する会-4次元結び目SDF編
Shader読んで理解する会-4次元結び目SDF編
 
平衡二分探索木の並行化
平衡二分探索木の並行化平衡二分探索木の並行化
平衡二分探索木の並行化
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
Undecidable Traveler
Undecidable TravelerUndecidable Traveler
Undecidable Traveler
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
最適化の手前の数学
最適化の手前の数学最適化の手前の数学
最適化の手前の数学
 
Lockfree Queue
Lockfree QueueLockfree Queue
Lockfree Queue
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
llvm入門
llvm入門llvm入門
llvm入門
 

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

NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告Hiroyuki TOKUNAGA
 
130323 slide all
130323 slide all130323 slide all
130323 slide allikea0064
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案yushin_hirano
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章Tomonobu_Hirano
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算kunihikokaneko1
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門AimingStudy
 
自然言語処理はじめました - Ngramを数え上げまくる
自然言語処理はじめました - Ngramを数え上げまくる自然言語処理はじめました - Ngramを数え上げまくる
自然言語処理はじめました - Ngramを数え上げまくるphyllo
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Inc.
 
Sized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアルSized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアルAkinori Abe
 
One
OneOne
Oneoupc
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 

Similar to ICFP2009-いかにして我々は戦ったか (20)

NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告
 
130323 slide all
130323 slide all130323 slide all
130323 slide all
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
WUPC2012
WUPC2012WUPC2012
WUPC2012
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門
 
自然言語処理はじめました - Ngramを数え上げまくる
自然言語処理はじめました - Ngramを数え上げまくる自然言語処理はじめました - Ngramを数え上げまくる
自然言語処理はじめました - Ngramを数え上げまくる
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
 
Sized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアルSized Linear Algebra Package のチュートリアル
Sized Linear Algebra Package のチュートリアル
 
One
OneOne
One
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
Tottoruby 20130119
Tottoruby 20130119Tottoruby 20130119
Tottoruby 20130119
 
Kosakunakano
KosakunakanoKosakunakano
Kosakunakano
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
C言語講習会2
C言語講習会2C言語講習会2
C言語講習会2
 

More from ina job

KubeWeekly読書メモの紹介
KubeWeekly読書メモの紹介KubeWeekly読書メモの紹介
KubeWeekly読書メモの紹介ina job
 
僕の 技術の無駄遣いを 紹介します
僕の 技術の無駄遣いを 紹介します僕の 技術の無駄遣いを 紹介します
僕の 技術の無駄遣いを 紹介しますina job
 
シェル入門
シェル入門シェル入門
シェル入門ina job
 
Voice remix!
Voice remix!Voice remix!
Voice remix!ina job
 
Mustache入門
Mustache入門Mustache入門
Mustache入門ina job
 
MTM07で電子楽器を展示してきた
MTM07で電子楽器を展示してきたMTM07で電子楽器を展示してきた
MTM07で電子楽器を展示してきたina job
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみたina job
 
SVNのすすめ&Redmineでプロジェクト管理
SVNのすすめ&Redmineでプロジェクト管理SVNのすすめ&Redmineでプロジェクト管理
SVNのすすめ&Redmineでプロジェクト管理ina job
 
OooBasic
OooBasicOooBasic
OooBasicina job
 
context free art
context free artcontext free art
context free artina job
 
WxHaskell
WxHaskellWxHaskell
WxHaskellina job
 
webを飾る技術
webを飾る技術webを飾る技術
webを飾る技術ina job
 

More from ina job (12)

KubeWeekly読書メモの紹介
KubeWeekly読書メモの紹介KubeWeekly読書メモの紹介
KubeWeekly読書メモの紹介
 
僕の 技術の無駄遣いを 紹介します
僕の 技術の無駄遣いを 紹介します僕の 技術の無駄遣いを 紹介します
僕の 技術の無駄遣いを 紹介します
 
シェル入門
シェル入門シェル入門
シェル入門
 
Voice remix!
Voice remix!Voice remix!
Voice remix!
 
Mustache入門
Mustache入門Mustache入門
Mustache入門
 
MTM07で電子楽器を展示してきた
MTM07で電子楽器を展示してきたMTM07で電子楽器を展示してきた
MTM07で電子楽器を展示してきた
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみた
 
SVNのすすめ&Redmineでプロジェクト管理
SVNのすすめ&Redmineでプロジェクト管理SVNのすすめ&Redmineでプロジェクト管理
SVNのすすめ&Redmineでプロジェクト管理
 
OooBasic
OooBasicOooBasic
OooBasic
 
context free art
context free artcontext free art
context free art
 
WxHaskell
WxHaskellWxHaskell
WxHaskell
 
webを飾る技術
webを飾る技術webを飾る技術
webを飾る技術
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (8)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

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

  • 1. ICFP 2009 いかにして我々は戦ったのか? 2009/07/02  変ゼミ inajob inajob の所属している研究室 で毎週木曜 16:30 から行われ るゼミのような何か
  • 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 ● ある円軌道から別の円軌道にうつれ ● 使用燃料が少ないほうが点が高い ● 時間が短いほど点が高い
  • 9. ヒントと利用した解放 ● ホーマンさんの考えたエ ネルギー消費最小の移動 方法 ● Δv を求めたい ● 力学的エネルギー保存則 ● 面積速度一定の法則 ● 連立方程式
  • 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. つ、次っ! ● さっきの問題の楕円バージョン ● そろそろ時間もやばくなってきた
  • 16. アイデア (1/2) ● とりあえず自分は円軌道に戻す(ややこしいの で)
  • 17. アイデア (2/2) ● target の楕円の外接する円に移動する C T B ● タイミングを見計らう ● A→B == C→D  は自明 ● B→D == T→C を探る D A
  • 18. 計算式が思いつきません ● シミュレーションしましょう( U さん) ● T から C までをシミュレーションする ● 敵の位置、速度を利用する ● うまくいきそうなら A-B 楕円軌道に入る C T B 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,... ● 数学を思い出す ● 余弦定理って何だっけ?
  • 24. おしまい ● 次回は誰が発表するかな?