Настройка линейного программирования - выберите группы так, чтобы отдельные элементы находились в пределах ограничений - PullRequest
0 голосов
/ 26 ноября 2018

Я считаю себя достаточно хорошо разбирающимся в бинарных lpSolve проблемах, но я действительно изо всех сил пытаюсь придумать, как установить новую проблему (и я думаю, что мне может понадобиться lpSolveAPI).

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

# library(lpSolve)

# Total number of meals to choose
numCombos <- 3

# Individual fruit constraints
AppleCon <- c(1, 2)
OrangeCon <- c(0, 2)
PeachCon <- c(2, 2)
PearCon <- c(0, 1)
BananaCon <- c(1, 2)
GrapeCon <- c(1, 1)

# Meals to choose from
Combo1 <- c('Apple', 'Orange', 'Peach')
Combo2 <- c('Apple', 'Pear', 'Peach')
Combo3 <- c('Banana', 'Grape', 'Pear')
Combo4 <- c('Orange', 'Grape', 'Peach')
Combo5 <- c('Grape', 'Banana', 'Apple')
Combo6 <- c('Pear', 'Orange', 'Grape')

# Number of each
# Apple 3
# Orange 3
# Peach 3
# Pear 3
# Banana 2
# Grape 4

Примеры того, как я хочу рассчитать потери:

  1. Скажи, что я должен был выбрать комбо 1, 2 и 3. Это дало бы мне 2 яблока, 1 апельсин, 2 персика, 2 груши, 1 банан и 1 виноград.Максимальное количество груш составляет 1, поэтому общая потеря при выборе комбинаций 1, 2 и 3 равна 1 (2 выбранных груши минус максимальное ограничение 1).

  2. Скажите, что я должен был выбрать Комбо 2, 4 и 6. Это дало бы мне 1 яблоко, 2 груши, 2 персика, 2 винограда и 2 апельсина.В этой комбинации слишком много груш (максимум 1), слишком много винограда (максимум 1) и слишком мало бананов (минимум 1).Таким образом, общая потеря составляет 3.

Если возможно, я бы также хотел, чтобы потеря была еще хуже, если один конкретный фрукт все в большей степени исчезает.Например, иметь 2 слишком много яблок хуже, чем иметь 1 слишком мало апельсина и 1 слишком много винограда.Самым простым способом было бы возвести это ограничение в квадрат, но я не знаю, приемлемо ли это для «линейного» программирования.

Если бы я установил lpSolve, как я знаю, я бы сделал 2 фиктивных столбца длякаждый отдельный фрукт, где 1 будет в каждом ряду, в зависимости от того, находится ли фрукт в этом комбо.Это не сработает, потому что в этом примере я ничего не минимизирую или максимизирую, и если решение не существует, то оно не выберет наилучшее из возможных решений.Моя реальная проблема включает в себя более 80 «фруктов», более 600 «блюд», из которых мне нужно выбрать 200, поэтому я хочу убедиться, что у меня есть простой обобщенный пример, подобный этому, прежде чем я начну применять его к своей реальной проблеме.

...