####################################### # 保全優先区域の選択ツールSecSel # # 2020-12-08 ####################################### Name of software: SecSel Software access: http://www.nies.go.jp/biology/en/data/tool/secsel/index.html Developer: TAKENAKA, Akio Year first available 2020 Source language: Python 3.X Availability and cost: open source Released under the MIT license https://licenses.opensource.jp/ 【この文書について】 この文書は、生物多様性保全のための保護区デザインを支援するPythonのパッ ケージSecSelの紹介 readme_1st_ja.txt では触れていない詳細を解説する。 まずreadme_1st_ja.txt を通覧してから本文書を読むのがよい。 この中で解説しているのは、 ・要素ごとの保全目標の設定 ・サイトの選択にともなうコストの考慮 ・なるべく散在させないサイト選択 ・サイト内で保全や利用の両立が困難な要素の衝突の解決 ・出力ファイルへの詳細情報の書き出し ・そのほかの設定 ・Pythonスクリプト中での SecSel の扱い方 である。 test_dataset.zip にはこの文書で説明しているパラメータを含め、設定可能 な全項目を含むパラメータファイルの例 parameters_full.txtおよびその中で 設定している各種データファイルの例が含まれている。 parameters_full.txt のなかでコメントアウト( 行頭に # をつけてコメント 化し、パラメータ設定を無効化)している行を、# を削除して有効化したり、 設定されている値を変更したりしてテストできる。 また、例として添付している仮想データは、同梱の gen_test_data_for_secsel.py を使って生成している。 readme_1st_ja.txt で説明した、個々のlocal unit の評価データファイル foo_local_units.txt も同様である。確率的に各要素の分布を決めているので、 同じ設定でデータファイルを生成しても、添付のものとは異なったデータが得 られる。また、コードを適宜編集すれば違った設定のデータを生成できる。 【要素ごとの保全目標の設定】 [top_n_file] 保全目標(高価値の local unit をいくつ保護区に含めるか)は、default_top_n で全要素(feature )の既定値を設定するほか、このパラメータで設定したフ ァイル内で個々の要素ごとに与えることができる。ファイルの各行には、要素 名とその保全目標がタブ区切りで並べる。最初の1 行はヘッダ行。 ※サンプルファイル:foo_target.txt このファイル中で設定していない要素については default_top_n の値を目標 とする。 【サイトの選択にともなうコストの考慮】 個々のサイトを保護区に追加することにより生じるコストを考慮し、これをな るべく抑制するように保護区とするサイトを選ぶことができる。具体的なコス トとしては、土地取得の費用、設定後の管理の費用、保護区とすることで生態 系サービスの利用、他の土地利用が抑制されることのコスト(農業生産・漁業 の抑制)など、さまざまなコストが考えられる。 コストを考慮することで保全目標が達成されなくなることはない。保全目標を 達成するために追加するサイトを選ぶ際に、相対的にコストが小さいものが選 ばれる。 コストは、一行ごとにサイト名とコストがタブ区切りで並んだファイルで与える。 でいる。最初の1行はヘッダ行。 パラメータファイル中で、このファイルの名前を site_cost_file に設定する。 ※サンプルファイル:foo_cost.txt この例では、サイトのy座標(サイト名の末尾3桁)が大きいほどコストが大き く、x座標(サイト名のはじめの3桁)とは無関係いという設定になっている。 【散在させないサイト選択】 実際の保護区のデザインでは、保護対象となる地域がなるべく散在しないほう が管理上も効率がよいことが多い。サイトの散在の度合いがなるべく低くなる ようにサイトを選んで行く際に、散在具合のなんらかの指標を散在のペナルテ ィとして、このペナルティがなるべく小さくなるように保護区をデザインする。 コストの場合と同様、散在のペナルティを考慮することで保全目標が達成され なくなることはない。保全目標を達成するために追加するサイトを選ぶ際に、 相対的に散在のペナルティが小さいものが選ばれる。 具体的なペナルティの計算方法はいろいろ考えられる。現在の版の SecSel で は2 つの方法が実装されている。 ひとつは保護区の外周の合計に注目するもの(BOUNDARY_LEN)。サイト同士が 隣接すれば、保護区全体の外周長の合計= ペナルティは小さくなる。 もうひとつは追加するサイトともっとも近い既選択サイトへの距離(DISTANCE_TO_ NEAREST )に注目する方法。この値が大きいほど、離れたところにサイトを加え ることになり、散在のペナルティが大きくなる。この方法は、池や植生の断片な ど、サイト同士が不連続に分布している場合にも適用可能であることがメリット である。 これらの方法を使用するには、パラメータファイルで scatter_penalty_algorithm に BOUNDARY_LEN ないし DISTANCE_TO_NEAREST を設定する。また、散在度合 いを計算するために必要なデータファイルのファイル名を scatter_penalty_file に設定する。 ここで指定するファイルの内容は、ペナルティ計算方法による。 BOUNDARY_LEN (外周長)の場合 各行に、ふたつのサイト名と、そのあいだで共有する境界の長さをタブ区切り で並べる。最初の1 行はヘッダ行。 ※サンプルファイル:foo_border.txt このファイルでは、サイト名のはじめの3 桁がx 座標、続く3 桁がy 座標と解 釈して四角形の1 辺を共有する隣接サイトのペアを列記し、1 辺の長さは1 で あるとしている。 DISTANCE_TO_NEAREST(最近接サイトへの距離)の場合 各行に、サイト名、x 座標、y 座標をタブ区切りで並べる。 最初の1行はヘッダ行。 ※サンプルファイル:foo_xy.txt foo_border.txt と同様、サイト名のはじめの3 桁が x座標、続く3桁が y座 標と解釈して作成されている。 【排他的な要素の衝突の解決】 ひとつのサイト内で、同時に保全・利用することができない要素がある場合、 これらをconflict の関係にあると呼ぶ。森林性の生物の保全と農地としての 利用であるとか、貧栄養の池を好む植物と不栄養の池を好む植物の保全などが 考えられる例である。こうした関係にある要素のlocal unit がひとつのサイ ト内にある場合、保護区選択を開始するまえに、どちらの要素 のlocal unit を優先するかを決める。 この決定は、どちらのlocal unitのほうが、そのfeature の保全目標の達成へ の潜在的貢献度が大きいかによる。各要素のなかで、そのlocal unit 相対的 に高価値であるほど、貢献度は大きいと考えられるほか、保全目標が大きいほ ど多くのlocal unit が必要とされるので、feature 内での順位が同じであっ ても貢献度は大きくなる。また、同じ価値のunit が多数あれば、それだけ代 替 unit が多いので潜在的貢献度は小さくなる。 パラメータファイルで、要素間の conflict の関係を記録したファイルの名前を conflict_file に設定すると、SecSel はこれを読み込んでconflict 関係の解決 を行う。 ファイルは連続する2 行が1 組で、何組あってもよい。各組のなかの1 行目の 要素群と、2 行目の要素群とがconflict の関係にある。各行には要素名がタ ブ区切りで並ぶ。空白行は無視される。2 行のペアのあと次の2 行のペアとの あいだに空白行を入れると人間が見て読みやすい。ヘッダ行はない。 ※サンプルファイル:foo_conflicts.txt 【詳細情報の出力】 選択の結果の出力は、パラメータファイルのふたつのパラメータで制御する。 複数回の試行を行う(n_run に2以上の値が設定されている)場合、 save_each_run に0 が設定されると各試行の結果はファイルに出力されず、集 計結果のみが出力される。なにも設定しないと 1 が設定されたとみなし、各 試行結果がそれぞれ別のファイルに出力される。 出力ファイルの内容は、result_file_format で指定する。このパラメータに 設定可能な値は、'SITE', 'SITE_COST', 'FULL' の3 つのうちのどれかひとつ である。 ・試行ごとの結果ファイル 試行ごとの結果ファイルのファイル名は、output_file_base に設定した文字列 に "_NNN_PA.txt" を付加したもの。NNNは試行の通し番号である。 試行結果ファイルでは、ヘッダ行に続いて、選ばれた順に1行ごとに1サイト の情報が記録される。 result_file_format に上記3 つのどれを指定しても、各行にはまず選ばれたサ イトの名前、次に選ばれた順番(1から。事前保全サイトがある場合はそれら の順番は0)が出力される。 形式指定が SITE_COST ないし FULL の場合、上記に続いてそのサイトまでの 積算コストが出力される。コストのデータがない場合には0 となる。 形式指定が FULL の場合はさらに続いて、そのサイトがどの要素の目的達成の ために選択されたのかの情報(1 ならその要素のため、0 なら非該当)が全要 素数だけ並ぶ。SecSel がサイトを逐次選択していく際には、どのサイトを保 護区に加えるとどの要素がどれだけ保全目標達成に近づくかを評価しながら、 選択するサイトを決める。したがって、選ばれたどのサイトについても、選択 時にどの要素の保全への貢献を評価したかが明らかである。 上記に続き、さらにそのサイト内での各要素のlocal unit の評価値が並ぶ。 データファイルから読み込んだそのままの情報が出力されるが、要素間でconflict があり、そのサイトではその要素の保全・利用は行わない場合とされた場合は-99 と出力される。 ・集計ファイル 集計ファイルのファイル名は、output_file_base に設定した文字列に "_sum.txt" を付加したもの。 result_file_formatの設定に関わらず、ヘッダ行に続いて、選択回数の降順で 1行に1 サイトの情報が出力される。サイト名に続き、そのサイトが複数回の試 行のなかで回数が出力される。 result_file_formatにFULLを設定した場合、このサイトが、各feature の保全 目的達成のために選ばれた回数が続けて出力される。 【そのほかの設定】 パラメータファイル中では、さらに以下のパラメータが設定できる。 [pre_reserved_sites_file] あらかじめ保護対象に含めるサイトの情報を記録したファイル名。1 行ごとに にひとつサイト名が書かれたテキストファイル最初の1 行はヘッダ行。 ※サンプルファイル:foo_pre_reserved.txt [max_upset] サイト選択時に、保全目標達成への貢献度合いが最大ではなくともコスト・散 在ペナルティが小さいサイトを逆転で選択する場合、効果最大のサイトから順 位がどこまで落ちるサイトも選択可とするかを設定できる。コストデータと散 在ペナルティの計算方法のすくなくともどちらか一方を設定した場合にのみ効 果を持つ。 この値が大きいほどコストや散在ペナルティを重視して保護区を設計すること になる。0 に設定すれば逆転はない(デフォルト設定)。 [consider_cost_first] 1 を設定すると、分散ペナルティよりコストを優先してサイトを選ぶ。デフォ ルト(0) では分散ペナルティ優先する。このパラメータは、コストデータと散 在ペナルティの計算方法を両方とも設定した場合にのみ効果がある。 【Pythonスクリプト中でのSecSelのインポートと実行】 パッケージ secsel のインストールが終了したら、Pythonのスクリプト中で インポートして利用できる。まず、SecSelを利用するスクリプト(プログラム) のはじめに from secsel import SecSel と書いてインポートSecSelクラスをインポートする。secsel はモジュール名、 SecSel は secsel モジュール内で定義されているクラスの名前である。Python スクリプト中で SecSel() と書けば、SecSelクラスのオブジェクトが生成される。 そのあとのスクリプト中でたとえば s = SecSel() とすれば SecSel のオブジェクトが生成され、変数名 s でアクセスできる。 スクリプトの例は、実行テストに使ったrun_secsel_example.pyを参照のこと。 ユーザが使用するSecSelオブジェクトのメソッド(関数)は以下の通り。 # run() の実行前に利用するメソッド load_parameter_file(self, file_name) 指定された名前のパラメータファイルを読み込む。 set_parameter(self, parameter_name, parameter_value) 指定された名前のパラメータに値を設定する。すでに値が設定されている場合、 その値を上書きする。 # サイト選択を実行するメソッド run(self) 読み込んだパラメターファイルの内容および設定されたパラメータに従い、 サイト選択を実行する。選択結果は設定に従ってファイルに出力される。 run() は、ひとつのSecSelオブジェクトにつき一回しか呼び出せない。一度 run()を実行したオブジェクトに対し2回めのrun() を実行させようとすると エラーが発生する。 # run() の実行後に利用するメソッド get_list_of_lists_of_selected_sites(self) 一回の試行で選択されたサイト名のリストが、試行回数だけ並んだリスト(入 れ子になったリスト)を返す。 get_list_of_costs(self) 各回の試行で選択されたサイト群の総コストが、試行回数だけ並んだリストを 返す。 # そのほかのメソッド get_parameter(self, parameter_name) メソッド呼び出し時点でのパラメータの値を返す。パラメータファイルから読 み込んだ設定値をスクリプト中で取得するために使う。 get_file_name_for_a_run(self, i_run) 指定した試行の結果を保存するファイルの名前を返す。 get_summary_file_name(self) 複数回の試行の集計結果を保存するファイルの名前を返す。 ・スクリプト中での動的なパラメータ設定 パラメータファイルで指定できるパラメータは、すべて set_parameter()を使 って設定ないし変更できる。たとえば、読み込むデータは同じままで保全目標 (default_top_n) を自動的に何通りかに変えながら保護区の選択を行うといっ たことが可能である。それぞれの設定ごとにパラメータファイルを用意する必 要がなく便利である。 コード例は、run_secsel_multi_settings.py を参照のこと。 ・スクリプト中での選択結果の解析 get_list_of_lists_of_selected_sites()、get_list_of_costs() により SecSel オブジェクトから選択結果を取得することができる。ただしこの方法で 取得できるのは選択されたサイト名および総コストのみである。 個々のサイトがどの要素の保全のために選ばれたかなどの詳細情報を得るには result_file_format に FULL を設定して作成した出力ファイルを読む必要が ある。出力ファイルの名前はget_file_name_for_a_run()、 get_summary_file_name() で取得できる。