#vb.net #loops #genetic-algorithm
#vb.net #циклы #генетический алгоритм
Вопрос:
Как инициализировать многомерный массив циклической операцией в VB .Net?
У меня есть несколько массивов, называемых ‘Room’, ‘Subject’ и ‘Population’.
-
Массив ‘Room’, содержит название комнаты, т.е.
{"RoomA", "RoomB"}
-
Массив ‘Subject’ содержит имя объекта, т.е.
{"English", "Mathematic", "Physics", "Biology"}
-
Массив ‘Population’ — это многомерный массив, который содержит произвольно выбранную комнату из массива ‘Room’. т. е.
{("RoomA", "RoomA", "RoomA", "RoomA"), ("RoomA", "RoomA", "RoomA", "RoomB"), ("RoomB", "RoomA", "RoomB", "RoomB"), .....}
. Длина массива основана на генерируемом значении и длине объекта.
Я пробовал этот код, но безуспешно:
Dim i, j As Integer
Dim TotalSubject As Integer = Subject.Count()
Dim TotalRoom As Integer = Room.Count()
Dim Population(,) As String
ReDim Population(generate, TotalSubject) 'Give the 'Population' bound
For i = 0 To generate
For j = 0 To TotalSubject
Dim Randomize As Integer = Rnd() * TotalRoom
Population(i, j) = Room(Randomize) '----- ERROR HERE -----'
Next j
Next i
Но пока я выполняю код, появляется сообщение об ошибке «Исключение IndexOutOfRangeException не было обработано», указывающее на приведенный выше код с пометкой «ОШИБКА ЗДЕСЬ». Можете ли вы помочь мне решить эту проблему?
Этот код предназначен для инициализации начального значения с использованием компактного генетического алгоритма для задачи оптимизации использования классной комнаты. Кто-нибудь знает этот метод? Если да, не хотели бы вы поделиться знаниями со мной? Я пытался выполнить поиск в нескольких материалах для этого, но все еще не могу реализовать это в коде.
Ответ №1:
Ошибка связана с Room(Randomize)
не с вашим массивом.
Вы заявляете, что Room является массивом, но ваш код включает Room.Count()
. Массивы имеют длину, а не количество. Поэтому я предполагаю, что Room — это своего рода коллекция. Далее, ваше случайное число Randomize
(назначенное Rnd() * TotalRoom
) имеет диапазон от 0 до TotalRoom, где TotalRoom
равно Room.Count()
. Итак, если ваша коллекция основана на нуле, то вы получаете индекс вне пределов, когда случайным образом генерируете значение, равное количеству вашей коллекции. И если ваша коллекция основана на 1, то вы получаете индекс вне привязки, когда случайным образом генерируете 0.
Комментарии:
1. При рандомизации для достижения равномерного распределения вам следует использовать
Math.Floor(Rnd() * TotalRoom)
. Если вы используетеMath.Round(Rnd() * (TotalRoom - 1))
(или просто преобразуете результат в целое число), наибольшее и наименьшее значения имеют лишь половину вероятности быть выбранными по сравнению со значениями между ними.2. @Hand-E-Food: Спасибо, это работа 🙂 . Я попытался использовать первый, который вы дали (Math. Этаж)
Ответ №2:
Что касается компактных генетических алгоритмов, вы можете прочитать пионерскую исследовательскую работу Харика, Лобо и Голдберга:
Харик, Джордж Р., Фернандо Г. Лобо и Дэвид Э. Голдберг. «Компактный генетический алгоритм». Эволюционные вычисления, транзакции IEEE на 3.4 (1999): 287-297.
Поскольку это не напрямую связано с .NET, вы можете взглянуть на небольшой фрагмент кода в R package eive. Файл C ccga.cpp в каталоге src 60 строк. Пакет Cran — eive
Здесь есть запись в блоге, которая включает примеры оптимизации базовых функций с использованием cga на языке R.