回答編集履歴

1

GetNeighboursの「自分自身」の判定条件を修正、コスト計算時の隣接ノード移動コストをユークリッド距離に変更

2020/08/12 08:17

投稿

Bongo
Bongo

スコア10811

test CHANGED
@@ -1,4 +1,4 @@
1
- ご提示のコードを[Wikipediaの記事](https://ja.wikipedia.org/wiki/A*#%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E6%B5%81%E3%82%8C)と見比べてみたのですが、ご質問者さんの隣接ノードのコスト計算やオープンリストへの追加ルールに疑問を感じ、``Pathfinding`と`GetNeighbours`を下記のように改変してみました。これならどうでしょうか?
1
+ ご提示のコードを[Wikipediaの記事](https://ja.wikipedia.org/wiki/A*#%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E6%B5%81%E3%82%8C)と見比べてみたのですが、ご質問者さんの隣接ノードのコスト計算やオープンリストへの追加ルールに疑問を感じ、`Pathfinding`と`GetNeighbours`を下記のように改変してみました。これならどうでしょうか?
2
2
 
3
3
 
4
4
 
@@ -10,8 +10,6 @@
10
10
 
11
11
  using System.Linq;
12
12
 
13
- using System.Runtime.ConstrainedExecution;
14
-
15
13
  using UnityEngine;
16
14
 
17
15
 
@@ -382,15 +380,19 @@
382
380
 
383
381
 
384
382
 
385
- // neighbourのHコスト、Fコストを求め....
383
+ // neighbourのHコスト、Fコストを求め...
386
384
 
387
385
  float neighbourH = GethCost(neighbour, goalNode);
388
386
 
389
- float neighbourF = n.gCost + 1 + neighbourH;
387
+ float neighbourF = n.gCost + Vector2.Distance(n.pos, neighbour.pos) + neighbourH;
388
+
389
+
390
+
390
-
391
+ bool openListContainsNeighbour = openList.Contains(neighbour);
392
+
391
-
393
+ bool closeListContainsNeighbour = closeList.Contains(neighbour);
392
-
394
+
393
- if ((!openList.Contains(neighbour) && !closeList.Contains(neighbour)) || (neighbourF < neighbour.fCost))
395
+ if ((!openListContainsNeighbour && !closeListContainsNeighbour) || (neighbourF < neighbour.fCost))
394
396
 
395
397
  {
396
398
 
@@ -408,9 +410,29 @@
408
410
 
409
411
  neighbour.parent = n;
410
412
 
413
+
414
+
415
+ // クローズリストにあったノードなら、リストから削除することでクローズを取り消して...
416
+
417
+ if (closeListContainsNeighbour)
418
+
419
+ {
420
+
411
- closeList.Remove(neighbour);
421
+ closeList.Remove(neighbour);
422
+
412
-
423
+ }
424
+
425
+
426
+
427
+ // オープンリストに未追加のノードなら、リストに追加して処理対象とする
428
+
429
+ if (!openListContainsNeighbour)
430
+
431
+ {
432
+
413
- openList.Add(neighbour);
433
+ openList.Add(neighbour);
434
+
435
+ }
414
436
 
415
437
  }
416
438
 
@@ -466,7 +488,7 @@
466
488
 
467
489
 
468
490
 
469
- this.parentList.Reverse();
491
+ parentList.Reverse();
470
492
 
471
493
  }
472
494
 
@@ -478,15 +500,19 @@
478
500
 
479
501
  List<Node> neighbours = new List<Node>();
480
502
 
503
+ int nx = (int)node.pos.x;
504
+
505
+ int ny = (int)node.pos.y;
506
+
481
- for (int i = (int)node.pos.x - 1; i <= (int)node.pos.x + 1; i++)
507
+ for (int i = nx - 1; i <= nx + 1; i++)
482
-
508
+
483
- {
509
+ {
484
-
510
+
485
- for (int j = (int)node.pos.y - 1; j <= (int)node.pos.y + 1; j++)
511
+ for (int j = ny - 1; j <= ny + 1; j++)
486
-
512
+
487
- {
513
+ {
488
-
514
+
489
- if (i == 0 && j == 0)
515
+ if (i == nx && j == ny)
490
516
 
491
517
  {
492
518