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


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

У меня есть несколько массивов, которые называются "комната", "субъект" и "население".
  1. Массив 'Room', содержащий имя комнаты, т. е.

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

    {"English", "Mathematic", "Physics", "Biology"}
    
  3. Массив "население" является многомерным массивом, который содержит рандомизированную комнату, взятую из массива "комната". то есть {("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 was unhandled" указал на выше помеченный код "ERROR HERE". Вы можете помочь мне решить эту проблему?

этот код предназначен для инициализации начального значения использования компактного генетического алгоритма для решения оптимизационной задачи по оптимизации использования класса. А кто-нибудь знает знаете такой метод? Если да, то не хотите ли поделиться со мной своими знаниями? Я пытался найти несколько материалов для этого, но все еще не могу реализовать его в коде.

2 2

2 ответа:

Ошибка связана с Room(Randomize), а не с вашим массивом.

Вы утверждаете, что комната является массивом, но ваш код включает в себя Room.Count(). Массивы имеют длину, а не количество. Поэтому я предполагаю, что эта комната - своего рода коллекция. Далее, ваше случайное число Randomize (присвоенное Rnd() * TotalRoom) имеет диапазон от 0 до TotalRoom, где TotalRoom равно Room.Count(). Таким образом, если ваша коллекция основана на нуле, то вы получаете индекс из привязки, когда вы случайным образом генерируете значение, равное вашему количеству коллекций. И если ваш коллекция основана на 1, то вы получаете индекс из привязки, когда вы случайным образом генерируете 0.

Для компактных генетических алгоритмов вы можете прочитать пионерскую исследовательскую работу Харика, Лобо и Голдберга:

Харик, Жорж Р., Фернандо г. Лобо и Дэвид Э. Голдберг. "Этот компактный генетический алгоритм."Эволюционные вычисления, IEEE Сделки по 3.4 (1999): 287-297.

Поскольку это не непосредственно связанный с .NET, вы можете взглянуть на небольшой фрагмент кода в пакете R eive. Файл c++ ccga.cpp в каталоге src составляет 60 строк. Cran Package-eive

Здесь есть запись в блоге , которая включает примеры оптимизации базовых функций с использованием cga на языке R.