ぎょーむ日誌 2002-07-23
2002 年 07 月 23 日 (火)
- 0800 起床.
シャワー.
朝飯・弁当の準備.
朝飯.
コーヒー.
0840 自宅発.
曇.
0850 研究室着.
- ネット雑用少々.
- 1000 すぎからバーター取り引き用プログラムの作成にとりかかる.
「すぐに片づくだろう」
という楽観とはうらはらに終了したのは 1855.
- べつに難しいことやってたわけではないんだがなぁ
……
多少の汎用性は追求したけど.
- この将来の使いまわしを多少考慮した部分
……
二次元連続空間上の点々集団において
「あまり手間をかけずにご近所に誰がいるかを調べる」
という頻繁に使われそうな処理について少し解説してみる.
|
[二次元連続空間上の点々]
橙色の区画の
「ご近所区画」
として定義されるているのが青線内.
これは半径 r の円によって決定される.
|
手筋は素直なもので,
-
(準備)
連続空間をタテ・ヨコてきとーに区分けする.
-
観測データなぞ読み込み点をばらまく.
そのときに点がどの区画に落ちるか記録しておく.
-
(ご近所さがし開始)
全ての区画に関して,
区画内に含まれているすべての点に関して,
「ご近所」
(一定距離 r 内に存在するすべての点とそこまで距離)
を特定する.
-
探索にさきだち,
ひとつひとつの区画に関して,
「ご近所区画」を特定しておく.
例として,
上の図で橙色で囲まれた区画に注目する.
左上と右下に半径 r の円を置く.
これらふたつの円のかかる区画のうち,
もっとも左上・もっとも右下にある区画を含む
矩形の区画部分集団 (青線内) が
「ご近所区画」である.
-
注目しているある区画内のある点に関して,
「ご近所区画」
内の全ての点 (自分自身は除く)
との距離を計算し,
r より小さい点の部分集合を選ぶ.
……
うーむ,
要約してみるとこれだけのことか.
- でも,まぁ時間かかったということで.
そんなに長くないのにね.
全体で 300 行すこし
(MacOS 上というか Mac ファイルシステム上で動かすときの
面倒を減じるために,
とりあえず全コードを単一ファイルにまとめている).
- この仕組を利用する側のコードから見ると,
これまたいつものごとく初期化→ブツの登録→計算
という流れで.
# Initialization (初期化)
my $grid_world = grid_world->new();
$grid_world->Initialize_grid_hash(
xy->new($parameter{'x_min'}, $parameter{'y_min'}),
xy->new($parameter{'x_max'}, $parameter{'y_max'}),
$parameter{'number_x'}, $parameter{'number_y'}
);
$grid_world->Initialize_boundary($parameter{'range'}, $parameter{'range'});
# File reading (データの読み込み・個体の生成・個体の登録)
... (略) ...
open IN, "$input_file" or die "Error: Can't open $input_file";
while (<IN>) {
... (略) ...
my $new_tree = tree->new($tree_id++, $species, $x, $y, $size);
$grid_world->Add_tree($new_tree);
}
close IN;
# Calculation of local density index (なんちゃら指数とやらの計算)
my $index = $grid_world->Calculate_index($parameter{'range'});
- こういうのは動作試験にけっこう時間かかってるのかも.
ちゃんとこちらが意図したとーりに動いてるか
確認しながら作っていかないといけないから.
- で 1855 に動作試験あれこれ終って作業終了.
- お茶部屋で院生の人たちと雑談など.
コーディングばててるんだろうか?
2150 研究室発.
2200 帰宅.
晩飯.
すぐ寝る.
- ということで,
このプログラミングだけで終った一日.
- [今日の素読]
ナシ
- [今日の運動]
- [今日の食卓]
- 朝 (0830):
米麦 0.7 合.
チンゲンサイ・タマネギ・シシトウ・ニンジン・マイタケの炒めもの.
- 昼 (1300):
弁当.
研究室お茶部屋.
米麦 0.7 合.
朝と同じ.
- 晩 (2230):
米麦 0.7 合.
朝と同じ.
ダイコンおろし.