Я пытаюсь реализовать программу из 8 головоломок с использованием эвристики Манхэттена с использованием ООП в Matlab, где каждый узел представлен объектом «состояние».Тем не менее, я потерял из-за проблем со скоростью реализации массива объектов для очереди.После большого количества проб и ошибок это самое быстрое, что я мог сделать (я ненавижу использовать глобальные объекты, но кажется, что любые попытки передать массив или использовать объект для него сильно замедляют его):
.classdef state < handle
. properties
. position; %3x3 array
. moves;
. blank;
. parent;
. prevmove;
. mdist;
. end
....
очередь предварительно выделена
queue = repmat(state,1,5000);
.function newfront = q(item,front)
.global queue;
.if isempty(front)
. newfront = 1;
. queue(1) = item;
.else
. for i = front:-1:0
. if i == 0
. break;
. end
. a = item.mdist;
. b = queue(i).mdist;
. if (a < b)
. break;
. else
. queue(i+1) = queue(i);
. end
. end
. newfront = front + 1;
. queue(i+1) = item;
.end
.end
Использование профилировщика MATLAB:
eightpuzzle 1 67.941 s 2.550 s
eightpuzzle>q 4722 59.657 s 59.657 s
....
118 queue(i+1) = queue(i); 2583916 29.064 s 48.7%
120 end 2583916 16.202 s 27.2%
114 b = queue(i).mdist; 2587318 4.357 s 7.3%
113 a = item.mdist; 2587318 2.783 s 4.7%
115 if (a < b) 2587318 2.721 s 4.6%
есть ли способ заставить его работать быстрее?Интересно отметить, что при использовании
a = item.mdist;
b = queue(i).mdist;
if (a < b)
...
вместо
if (item.mdist < queue(i).mdist)
общее время выполнения уже сократилось вдвое.
Спасибо!