Java сохраняет 2d-массив как объект в генетическом алгоритме

Я работаю над задачей многокритериальной оптимизации, в которой используется генетический алгоритм для отображения наилучшего решения уже более года.

Проблема заключается в распределении людей по разным командам в соответствии с рядом критериев. Я уже завершил этап инициализации, и кодирование фитнес-функции также завершено. Однако у меня возникают проблемы с сохранением сгенерированных (двумерных массивов) решений в виде объектов и их временным хранением в памяти, чтобы их можно было использовать на более поздних этапах GA: Selection, Crossover и Mutation.

Я использую селекцию по принципу колеса рулетки и немного другие алгоритмы кроссовера и мутации. У меня нет проблем с этим. Просто я не смог найти способ временно сохранить 1 сгенерированное решение (в данном случае полное распределение команды) в памяти, а затем сгенерировать другое решение и сохранить его в памяти, затем еще одно и так далее.

Я пробовал довольно много разных вещей, которые я мог придумать, из которых я могу вспомнить две: (i) изменил тип 2d-массива с int на Object, но это дало ошибку, поскольку 2d-массив, который создает команды, использует другой массив int для определения позиции индекса идентификатора человека в списке; (ii) использование статической переменной поля класса, которая должна увеличиваться каждый раз после запуска класса начальной генерации популяции.

Я исследовал это в течение нескольких месяцев и перепробовал все, что мог придумать. Если бы кто-то мог направить меня или даже дать мне подсказку о том, как я могу сохранить массив 2d, чтобы я мог использовать его на более поздних этапах GA, это было бы очень полезно.

Спасибо

отредактировано: это начальный класс населения, который имеет бит массива 2d, который создает команды: каждая строка представляет номер команды, а столбцы - это идентификаторы членов (я исключил некоторый код, который ссылался на другие классы, и вместо этого выразил это словами):


person Anon    schedule 20.07.2012    source источник
comment
Вы говорите, что не можете временно хранить сгенерированное решение в памяти... Мой первый вопрос: насколько велик этот набор данных? Во-вторых, не могли бы вы предоставить нам код, специально предназначенный для этой части? В-третьих, переход от int к Object — не очень хорошая идея, вы хотели бы, по крайней мере, подняться до Integer, если видите преимущество использования класса-оболочки.   -  person Makoto    schedule 20.07.2012
comment
Не могли бы вы предоставить подробную информацию о вашей реализации? Как насчет информации о вашем 2d-массиве? Насколько это велико? Почему нельзя было сохранить решение? Что вы пробовали?   -  person Behe    schedule 21.07.2012
comment
я отредактировал сообщение, чтобы добавить пример кода 2d-массива создания команды. Первоначально я хотел повторить создание группы 120 раз, как в случае 120 человек, к которым должны были быть применены выборка, кроссовер и мутация, поэтому на самом деле массив 2d предназначен для создания 120 различных распределений команд и сохранения этих 120 распределений команд во временной памяти.   -  person Anon    schedule 21.07.2012
comment
@Makoto: я тоже пытался преобразовать целое в объект, но это тоже не сработало   -  person Anon    schedule 21.07.2012
comment
Это единственное место noTeams заполнено целочисленным значением? Если это так, причина, по которой ваши массивы не будут работать, заключается в том, что вы не выделяете места в первом измерении.   -  person Makoto    schedule 21.07.2012
comment
Ваш код не очень помогает проиллюстрировать ваш вопрос. Что вы пробовали и в чем проблема? Чего вы пытаетесь достичь?   -  person Behe    schedule 21.07.2012
comment
noTeams вычисляется в этом классе, чтобы узнать, сколько строк нужно создать. массивы/команды создаются просто отлично. временно сохранить их проблема. То, что я пытаюсь сделать, это создать 1 полное распределение команды, где каждый участник назначен 1 команде, затем создать распределение другой команды и т. д., а затем использовать каждое из этих сгенерированных распределений команды на этапах оценки пригодности, отбора.... Я могу записать эти сгенерированные групповые распределения в простой текстовый файл, но проблема заключается в том, что как только создается следующая группа, предыдущая теряется, т.е. больше не находится в памяти, на которую я могу ссылаться на других этапах GA.   -  person Anon    schedule 21.07.2012
comment
@Makoto: извините, но что вы имеете в виду под ... вы не выделяете места в первом измерении. noTeams вычисляется путем считывания общего количества участников из CSV-файла, а затем делится на 8, чтобы найти общее количество команд, которые необходимо создать. Можете ли вы объяснить. Спасибо   -  person Anon    schedule 21.07.2012
comment
При первом редактировании этого фрагмента кода там не было. Я не могу определить размер выделения на основе member.mList.size(); Не могли бы вы прямо сообщить нам, что это такое, или подтвердить, что оно больше 1?   -  person Makoto    schedule 21.07.2012
comment
да, оно всегда больше 1. есть блок кода, который проверяет, что размер списка участников всегда делится на 8 (так что 8 участников в каждой команде), иначе файл отклоняется. В списке всегда не менее 80 участников. Весь код находится в разных классах — класс, который считывает данные членов и преобразует их в двойные и целые числа, где это необходимо, класс, который выполняет оценку пригодности, класс, который записывает окончательные групповые распределения в текстовый файл и так далее. ... этот фрагмент кода выше является начальным классом населения... если бы я мог как-то просто сохранить эти группы как объекты...   -  person Anon    schedule 22.07.2012


Ответы (1)


Ваша проблема здесь относится к архитектуре. Вы создаете свою популяцию в отдельном классе, никуда ее не отправляя. Вы хотите обернуть свою инициализацию в другом классе. Когда я пишу новый GA, я обычно делаю что-то подобное.

class GeneticAlgorithm {

  public static int[][] population;
  public static double mutationRate;
  public static double crossoverRate;

  public int[][] initializePopulation //this is where your createTeams method would go
  public int[][] mutation 
  public int[][] crossover

  public void runGA

}

Это моя базовая структура для ГА. В вашем методе runGA вы можете зацикливаться на любом количестве поколений, будь то на основе критерия выхода или статического числа. В каждом поколении вы просто передаете свою текущую популяцию в свои функции мутации и кроссовера, и она возвращает вам результирующую популяцию. Пока вы делаете все это, ваша популяция надежно хранится в переменной, которую можно либо сохранить, либо вывести после завершения вашего ГА.

Надеюсь, это поможет, и удачи в этом.

person Raskolnikov    schedule 25.07.2012
comment
Я думаю, это то, чего мне не хватало раньше. Я попытаюсь провести занятия, как вы предложили, и дам вам знать, как это сработало (я примерно на 99% уверен, что это решит мою проблему). Большое спасибо - person Anon; 25.07.2012
comment
Не стесняйтесь опубликовать дополнительную информацию, если это не решит ваши проблемы. Если это так, не забудьте принять ответ. - person Raskolnikov; 01.08.2012