Neha_59 Ответов: 2

задача рюкзака с использованием генетического алгоритма


- Привет!

Я новый участник проекта code. Я только начал работать с генетическим алгоритмом.

Мне нужно решить проблему рюкзака с помощью генетического алгоритма на c++.

Например, я инициализирую население:

void initialize_Q()
{
    double r,num=0.0;
    for( int
        i=0;i<POPsize ;i++)
    {
        for(int j=0;j<NUM_BIT;j++)
        {
            r=rnd0_1();
            if(r>=0.5)
            {
                population[i].P[j]=1;
                num++;
                if(num>CAPACITY)
                    population[i].P[j]=0;
            }
            else
                population[i].P[j]=0;

        }
    }

}




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

Любая помощь с основной идеей или любая реализация на c++ были бы очень полезны.

Sergey Alexandrovich Kryukov

Пожалуйста, сначала сформулируйте проблему рюкзака, которую вы пытаетесь точно решить. Я спрашиваю, потому что есть разные варианты проблемы.

Пожалуйста, посмотрите мой комментарий к ответу Маркуса (он относится к моему прошлому ответу); к сожалению, это не тот ответ, который может вам помочь-пока.

2 Ответов

Рейтинг:
2

fjdiewornncalwe

Попробуйте проверить этот- Об этом уже спрашивали раньше.

Овации.


Manfred Rudolf Bihy

На этот раз все немного по-другому, так как ОП спрашивает о решении этой проблемы с помощью генетического алгоритма. Я думаю, что ценность пригодности, о которой говорит ОП, связана с генетическими алгоритмами. Это звучит так, как будто это значение используется для определения того, является ли алгритм подходить достаточно для выживания.

Neha_59

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

fjdiewornncalwe

@Neha59: Спасибо, что добавили блок кода к этому вопросу. На этот раз вы сделали вопрос намного яснее, сделав это.

Sergey Alexandrovich Kryukov

Маркус, спасибо тебе за этот ответ.

Sergey Alexandrovich Kryukov

Маркус, к сожалению, твой ответ неадекватен. Я все объясню.

Вы действительно ссылаетесь на мой ответ, который я дал в прошлом. Но это был ответ другому человеку, и ответ формально указывал на то, что проблема поставлена неправильно.
Этот вопрос другой и имеет другую проблему: проблема вообще не сформулирована. Для ранцевых задач это важно, потому что вариантов много, поэтому я не уверен, какова точная формулировка (и, конечно, не хочу гадать).

Я предлагаю вам изменить текст вашего ответа, чтобы избежать введения в заблуждение: скажем, проблема обсуждалась ранее, но... (На этот раз я не голосовал).

Неха, пожалуйста, сначала сформулируй проблему рюкзака, которую ты пытаешься решить заранее.

Рейтинг:
0

Stefan_Lang

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

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

Это самая легкая часть.

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

Вы также можете превратить жесткий предел(ы) в мягкий предел, допустив "плохие" решения, которые превышают емкость рюкзака, и вместо этого добавить штраф к результату функции фитнеса, например.

modified_fitness = max_fitness*A - excess_of_limits*B
где max_fitness является оценкой максимально достижимого значения пригодности (с использованием непенализированной функции пригодности), A является ли уменьшающий фактор достаточно малым, чтобы уменьшить эту оценку значительно ниже реально достижимых значений (очевидно, зависит от того, насколько хорошо вы можете оценить - некоторое значение между 0,5 и 0,9 должно работать в большинстве случаев), excess_of_limits - сумма, на которую оцениваемое решение превышает пределы рюкзака, и B это некоторый масштабирующий фактор, ставящий избыток по отношению к приблизительному размеру значения пригодности.

Поиск хороших значений для этих констант, вероятно, потребует некоторых проб (и ошибок). Или вы можете попросить пользователя ввести эти значения во время выполнения, чтобы вам не приходилось постоянно менять программу.


Patrice T

вопрос 6-летней давности! - вы уверены ?

Stefan_Lang

Ой. Пропустил дату. Но каким-то образом это всплыло на первой полосе. До того, как я опубликовал это решение. Должно быть, испортил мои фильтры...