.................... .................@.. ......@............. ..........#......... ..........#......... @: predator ..........#......... *: prey ..........#......*.. .: free grid ..........#......... #: obstacle grid ..........#......... ..........#......... .................... ..@................. .................... .............@...... .................... ....................
捕食者と獲物は1クロック後に現在自分がいる格子の上下左右 の隣接自由格子に移動することができる(斜め方向には動けない).移動せずに 同じ格子にとどまっていることも許される.さらに,捕食者と獲物は,障害物 の置いてある格子や格子世界の外へは移動できない.また,一つのゲームの開 始から終了までの間,障害物は移動しないものとする.
このゲームでは,任意の初期状態(捕食者,獲物,そして複数の障害物の初期 位置により規定される)からスタートし,あるクロックにおいて獲物が動けな いように捕食者が上下左右の近傍グリッドを占有したら獲物が捕獲されたと解 釈して終了する(ただし,獲物が境界グリッドにいる場合は例外規定があり, それについては以下の説明で説明する). また,捕食者と獲物の最初の位置や障害物の数や位置は初期状態により変化す る.初期状態はデータファイルにより規定される.
また, また,捕食者と獲物のいずれも,プログラム起動時に引数として与えられた 範囲(これを視界と呼ぶ)しか見えないものとする. (ディフォ ルトでは,各エージェントのいるグリッドを中心とした近傍の25個の正方形状 に配列されたグリッドだけが見えるものとする.これを上下左右2グリッドの 視界と呼ぶことにする.下図参照)
..... ..... ..@.. ..... .....二人以上のエージェントが同一グリッドに入ることはできない.ある時点から 次の時点で,もしも捕食者と獲物がそれぞれが現在いるグリッドとは別の 同一グリッドに移動するよう決定した場合は捕食者の動作を優先する.ただし, いずれかのエージェントが「動かない」という決定をした場合は,そのエージェ ントを優先することとする.
また,あるクロックである捕食者と獲物が隣接グリッドにいた場合,次のクロッ クに互いにそのグリッドの場所を入れ換えわるような動作,つまり途中ですれ 違うことはないものとする.
つまり,例えば,以下の(A)の状態から, 次のクロック時に(B)の状態になることはないものとする.2つのエージェント が上下の位置にいても同様とする...... ..... ..... ..... (A) .@*.. (B) .*@.. ..... ..... ..... .....さらに,二人以上の捕食者が現在いるグリッドと異なる別の同一グリッドに入 ろうとした場合は,いずれかの捕食者を優先する(どの捕食者が優先されても 構わない).
獲物は,上下左右のグリッドを捕食者に占有されるか,もしくは,境界グリッ ドにいる場合は近傍の残りのグリッドを捕食者に占有されて動けなくなったら 捕獲されたこととする.以下に例をしめす.
..... ..... ..... ..@.. ....@ ..... .@*@. ...@* ..... ..@.. ....@ ....@ ..... ..... ...@*
捕食者も獲物も互いに相手がどういう戦略で動くかは不明である.初期状態か らはじめて,捕食者は,可能な限り少ないクロックで獲物をとらえることが要 求される.逆に,獲物は可能な限り長い間逃げまわることが要求される.
レポートには,タイトル,クラス名,学籍番号,氏名,目次をつ けること.レポート本体には,プログラムの概要,個々の関数の概要と詳細, アルゴリズム上で工夫した点やそれに関する考察などが必要である.特に今回 のラボの場合,捕食者間の通信や協調の方法については詳しく記述すること.
さらに,レポートの最後にはソースコードを資料として添付すること.
作成したすべてのソースコードとオブジェクトは ginga01.fun.ac.jpマシン上 の
"/export/home/Fun/DCS/2023/lab/3/<学籍番号>/"
ディレクトリの下にコピーしておくこと.ソースコードとオブジェクトのアク
セス許可モードはそれぞれ644 (-rw-r--r--),755(-rwxr-xr-x)とする.
ソースコードは上記の諸注意項目5で指定されたディレクトリに "pursuit.c", "predator.c",そして"prey.c"という名前のファイルとして 置いておくこと.各ファイルの内容物は以下で規定されるが,"predator.c"ファ イルには以下の Predator関数, そして,"prey.c"ファイルには以下のPrey関 数を必ずいれておくこと.必要に応じてそれらのファイル内に他の関数を含ん でも構わないが,関数名に関しては以下のコンパイルに関する注意をよく読ん で,その指示に従うこと.
また,各プログラムには,以下のようなコピーライトをつけ,また,各関数は 先頭でそれが何であるかを説明し,プログラムには十分にコメントをつけるこ と.
/* Author: Itoh Keisuke Student ID: m1200XXX Class: F Created: October 20, 2003 Language: C Function: swap(char *S, char *T) Description: swap string S with string T. */なお,"pursuit.c"は以下のディレクトリにあるものを利用する.
ginga01.fun.ac.jp:/export/home/Fun/DCS/2023/resource/3/pursuit.c
上記のプログラムの特徴は以下である.
提出の遅延は認められない.
プログラムを作成するに当り,以下の各仕様を守ること.
main関数の中では,各クロックにおい てすべての捕食者と獲物の次の動作を 得て,格子世界を更新し,表示する.ゲームが終了したら,以下のmain関数の 規定で与えられた仕様の通りのメッセージを出力してプログラムを終了する.
pursuit.cファイルには他に,(1)ファイルから格子世界の初期状態をデータと して読み込む関数,(2)各クロックにおいてPredator関数お よびPrey関数を呼び出して両者の次の動作を得た後にクロックが一つ進ん だとして世界の状態を更新する関数,(3)ゲームの終了を 判定する関数,そして,(4)現在のクロック数と格子世界を 表示する関数などが含まれている.
格子世界は整数型の16×16の二次元配列として実装する. 各配列の値は整数で,自由格子の場合は"0",障害物は"-1", 捕食者は"1", "2","3",および"4",獲物は"10"と規定する.各エージェントに対する 視界外のグリッドは"-10"とする.また,クロックは初期値が整数の0で, 1クロック毎にインクリメントされること.
% gcc pursuit.c predator.c prey.c -lpthread -lstdc++
% gcc pursuit.c predator.c prey.o -lpthread -lstdc++
例えば predator.c の中で,"count"という関数を定義したい場合は名前を "predator_count" などとすること.外部変数や広域的な型定義の場合も同様 に先頭に "predator"をつけた名前とすること.
同様に,prey.c ファイルの場合は,Prey関数以外の全ての関数,外部変数, および広域な型定義には,必ず"prey"を名前の先頭につけること.
ファイル間にまたがる関数に関しては,pursuit.c ファイル内のプログラムか ら,predator.c ファイルの Predator関数,そして prey.cファイル内のPrey 関数を呼び出すだけであり,それ以外の異なるファイルにまたがる関数呼出し は禁止する.これを守らないとコンパイル時にエラーとなる.
同一ファイル内では,関数呼出しは自由に行ってよい.例えば,predator.c ファイルで Predator関数を定義することが要求されているが,Predator関数 はこのファイル内部で定義された他の関数(先の注意にあるように,名前は "predatorFoo"のように"predator"で始まるものに限る)を呼出してもよい. prey.cファイルに関しても同様である.