PDA

Просмотр полной версии : Волновой алгоритм


[G@ng$t@]Un1t
10.02.2006, 21:04
В этом коде я пытался реализовать волновой алгоритм в двумерном массиве (5x5) но доходя до определенного момента момента "эффект волны" перестает действовать. Не могли бы вы сказать в чем ошибка или подкинуть новые идеи ?

N=1;
var mas:Array=new Array;
for(i=0;i<5;i++){
mas[i]=new Array;
for(j=0;j<5;j++){
mas[i][j]=1;
}
}
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(mas[i][j]==N){
if(mas[i+1][j]==1){
mas[i+1][j]=N+1;
}
if(mas[i][j+1]==1){
mas[i][j+1]=N+1;
}
N+=1;
}
}
}

KidsKilla
10.02.2006, 21:11
1) неверно:
var mas:Array=new Array;
правильно:
var mas:Array=new Array();

2) неверно:
var mas[i]:Array=new Array;
правильно:
var mas[i]:Array=new Array();

KidsKilla
10.02.2006, 21:15
а вообще ты чо получить-то хочешь?

[G@ng$t@]Un1t
10.02.2006, 21:16
Так дело ведь не в этом, я всегда так создаю массивы и все работает.

[G@ng$t@]Un1t
10.02.2006, 21:21
а вообще ты чо получить-то хочешь?
Хочу с делать "волну" от mas[0][0]. Если не знаешь что такое волновой алгоритм объяснить трудно.

KidsKilla
10.02.2006, 21:22
ну извините.
не хотите объяснять, не хотим помогать.

Antares
10.02.2006, 21:25
Un1t']я всегда так создаю массивы и все работает.
Ниче-ниче. В АС3 грязный код ты просто не скомпилируешь.

[G@ng$t@]Un1t
10.02.2006, 21:36
ну извините.
не хотите объяснять, не хотим помогать.
Ну ладно, ладно. Постараюсь объяснить. Вот mas[0][0](значение-1), проверяем свободные "клеточки" по бокам(в данном случае справа и снизу) если они равны к примеру 1 ,тогда прибавляем к ним значение проверяемой клеточки+1. Тогда mas[0][1]=2, и mas[1][0]=2 и так каждый проверять каждый элемент массива. Вот тебе для понятности исходник(не работаюший).

KidsKilla
10.02.2006, 21:41
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
4 5 6 7 8 9
5 6 7 8 9 10


так надо штоль?

[G@ng$t@]Un1t
10.02.2006, 21:47
так надо штоль?
Во, во. Самое оно.

][azar
10.02.2006, 23:53
У уже есть реализованный волновой алгоритм, но когда я его тестил нашел слишком много ситуаций, которые ставят его в тупик (особенно с ограниченными полями). Если что, то могу переслать... А вообще зачем он тебе нужен??? По моему A* и D* гораздо лучше....

Nox Noctis
11.02.2006, 00:16
[azar']У уже есть реализованный волновой алгоритм, но когда я его тестил нашел слишком много ситуаций, которые ставят его в тупик
значит это неправильно реализованный волновой алгоритм :)
вообще-то волну ничто поставить в тупик не может.
просто это самый ресурсоёмкий алгоритм. зато всегда проходит.

а вот А* поставить в тупик можно.
как и любой эвристический алгоритм.
тут уже зависит от качества эвристики :)

[G@ng$t@]Un1t
11.02.2006, 21:37
1)Вы не можете сказать в чем ошибка в моем коде.
2)][azar если можешь вышли мне на e-mail - g.unit91@mail.ru.

Nox Noctis
12.02.2006, 21:48
ошибка, по-моему, не в коде, в самой идее.

у тебя есть массив, отражающий поле с весами клеток.
тебе нужно создать еще один массив той же размерности, чтобы в нём проставлять номера шагов при посещении клеток.

а так получает, у тебя исходный массив и в нём же ты химичишь...

Король
12.02.2006, 22:46
волновой алгоритм потому так и называется - что там 2 волны, одна проходит по определенному массиву клеток и раздает им веса - равные текущей итерации - а вторая собирает из этих клеток следующий массив для прохождения первой волной и так далее.

Nox Noctis
13.02.2006, 01:24
насколько я себе это представляю, "волна" - одна.

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

Король
13.02.2006, 01:42
ты все правильно представляешь
под двумя волнами я имел в виду как раз процесс присваивания клеткам номеров -для того, чтоб не уйти в бесконечность итераций, мы используем 2 массива на каждом витке цикла заполняя массив B клетками, в которые можно попасть из клеток массива A (и вес которых не превышает счетчик итераций - иначе мы будем бесконечно скакать между двумя клетками)- и начиная следующий виток очиcтив массив A и заполнив его клетками массива B

[G@ng$t@]Un1t
13.02.2006, 18:38
Спасибо исправляюсь. :rolleyes:

cassius
14.02.2006, 05:41
волновой алгоритм потому так и называется - что там 2 волны, одна проходит по определенному массиву клеток и раздает им веса - равные текущей итерации - а вторая собирает из этих клеток следующий массив для прохождения первой волной и так далее.

На самом деле количество волн зивисит от размерности массива :D

Король
14.02.2006, 07:13
да, но гребня у этих волн - всегда 2. можем еще на паре страниц топика это пообсуждать, в принципе