Алгоритмы поиска опт. варианта

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
D8M
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.07.2005 (Ср) 12:45

Алгоритмы поиска опт. варианта

Сообщение D8M » 08.02.2006 (Ср) 23:36

Здраствуйте все!
Я учусь решать различные задачи на поиск опимального варианта.
Для примера взял задачу: есть поле n*m клеток в каждой клетке случайно число от 1 до 5.
За один ход мы можем пойти либо вправо либо вниз. Стартовая точка(1,1). Конечная точка(n,m).
Нужно найте такой вариант прохождения при котором мы наберем макс. кол-во очков, неважно за сколько ходов.
Вот мое решение:

Код: Выделить всё
Type findoneel
t As Integer
s As Integer
p As String
End Type

Type findonetmpel
x As Byte
y As Byte
s As Integer
p As String
End Type

Private s() As Byte

Public Sub findone(n As Byte, m As Byte)
ReDim s(n, m) As Byte
sgenerate n, m
Dim curV() As findonetmpel
Dim newV() As findonetmpel
Dim vars() As findoneel
Dim vC As Integer
Dim xC As Integer
Dim yC As Integer
Dim tC As Integer
Dim cC As Integer
Dim out As String
Dim bone As Integer

vC = 0
tC = 0

ReDim newV(1) As findonetmpel
newV(1).x = 1
newV(1).y = 1
newV(1).s = s(1, 1)

Do
ReDim curV(UBound(newV)) As findonetmpel
curV = newV
ReDim newV(1) As findonetmpel
cC = 0

For xC = 1 To UBound(curV)

    If curV(xC).x = n And curV(xC).y = m Then
        vC = vC + 1
        ReDim Preserve vars(vC) As findoneel
        vars(UBound(vars)).s = curV(xC).s
        vars(UBound(vars)).t = tC
        vars(UBound(vars)).p = curV(xC).p
    End If
   
    If curV(xC).x < n Then
        cC = cC + 1
        ReDim Preserve newV(cC) As findonetmpel
            newV(cC).x = curV(xC).x + 1
            newV(cC).y = curV(xC).y
            newV(cC).s = curV(xC).s + s(newV(cC).x, newV(cC).y)
            newV(cC).p = curV(xC).p & ">;"
    End If
   
    If curV(xC).y < m Then
        cC = cC + 1
        ReDim Preserve newV(cC) As findonetmpel
            newV(cC).x = curV(xC).x
            newV(cC).y = curV(xC).y + 1
            newV(cC).s = curV(xC).s + s(newV(cC).x, newV(cC).y)
            newV(cC).p = curV(xC).p & "\/;"
    End If
   
Next xC

tC = tC + 1
If cC = 0 Then Exit Do
Loop

bone = 1
For xC = 1 To UBound(vars)
    If vars(xC).s > vars(bone).s Then bone = xC
Next xC

End Sub


В результате получаем что vars(bone).s я вляется ответом. Работает гдето при m<9 и n<9.
Разумеется если проставить vC и cC пременные как Long то все буте работать и при ста, но только результат будет через столько-же лет. :D

А теперь мои вопросы:
1) Насколько плохо я написал алгоритм перебора всех значений? :wink:
2) Какие алгоритмы могут дать точно верное решение быстрее по времени вычисления?
3) Какие алгоритмы могут дать точно верное решение при меньшем объеме кода? :)
Эвристический не подходит так-как не всегда выдает самое лучшее решение.
4) я слышал о гинетических алгоритмах и нейронных сетях. Объясните пожалуста если несложно. :?:
Или лучше дайте ссылки на сайты где об этом подробно и доступно
написанно(особенно о генетическом алгоритме). А то я читал про нейронные сети, я то понял что это такое
и как работает но не понимаю как это использовать для поиска оптимального варианта. :?

Заранее всем огромная благодарность.

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 09.02.2006 (Чт) 1:48

Нейронные сети - это тебе нафиг не надо... У меня был курс в универе, я ответственно заявляю - для программера это - пустая трата времени.

Насчет алгоритма - не вникал, но:
1. пользовательские типы - это хорошо, но применение их в массивах замедляет работу...
2.
Код: Выделить всё
vars(UBound(vars)).s = curV(xC).s
vars(UBound(vars)).t = tC
vars(UBound(vars)).p = curV(xC).p

Лучше так:
Код: Выделить всё
Dim i as Long 'Dim i as Integer
i = UBound(vars)
vars(i).s = curV(xC).s
vars(i).t = tC
vars(i).p = curV(xC).p

Выигрываешь время.

Ссылки:
http://algolist.manual.ru/ - тут много чего интересного... Может, найдешь себе счастья...

GL![/code]

D8M
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.07.2005 (Ср) 12:45

Сообщение D8M » 09.02.2006 (Чт) 21:51

AjaxVS большое спасиьо за ссылку! Этот сайт содержит почти всё, что мне надо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 20

    TopList