遺伝的アルゴリズム genetic algorithm - demura.net · 2011-12-01 · ポインタ pointer...

47
コンピュータ工学 第9週目 2011年12月2日 ロボティクス学科 出村 公成 注:このパワーポイントは金沢工業大の講義用に作成したものです。この資料をダ ウンロードした方は、自分の勉強用途のみにお使いください。再配布を禁止します 。インターネットなどで決して公開しないでください。

Upload: others

Post on 25-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

コンピュータ工学

第9週目

2011年12月2日

ロボティクス学科

出村 公成

注:このパワーポイントは金沢工業大の講義用に作成したものです。この資料をダウンロードした方は、自分の勉強用途のみにお使いください。再配布を禁止します。インターネットなどで決して公開しないでください。

Page 2: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

今週の予定

• 8章 ポインタ

• ゲーム&シミュレータ作成

– ODEのインストール

– サンプルプログラム

Page 3: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

8章 ポインタ

• C言語の最難関

• アドレスを操作可能

• 記憶領域の動的作成

• 実用的なプログラムの作成には不可欠

組み込み系エンジニアには必須の知識

Page 4: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

変数は何故生まれたか?

• コンピュータはデータをアドレスで管理

• プログラマーをアドレス管理から解放

•初期のアセンブラ

メモリ内のアドレスの指定をプログラマが担当

MOVE A [+120]: Aレジスタの現在値を120バイト後方のアド

レスへコピーする(代入する)

•変数名の発明

MOVE A data1 → アドレス計算からプログラマを解放

→ 翻訳処理ソフトが担当

Page 5: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

変数とアドレス

int x=3, y=5;

例:コンパイラは

変数xを100番地

変数yを104番地に割当

&x: 変数xのアドレス:100

x: 変数xの値:3

メモリ

100番地

104番地

アドレス

変数

3

5

変数の要素

• アドレス

• 値(アドレスの中身)

Page 6: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

ポインタ pointer

• ポインタは他の変数のアドレスを指す変数

• アドレス演算子

– &変数の値

– 変数のアドレスを取り出す

• 間接演算子

– *変数のアドレス

– アドレスの値を取り出す

ポインタ犬

Page 7: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

宣言と意味 (重要)

宣言時 宣言後

演算子なし アドレス演算子

間接演算子

int ken; ken

&ken

アドレス

*ken

int *ken;

ポインタ

ken

アドレス

&ken *ken

kenはint型変数へのポインタ

Page 8: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

宣言と意味

// 普通に宣言

int ken = 170; printf(“ken=%d¥n”, ken); // 値を表示 printf(“&ken=%#p¥n”, &ken); // p:アドレスを表示 // #: 0x(16進)や0(8進)を付加

// ポインタで宣言

int *ken;

*ken = 170;

printf(“ken=%d¥n”, *ken); // 値を表示

printf(“ken=%#p¥n”, ken); // アドレスを表示

上のポインタ宣言のコードはエラーになる

// int *ken = 170;

Page 9: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

Quiz 1:ポインタの大きさは?

• ヒント

– 32ビットCPU

• 1回の処理で32ビットを扱えるCPU

– メモリ空間2の32乗

• 4ギガバイト

• sizeof(int *) 4バイト

Pentium M

Page 10: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

Quiz

• 次の出力は何か? 図を描いて考えよう

// Quiz 2 #include <stdio.h> int main() { int a, *p; a = 77; p = &a; a += 23; printf(“*p=%d¥n”, *p); return 0; }

// Quiz 3 #include <stdio.h> int main() { int a, *p; a = 77; p = &a; *p += 23; printf(“a=%d¥n”, a); return 0; }

Page 11: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

Quiz2

// 変数

int taro = 170; int jim = 180; printf(“average=%d¥n”,(taro + jim)/2);

以下のコードをポインタを使って書くとどうなるか?

Page 12: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

変数の動的な生成

// ポインタ 悪い例

double *taro, *jim; *taro = 170; *jim = 180; printf(“average=%f¥n”,(*taro + *jim)/2);;

これではエラー segmentation fault error になる

メモリに不正にアクセス

ポインタを使う場合は明示的に記憶領域を確保しなければ

いけない

Page 13: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

変数の動的な生成

• 動的記憶期間 calloc, freeを使う

– プログラムが変数の寿命を自由に決めることができる

– 不要になったらメモリ領域を開放することにより、メモリを節約できる

– 大きな記憶領域を確保できる

Page 14: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

動的記憶領域の確保

// ポインタ 正しい例

int *taro, *jim; taro = (int *) calloc(1, sizeof(int)); jim = (int *) calloc(1, sizeof(int)); *taro = 170; *jim = 180; printf(“average=%d¥n”,(*taro + *jim)/2); free(taro); free(jim);

ポインタは明示的に記憶領域を確保しなければいけない

void *calloc(size_t n, size_t size); 大きさがsizeであるn個の記憶領域を確保する.0で初期化

Page 15: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

動的記憶領域の解放

// ポインタ 正しい例

int *taro, *jim; taro = (int *) calloc(1, sizeof(int)); jim = (int *) calloc(1, sizeof(int)); *taro = 170; *jim = 180; printf(“average=%d¥n”,(*taro + *jim)/2); free(taro); free(jim);

動的記憶領域は使い終わったら解放しなければいけない

void free(void *pointer); pointerで指している記憶領域を解放する

Page 16: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

// 動的記憶領域:大きな記憶領域を確保できる

int *student, i; student = (int *) calloc(100, sizeof(int)); for (i = 0; i< 100; i++) {

*(student + i) = i; // student[i] = i; でも良い

} free(student);

ポインタは明示的に記憶領域を確保しなければいけない

動的記憶領域を複数個確保

// 配列:大きな領域を確保できない

int student[10000000], i; for (i = 0; i< 10000000; i++) {

student[i] = i;

}

Page 17: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

8.2.4 関数とポインタ1 p288

int main(void) {

int a = 10, b = 5;

swap(a, b); return (0);

}

void swap(int x, int y)

{

int temp = x;

x = y;

y = temp;

} メモリ

100番地

104番地

10

5

&a

&b

200番地

204番地

150番地

Page 18: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

関数とポインタ2

int main(void) {

int a = 10, b = 5;

swap(a, b); return (0);

}

void swap(int x, int y)

{

int temp = x;

x = y;

y = temp;

} メモリ

100番地

104番地

10

5

&a

&b

200番地

204番地

150番地

10

5

&x

&y

10

5

tmp

Page 19: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

関数とポインタ3

int main() {

int a = 10, b = 5;

swap(a, b); printf(“a=%d b=%d¥n”,a,b); return 0;

}

void swap(int x, int y)

{

int temp = x;

x = y;

y = temp;

} メモリ

100番地

104番地

10

5

&a

&b

*xは100番地のオブジェクト:10

*yは104番地のオブジェクト:5

200番地 x

204番地 y

150番地 temp 10

5

10

Page 20: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

関数とポインタ1(正)

int main() {

int a = 10, b = 5;

swap(&a, &b); printf("整数aとbの値を入れ換えました。¥n“);

printf("aの値は%d¥n“, a);

printf("bの値は%d¥n“, b);

return (0);

}

void swap(int *x, int *y)

{

int temp = *x;

*x = *y;

*y = temp;

} メモリ

100番地

104番地

10

5

&a

&b

*xは100番地のオブジェクト:10

*yは104番地のオブジェクト:5

Page 21: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

int main() {

int a = 10, b = 5;

swap(&a, &b); printf("aの値は%d¥n“, a);

printf("bの値は%d¥n“, b);

return (0);

}

void swap(int *x, int *y)

{

int temp = *x;

*x = *y;

*y = temp;

} メモリ

100番地

104番地

10, *x

5,*y

&a

&b

*xは100番地のオブジェクト:10

*yは104番地のオブジェクト:5

200番地 temp 10

x

y

Page 22: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

int main() {

int a = 10, b = 5;

swap(&a, &b); printf("aの値は%d¥n“, a);

printf("bの値は%d¥n“, b);

return (0);

}

void swap(int *x, int *y)

{

int temp = *x;

*x = *y;

*y = temp;

} メモリ

100番地

104番地

10

5

&a

&b

*xは100番地のオブジェクト:10

*yは104番地のオブジェクト:5

5

200番地 temp 10

x

y

Page 23: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

int main() {

int a = 10, b = 5;

swap(&a, &b); printf("aの値は%d¥n“, a);

printf("bの値は%d¥n“, b);

return (0);

}

void swap(int *x, int *y)

{

int temp = *x;

*x = *y;

*y = temp;

} メモリ

100番地

104番地

10

5

&a

&b

*xは100番地のオブジェクト:10

*yは104番地のオブジェクト:5

5

200番地 temp 10

10

x

y

a

b

Page 24: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

int main() {

int a = 10, b = 5;

swap(&a, &b); printf("aの値は%d¥n“, a);

printf("bの値は%d¥n“, b);

return (0);

}

void swap(int *x, int *y)

{

int temp = *x;

*x = *y;

*y = temp;

} メモリ

100番地

104番地

10

5

a

b

*xは100番地のオブジェクト:10

*yは104番地のオブジェクト:5

5

200番地 temp 10

10

Page 25: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

ポインタとscanf関数 • C言語は参照渡し(P235)ができないので引数の値を変更

したい場合はポインタにより実現する

• 引数の値を変更したいときは引数をポインタにする

• それ以外はポインタを使わない

#include <stdio.h>

int main(void) {

int k;

printf(“整数を入力してください:”);

scanf(“%d”, &k);

printf(“整数の値は%d¥n”, k);

return 0;

}

Page 26: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

値渡し 参照渡し P242

呼び出す関数

呼び出される関数

呼び出す関数

呼び出される関数

実引数

仮引数

実引数

仮引数

実引数と仮引数は共有 実引数と仮引数は別物

コピーが渡される

Page 27: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

27

2限目

• ODEの概要

• 開発環境、ODEのインストール

• 演習

Page 28: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

28

参考書

• 簡単!実践!ロボットシミュレーション

Open Dynamics Engineによるロボットプログラミング

• 出村公成著

• 森北出版

• 2007年5月

• ISBN-13: 978-4627846913

簡単!実践!ロボットシミュレーションの表紙

Page 29: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

29

参考書の特徴

• ロボット工学の基礎とそのプログラミングを学べる実践書

• 日本初のODE解説書

– 総合解説書としては世界初

• ODEプロジェクトへの寄付

– 教科書売り上げ1冊につき1ドルをODEプロジェクトへ寄付

• お財布にやさしく

– 教科書以外はお金がかからない

• WEBサイトとの連動

– http://demura.netからソースコードのダウンロード可能

Page 30: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

30

目 次 • Part 1 Open Dynamics Engine

– STEP1: ODE初体験

– STEP2: シミュレータを作ろう

– STEP3: ODEをもっと知ろう

• Part 2 車輪型ロボット

– STEP4:差動駆動型ロボット

– STEP5:全方向移動ロボット

• Part3 ロボットアーム

– STEP6:関節角とアーム先端位置との関係

– STEP7:関節角速度と先端速度との関係

• Part4 脚型ロボット

– STEP8:4脚ロボット

– STEP9:ヒューマノイドロボット

• 付録 0からの数学

Page 31: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

31

Step1 ODE初体験

Page 32: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

32

ODEの概要 • ラッセル・スミス博士らが2001年から開発を続けている

剛体動力学計算エンジン

• Open Dynamics Engine

• 公式Webサイト

– http://www.ode.org

• 特 徴

– オープンソース

– 簡単なので使いやすい

– 高速で安定性がある

• 用 途

– ゲームの物理計算エンジン

– バーチャルリアリティ,ロボットのシミュレータ • 精度が要求される用途には向かない

Page 33: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

33

ODEの技術的な特徴

• 任意の質量分布を持つ剛体の動力学シミュレーションが可能

• ジョイント:ボール,ヒンジ,スライダー,ユニバーサル

• 衝突基本形状:球,直方体,カプセル,円柱,平面,ポリゴン

• 動力学計算:ニュートン・オイラー法

– 高速で安定性はあるが精度は高くない

• 衝突検出機能が組み込まれている

• C, C++でプログラミング可能

• マルチプラットフォーム

– Windows, Linux, Mac OS Xで使用可能

Page 34: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

34

ODEのライセンス • ソフトウェアを使用する場合はライセンスを確認することが重要

。ライセンス違反は個人並びに組織に大きな損害をもたらす。

• 2重ライセンス

– どちらか好きな方のライセンスを利用可能

– これらにより,商用利用してもソースコードを公開する必要なし

• GNU Lesser Public License (LGPL)

– ライブラリ用のGPL

– ライセンスの全文

• http://www.gnu.org/licenses/lgpl.html

• http://www.gnu.org/licenses/lgpl.ja.html (日本語訳)

• BSD Style License

– 著作権表示、無保証、免責だけが条件の寛大なライセンス

– ライセンスの全文

• http://opende.sourceforge.net/ode-license.html

Page 35: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

35

GPL (GNU General Public License)

ソフトウェアの自由な実行、複製、改変および再配布を、「無保証」の条件付きで許諾する利用許諾(ライセンス)、またはその契約文書のこと。FSFによって考案された。

ソフトウェアなどの著作者が、自身の著作権の保持を表明したまま、複製や改変などの多くの著作支分権の実施を複製物の受領者に許諾するとともに、その受領者が複製物またはそれらを改変した派生物を再配布することを妨げないこと、ソフトウェアの使用に伴う損害を保証しないことなどを条件に、ソフトウェアの利用を許諾する契約。また、ソフトウェアのバイナリ形式のみでの配布を認めず、ソースコードの添付またはソースコードの入手方法の明示を義務づけている。

1991年に発表されたVer.2は、長期にわたり多くのソフトウェアに採用されてきた。GPL

のこの特定の版を指してGPLv2と表記されることがある。

2007年6月、FSFはGPL Ver.3(GPLv3)を発表した。この新しい版には、ソフトウェアの自

由を守るという理念はそのままに、契約文書としての体裁を整えるとともに、近年のソフトウェアの利用形態に合わせた条件の見直しなどが含まれている。

http://ossipedia.ipa.go.jp/kb/GNU_General_Public_License オープンソース情報データベース OSS iPediaから転載

Page 36: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

36

GNU Lesser Public License (LGPL)

「ほかのソフトウェアと組み合わされて実行されたり配布されたりするソフトウェアを対象に、GPLに準ずる形式でソフトウェアなどの著作物の利用を許諾する契約、またはその契約文書のこと。FSFによって考案された。

GPLでは、そのライセンスの下で配布されるソフトウェアと組み合わされて配布される派生ソフトウェアについてもGPLが適用されるため、無制限な再配布 の

保証やソースコードの開示といった「厳しい」制約が派生物にも課せられる。この制約を避けるため、LGPLではそのライセンスの下にあるソフトウェアと 一緒に配布されるソフトウェアについては、LGPLの制約は受けないという条項が設けられている。

もともとは、コンパイラなどでリンクして利用するライブラリなど、ほかのプログラムと組み合わされて利用されるソフトウェアを対 象にしたライセンスで、「商

用ソフトウェア」でのフリーソフトウェアの利用を妨げないようにすることを目的に考案されたライセンスで、当初は“GNU Library General Public License”と呼ばれていた。 」

オープンソース情報データベース OSS iPediaから転載

http://ossipedia.ipa.go.jp/kb/GNU_Lesser_General_Public_License

Page 37: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

37

BSD License

カリフォルニア大学バークレー校でUNIX互換ソフトウェアなどの配布に使用されたライセンスのこと。

1999年7月22日の改正により、原作者に対する謝辞の明記

を義務づけた「謝辞条項」(「宣伝条項」とも呼ばれる)が廃止され、現在のライセンス条文になった。改正後のものを、特に「New BSD License」(修正BSDライセンス)と呼ぶこともある。

オープンソース情報データベース OSS iPediaから転載

http://ossipedia.ipa.go.jp/kb/BSD_License

Page 38: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

38

New BSD License

カリフォルニア大学バークレー校のコンピュータサイエンス学科で開発されたBSD UNIXのオープンソース版である「4.3 BSD Net/2」から派生したBSD系UNIXシステム(FreeBSD、NetBSDなど)の配布で使われているライセンス。「バークレイスタイルライセンス(berkeley-style license)」とも。著

作権の表示と、無保証、免責のみを条項とする、制限の少ないライセンス方式である。

元々の「BSDライセンス」には、開発者に対する謝辞を表示することを派

生物にも強制する「謝辞条項」(「宣伝条項」とも呼ばれる)があったため、GPLを適用するソフトウェアと組み合わせた派生物の配布に制限が生ずるという問題があった。この条項を削除した現在のBSDライセンスのことを、特に「New BSD License」(修正BSDライセンス)と呼んでいる。

オープンソース情報データベース OSS iPediaから転載

http://ossipedia.ipa.go.jp/kb/New_BSD_License

Page 39: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

39

BSD style license for ODE Open Dynamics Engine Copyright (c) 2001-2004, Russell L. Smith.

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that

the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following

disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the

following disclaimer in the documentation and/or other materials provided with the distribution.

Neither the names of ODE's copyright owner nor the names of its contributors may be used to endorse or

promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR

BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,

WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR

OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF

THE POSSIBILITY OF SUCH DAMAGE.

ODEソースコードのLICENSE-BSD.TXTの全文を転載

Page 40: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

40

開発環境、ODEのインストール

• http://demura.net/robotsimu/ の設定に従い開発環境、ODEをインストールしよう。

• 講義ではWindows上でCode::Blocksを使用

– Code::BlocksはWindows, Linuxなどで利用可能なC/C++言語の統合開発環境

– オープンソース

• 大まかな手順

– 開発環境のインストール • Code::Blocks

– ODEのインストール

Page 41: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

41

動力学計算の手続き

1. ODEの初期化 dInitODE()

2. ワールドの生成 dWorldCreate()

3. 重力の設定 dWorldSetGravity()

4. 剛体(ボディ)の生成 dBodyCreate()

5. 質量パラメータの設定

– dMassSetZero()

– dMassSet***Total()

– dBodySetMass()

6. 位置の設定

– dBodySetPosition()

7. シミュレーションループ

– 動力学計算 dWorldStep()

8. ワールドの破壊 dWorldDestroy()

9. ODEの終了 dCloseODE()

簡単のために引数等は省略

Page 42: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

42

ODEの用語

• ワールド (world)

– 動力学計算を受けるものを入れるソフトウェアの入れ物

• ボディ (body)

– 剛体(rigid body)のこと.

• 変形しない理想的な物体

– ODEは剛体の動力学計算エンジン

Page 43: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

43

ODEの座標系 • 直交座標系(右手系)

– 数学、物理で良く使われる右手系

– 原点:9個あるピラミッドの中央

– X軸:原点から赤ピラミッド

– Y軸:原点から青ピラミッド

– Z軸:原点から上空

• 単位

– SI単位系 (P59)

• 長さ m

• 質量 kg

• 時間 s

• 力 N

図1.2 ODEの座標系(教科書P9から転載)

Page 44: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

44

演 習

以下の問題をやろう

• demura.netのホームワーク1

Page 45: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

終わり

Page 46: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

参考PPT

Page 47: 遺伝的アルゴリズム Genetic Algorithm - demura.net · 2011-12-01 · ポインタ pointer • ポインタは他の変数のアドレスを指す変数 • アドレス演算子

int* ptr か int *ptr ?

• Cにもint*型はない

• int* x, y;

– xはint型のポインタ変数、

yはint型の変数

• int *x, *y;

文法的&錯誤の恐れがありので間接演算子は

変数側につけるべし