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


