Проблемы с MinHeaps

Я пытаюсь разработать собственный путь для игры, которую я создаю. Он использует новые 2D коллайдеры, поэтому я не могу использовать встроенные в navmesh единицы. Поэтому вместо того, чтобы использовать актив, созданный кем-то другим, я подумал, что мне нужно сделать собственную реализацию.

Я искал кучу вещей о поиске пути и A*, которые у меня нет проблем с пониманием. Где у меня проблемы, хотя это MinHeap. Я никогда не изучал сдвиги в битах и ​​тому подобное, поэтому я изменил некоторый код, который нашел в руководстве, в соответствии со своими потребностями.

Проблема, с которой я столкнулся, заключается в том, что, как я могу сказать из своей отладки, неправильно сортируется узлы по стоимости. Из того, что я вижу, и я опубликую рисунок ниже, чтобы вы знали, о чем я говорю, каждый узел, который добавляется в открытый список, остается там, где он добавлен, так что это больше похоже на поиск Дейкстры, чем на A * один.

Может ли кто-нибудь взглянуть на код и сказать мне, если я делаю что-то очень неправильно... потому что это сводит меня с ума.

Это код:

using System;

public class NodeList<T> where T : IComparable<T>
{        
    private int count;
    private int capacity;
    private T temp;
    private T mheap;
    private T[] array;
    private T[] tempArray;

    public int Count
    {
        get { return this.count; }
    }

    public NodeList() : this(16) { }

    public NodeList(int capacity)
    {
        this.count = 0;
        this.capacity = capacity;
        array = new T[capacity];
    }

    public void BuildHead()
    {
        int position;
        for (position = (this.count - 1) >> 1; position >= 0; position--)
        {
            this.MinHeapify(position);
        }
    }

    public void Add(T item)
    {            
        this.count++;
        if (this.count > this.capacity)
        {
            DoubleArray();
        }
        this.array[this.count - 1] = item;
        int position = this.count - 1;

        int parentPosition = ((position - 1) >> 1);

        while (position > 0 && array[parentPosition].CompareTo(array[position]) > 0)    
        {
            temp = this.array[position];
            this.array[position] = this.array[parentPosition];
            this.array[parentPosition] = temp;
            position = parentPosition;
            parentPosition = ((position - 1) >> 1);
        }
    }            

    private void DoubleArray()
    {
        this.capacity <<= 1;
        tempArray = new T[this.capacity];
        CopyArray(this.array, tempArray);
        this.array = tempArray;
    }

    private static void CopyArray(T[] source, T[] destination)
    {
        int index;
        for (index = 0; index < source.Length; index++)
        {
            destination[index] = source[index];
        }
    }

    public T Peek()
    {
        if (this.count == 0)
        {
            throw new InvalidOperationException("Heap is empty");
        }
        return this.array[0];
    }


    public T ExtractFirst()
    {
        if (this.count == 0)
        {
            throw new InvalidOperationException("Heap is empty");
        }
        temp = this.array[0];            
        this.array[0] = this.array[this.count - 1];
        this.count--;
        this.MinHeapify(0);
        return temp;
    }

    private void MinHeapify(int position)
    {
        do
        {
            int left = ((position << 1) + 1);
            int right = left + 1;
            int minPosition;

            if (left < count && array[left].CompareTo(array[position]) < 0)
            {
                minPosition = left;
            }
            else
            {
                minPosition = position;
            }

            if (right < count && array[right].CompareTo(array[minPosition]) < 0)    
            {
                minPosition = right;
            }

            if (minPosition != position)
            {
                mheap = this.array[position];
                this.array[position] = this.array[minPosition];
                this.array[minPosition] = mheap;
                position = minPosition;
            }
            else
            {
                return;
            }

        } while (true);
    }
}

Мой путь ищет от конечной точки до начала (от того, где игрок нажимает на игрока), поэтому "Начальная точка" - это серый узел в середине экрана: проблема с поиском пути

Вот почему это проблема: выпуск 2

0 ответов

Другие вопросы по тегам