Инициализация гена в двоичном массиве для планирования расписания с 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");
    }
}
Другие вопросы по тегам