Avoid overestimating the cost in AStar heuristics.
This is a necessary condition for finding optimal solutions. This is achieved by simply requiring/ensuring that no weights are smaller than 1. Fixes #8584.
This commit is contained in:
parent
5b3709d309
commit
e4eb093c62
2 changed files with 2 additions and 1 deletions
|
@ -43,6 +43,7 @@ int AStar::get_available_point_id() const {
|
||||||
|
|
||||||
void AStar::add_point(int p_id, const Vector3 &p_pos, real_t p_weight_scale) {
|
void AStar::add_point(int p_id, const Vector3 &p_pos, real_t p_weight_scale) {
|
||||||
ERR_FAIL_COND(p_id < 0);
|
ERR_FAIL_COND(p_id < 0);
|
||||||
|
ERR_FAIL_COND(p_weight_scale < 1);
|
||||||
if (!points.has(p_id)) {
|
if (!points.has(p_id)) {
|
||||||
Point *pt = memnew(Point);
|
Point *pt = memnew(Point);
|
||||||
pt->id = p_id;
|
pt->id = p_id;
|
||||||
|
@ -221,7 +222,6 @@ bool AStar::_solve(Point *begin_point, Point *end_point) {
|
||||||
|
|
||||||
real_t cost = p->distance;
|
real_t cost = p->distance;
|
||||||
cost += _estimate_cost(p->id, end_point->id);
|
cost += _estimate_cost(p->id, end_point->id);
|
||||||
cost *= p->weight_scale;
|
|
||||||
|
|
||||||
if (cost < least_cost) {
|
if (cost < least_cost) {
|
||||||
|
|
||||||
|
|
|
@ -1991,6 +1991,7 @@
|
||||||
<argument index="1" name="pos" type="Vector3">
|
<argument index="1" name="pos" type="Vector3">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="2" name="weight_scale" type="float" default="1">
|
<argument index="2" name="weight_scale" type="float" default="1">
|
||||||
|
Weight scale has to be 1 or larger.
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
</description>
|
</description>
|
||||||
|
|
Loading…
Reference in a new issue