■ はじめに

前回、A*とエージェントのフォーマットの違いを埋めて、A*ルートをエージェントが辿れるようにしました。

これに、人追加と人を躱すアルゴリズムを考えるのが今回の必須事項です。

とりあえず、人追加のコードを描いてみて、問題が無ければ人を躱すアルゴリズムを考えます。



■ 人を追加するアルゴリズム

今回の人追加のアルゴリズムは、

① 人は歩道と横断歩道に発生します。

② 受・A・B・Cに発生しないはずですが、ここの入口に立たれると、配送できなくなるので、ここは禁止します。

③ 人が並んで通せんぼすると、通れないモード(斜めに並ぶ)があるのでこれも禁止

②と③は、マンハッタン距離2以内を発生禁止する事で1つにできます。

*マンハッタン距離のChatGPTさん説明
「マンハッタン距離とは縦と横しかない世界での移動量を示します」

なので、斜めはルート2ではなく2になりますね。

だから「マンハッタン距離2以内は禁止」になります。

■次に人を避けるアルゴリズム

人回避アルゴリズムは結構ハマるポイントでした。

はじめは、左右のコスト比較でなんとかしようとしてChatGPTさんにコーディングして貰いました。

これを今回の進捗で使いたかったのですが、とうして取れないバグを発見してしまいました。

そのバグは、例えば「北向きに進んで、建物前に人がいる」といういかにもありそうなパターンで起こりました。

バグを避けるには、左右のコスト比較を大量にやらねばならず、仕様的にもコード的にも良くありません。

仕方がないので、自分アルゴリズムは止めて、A*に頼るかたちで、はじめから考えなおして、仕様を書き直しました。

但し、◯を進入不可にすると最初からA*が避けてしまうので少しだけ工夫しました。

◆#①◆◆◆◆◆◆◆◆◆◆#①◆
◆##◆◆◆◆◆◆◆◆◆◆◯#◆◯が…
◆#◯◆◆◆◆◆◆◆◆◆◆▲#◆
◆①#◆◆◆◆◆◆◆◆◆◆①#◆
       ↓
◆#①◆◆◆◆◆◆◆◆◆◆#①◆
◆##◆◆◆◆◆◆◆◆◆◆◎#◆◎に変わる
◆#◯◆◆◆◆◆◆◆◆◆◆▲#◆
◆①#◆◆◆◆◆◆◆◆◆◆①#◆

これで、見つけた人だけ避けるようになります。

ついでに、
・エージェント北向きと道のキャラクタが「▲」で
 一緒なので変えたい
・地図データをどう扱うか

等々「なんか怪しい」と思う部分も書き直しました。

■ブログあるある。「公開日にバグ発見」

実は、このブログ本当だったら、もっと早く公開するはずでした。しかし、よりにも寄って公開日にバグを発見してしまいました。

しかもかなり難易度の高いバグで、一時は、

「公開を辞めようかな」

と思ったほどです。

今のコードで、バグはないはずですが見つけたら教えてください。

■結果:

仕様はこうなりました。

アルゴリズム手直しのGithubリンgithub.com/logicmaker256-prog/A-_avoid_human/blob/main/new_doc2.txt

この仕様をChatGPTさんに渡してコーディングして貰いました。仕様がしっかりしてるとエラーも無いような…一発OKでした。

人配置と回避の確認コード
github.com/logicmaker256-prog/A-_avoid_human/blob/main/avoid_human.py

→ ルート上に「人」がいても回避して、宅配が続くことを確認できます。

■ 今回の学び:

今回の学びは、ズバリ!

「一足とびにコーディングは危険、まずは最小コードで確認を!」

実体験ベースなので、間違えないですね。

経験しない方が良いですので、皆さんはちゃんとやってね。

■まとめ

なんとか人配置と回避まで終わりました。

1人ボケ1人ツッコミみたいで、自分が決めたルールに振り回されています。

これがやりたいことと、その仕様を両方やるって事なんですかね。

のこりは、信号の動作と学習部分ですがこの部分はまったく触っていません。

まだ、仕様で頭悩ます日が続くって事なんですかね。

最後に、同じように配送問題やMiniGridで沼っている方の参考になれば嬉しいです