Просмотр полной версии : Волновой алгоритм
[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
ну извините.
не хотите объяснять, не хотим помогать.
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
так надо штоль?
Во, во. Самое оно.
У уже есть реализованный волновой алгоритм, но когда я его тестил нашел слишком много ситуаций, которые ставят его в тупик (особенно с ограниченными полями). Если что, то могу переслать... А вообще зачем он тебе нужен??? По моему 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
ошибка, по-моему, не в коде, в самой идее.
у тебя есть массив, отражающий поле с весами клеток.
тебе нужно создать еще один массив той же размерности, чтобы в нём проставлять номера шагов при посещении клеток.
а так получает, у тебя исходный массив и в нём же ты химичишь...
волновой алгоритм потому так и называется - что там 2 волны, одна проходит по определенному массиву клеток и раздает им веса - равные текущей итерации - а вторая собирает из этих клеток следующий массив для прохождения первой волной и так далее.
Nox Noctis
13.02.2006, 01:24
насколько я себе это представляю, "волна" - одна.
на первом этапе всем клеткам присваиваются номера (за сколько шагов можно дойти от начальной точки до данной), а как только достигаем конечну точку - идем обратно, выбирая всегда намиеньшие веса клеток. но второе - уже не волна.
ты все правильно представляешь
под двумя волнами я имел в виду как раз процесс присваивания клеткам номеров -для того, чтоб не уйти в бесконечность итераций, мы используем 2 массива на каждом витке цикла заполняя массив B клетками, в которые можно попасть из клеток массива A (и вес которых не превышает счетчик итераций - иначе мы будем бесконечно скакать между двумя клетками)- и начиная следующий виток очиcтив массив A и заполнив его клетками массива B
[G@ng$t@]Un1t
13.02.2006, 18:38
Спасибо исправляюсь. :rolleyes:
волновой алгоритм потому так и называется - что там 2 волны, одна проходит по определенному массиву клеток и раздает им веса - равные текущей итерации - а вторая собирает из этих клеток следующий массив для прохождения первой волной и так далее.
На самом деле количество волн зивисит от размерности массива :D
да, но гребня у этих волн - всегда 2. можем еще на паре страниц топика это пообсуждать, в принципе
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.