■ はじめに
前回、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で沼っている方の参考になれば嬉しいです
