Чтобы использовать A *, вам сначала потребуется допустимая эвристическая функция .[объяснение того, что это в конце этого ответа].
Задача в виде графика для A: *
определить G = (V, E) как ваш график,так что:
V={all possible drawings prefixes}
[т.е. все возможные «снимки» каждого возможного розыгрыша].обратите внимание, что вы не должны хранить этот график в памяти, но создайте его на лету с next()
, что будет объяснено позже.[обратите внимание, что практически для каждого состояния вам нужно хранить только (1) где находится ручка в данный момент (2) какие линии уже нарисованы]
E={all possible changes from one 'snap shot' to another}
Вам также необходимо w:E->R
[функция веса] это будет просто: w(point1,point2)=euclidian_distance(point1,point2)
Вы также должны определить next:V->P(V)
: next(v)={all snap shots you can get from v, using exactly one move/draw
Наконец, вы также должны определить F
: все "конечные" состояния.F={all the prefixes which all the lines are drawn}
Как запустить A *:
начать со снимка, где ваше перо находится в точке (0,0), и линии не нарисованы [это начальное состояние] и продолжайте, пока не найдете одно из последних состояний.если да, если ваша эвристика верна, вы гарантированно получите оптимизированное решение, потому что A * является допустимым и оптимизированным
(*) допустимой эвристической функцией:
let h*(v)=real distance to target
из вершины v.
эвристическая функция h: V-> R допустима, если h(v)<=h*(v)
для каждого v в V
Ваш реальный вызов
Трудная часть для TSP находит допустимое значение h
.Это так сложно, потому что вы понятия не имеете, что такое кратчайший путь, и если эвристическая функция недопустима, то не гарантируется, что найденное решение будет оптимизировано.
Предложение:
Возможно, вы захотите использовать какой-нибудь алгоритм в любое время . Когда я сделал нечто подобное, [решил TSP с несколькими агентами], я также использовал A *, но начал с недопустимой эвристики, и итеративноуменьшил его, поэтому, если у меня было достаточно времени, я нашел оптимальное решение, а если нет - вернул лучшее решение, которое смог найти.