У меня есть проблема, связанная с оптимизацией снаряжения в игре, но я упрощу ее на следующем примере:
- Допустим, у меня есть 4 сумки.
- У меня есть набор разных предметов, 4 вида.
- У каждого предмета свой вес и цена.
- Каждая сумка предназначена для одного вида вещей, 4 сумки - 4 вида.
Я хочу максимально увеличить цену, которую ношу во всех сумках, но у меня есть следующие ограничения:
- Каждая сумка вмещает не более 6 предметов. Он тоже может быть пустым.
- Общий вес всех 4 мешков не должен превышать 700 кг.
- Каждый мешок имеет минимальное значение веса, даже если он пустой, он будет считаться 50 кг (мешок с 1 предметом весом 25 кг будет по-прежнему считаться как 50 кг, мешок с 1 предметом весом 51 кг будет считаться как 51 кг).
Диапазон количества элементов составляет 200 ~ 300, а при максимальном количестве элементов 6 * 4 = 24, которые могут быть выбраны, перебор невозможен.
Есть и другие факторы, но они выходят за рамки комбинаторной проблемы и могут быть решены простым программированием
Что это за проблема? Это подмножество линейного программирования?
Вы знаете, какой алгоритм я могу найти, чтобы решить эту проблему?
Я начал читать о линейном программировании, но у меня проблемы с пониманием некоторых символов. Я занимаюсь программированием, но не математикой.
Обновлять
Я изучил это, и теперь я знаю, что это многомерная задача или задача о рюкзаке с множественным выбором. Решив простую задачу о рюкзаке, у меня осталось только 1 ограничение, ограничение в 6 предметов.
Кто-нибудь знает хороший подход к этому?
Обновление 2
Сейчас я использую GLPK для моделирования этой проблемы и ее решения, я так близок к завершению, но я застрял с простым ограничением.
# Size of knapsack
param s;
# Total of items
param t;
# Type of items
set Z;
# Min bag
param m;
# Items: index, size, profit, count, type
set I, dimen 5;
# Indices
set J := setof{(i,s,p,o,z) in I} i;
# Assignment
var a{J}, binary;
#maximize profit
maximize obj :
sum{(i,s,p,o,z) in I} p*a[i];
/*s.t. size :
sum{(i,s,p,o,z) in I} s*a[i] <= c;*/
#constraint of total weight, but with the min value for each bag
#the min function doesn't work, it says argument for min has invalid type
#something about it not being a linear function
s.t. size :
sum{zz in Z} (
min(m, sum{(i,s,p,o,z) in I: zz=z} (s*a[i]) )
) <= c;
#constraint of number of items in each bag, i put an extra count number
#in the set so i could sum it and make it a constraint
s.t. count{zz in Z}:
sum{(i,s,p,o,z) in I: zz=z} o*a[i] <= t;
solve;
printf "The bag contains:\n";
printf {(i,s,p,o,z) in I: a[i] == 1} " %i", i;
printf "\n";
data;
#set of type of items
set Z := 1 2 3 4;
# Total weight limit
param c := 100;
# Only 2 items per bag
param t := 2;
# Min bag value, if the bag weights less than it, then it counts as this value
param M := 10;
# Items: index, size, profit, count, type
set I :=
1 10 10 1 1
2 10 10 1 1
3 15 45 1 2
4 20 20 1 2
5 20 20 1 3
6 24 24 1 3
7 24 25 1 4
8 50 50 1 4;
end;
Примечание: я использовал здесь разные значения, чтобы они были небольшими.
Это моя модель, она работает без ограничения по минимальному весу, мне просто нужно, чтобы она суммировала минимальное значение 50 кг или общую сумму мешка, но функция min
там не работает. Я пробовал эту формулу
(не могу публиковать изображения)
min (a, b) = (a + b- abs (ab)) / 2
но я тоже не могу использовать функцию абс.
Может ли кто-нибудь указать мне в правильном направлении по этому поводу.