Инициализация гена в двоичном массиве для планирования расписания с GA в C#
В настоящее время я работаю над проектом для планирования драйверов, и он находится на начальной стадии. Я решил использовать GA для создания оптимизированного расписания для водителя, и, как и большинство проектов GA, население должно быть представлено в двоичном виде.
например, если водителю назначено два часа задачи и его продолжительность работы составляет 9 часов, возможная численность населения в этот конкретный день выглядит как 110000000, 011000000, 001100000 и так далее.
В качестве инициализации GA я хотел бы динамически генерировать возможный ген, такой как 000110000, с двумя параметрами (продолжительность работы драйвера и продолжительность работы).
Мне удалось получить полностью случайный двоичный код в логическом списке (см. Ниже), но это не то, что я хочу представить в качестве инициализации.
Это частичный код, который генерирует случайную двоичную строку (технически набор логических значений) в списке.
private Random Rnd = new Random();
//initial data
private List<bool[]> CreateInitialData()
{
//generate 4 random genes (might be more)
return Enumerable.Range(0, 1).Select(_ =>
{
var array = new bool[GeneLength];
for(int i = 0; i < GeneLength; i++)
{
array[i] = Rnd.Next(0, 2) == 1;
}
return array;
}).ToList();
}
Как я могу реализовать функцию инициализации для создания двоичного кода, который соответствует требованию (рабочее время водителя, предполагаемая продолжительность работы)? Если есть лучший способ представить его, кроме логического списка, пожалуйста, предложите также.
1 ответ
Основываясь на часовых заданиях, я придумал это:
private static void Main(string[] args)
{
var genes = GetGenes(9, 2);
}
private static List<bool[]> GetGenes(int workinghours, int estimateddutyduration)
{
// get the base representation
var hours = GetHours(workinghours, estimateddutyduration);
var list = new List<bool[]>();
for (int i = 0; i < (workinghours-estimateddutyduration)+1; i++)
{
// add
list.Add(hours);
// switch
hours = SwitchArray(hours);
}
return list;
}
private static bool[] SwitchArray(bool[] array)
{
// copy the array to a list
var temp = array.ToList();
// insert the last element at the front
temp.Insert(0, temp.Last());
// remove the last
temp.RemoveAt(temp.Count-1);
// return as array
return temp.ToArray();
}
private static bool[] GetHours(int totalhours, int taskduration)
{
// initialise the list
var hours = new List<bool>(totalhours);
// fill the list for the number of working hours
for (int i = 0; i < totalhours; i++)
{
hours.Add(false);
}
// iterate for the task duration and set the hours as working
for (int i = 0; i < taskduration; i++)
{
hours[i] = true;
}
// return as array
return hours.ToArray();
}
за 9, 2 возврата
110000000
011000000
001100000
000110000
000011000
000000110
000000011
за 9, 9 возвращается
111111111
За 9, 4 возвращается
111100000
011110000
001111000
000111100
000011110
000001111
Этот код довольно многословен, и я не сомневаюсь, что его можно оптимизировать. Но это идея, которую я хочу передать больше всего.
РЕДАКТИРОВАТЬ: Если вы хотите отобразить результаты на консоли
private static void ShowGenes(List<bool[]> genes)
{
foreach (var gene in genes)
{
foreach (var bit in gene)
{
Console.Write(bit ? "1" : "0");
}
Console.Write("\n");
}
}