Инициализировать многомерный массив циклической операцией в VB .Net

#vb.net #loops #genetic-algorithm

#vb.net #циклы #генетический алгоритм

Вопрос:

Как инициализировать многомерный массив циклической операцией в VB .Net?

У меня есть несколько массивов, называемых ‘Room’, ‘Subject’ и ‘Population’.

  1. Массив ‘Room’, содержит название комнаты, т.е.

     {"RoomA", "RoomB"}
      
  2. Массив ‘Subject’ содержит имя объекта, т.е.

     {"English", "Mathematic", "Physics", "Biology"}
      
  3. Массив ‘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.