TL; DR: Я пытаюсь найти самый дешевый набор предметов в коллекции, которые удовлетворяют определенным линейным ограничениям. Тем не менее, каждый элемент может быть частью нескольких «категорий», и я также хочу иметь сочетание этих уникальных категорий, и я не совсем уверен, может ли это быть реализовано способом LP или нет, и в случае, как к нему подойти.
Пример - часть 1 Допустим, у меня есть 7 предметов, которые имеют разные затраты и разные значения, связанные с ними.
library(tidyverse)
library(lpSolve)
# Fake data
kd = tibble(
Item = 1:7,
Cost = c(1, 1, 1, 1, 2, 3, 4),
Value =c(1, 1, 3, 4, 6, 3, 2),
Type = c("A", "A", "A", "B", "C", "D", "E")
)
Я хочу выбрать 3 из этих элементов, чтобы стоимость была минимизирована, а их значение>> 5. Я легко могу сделать это с помощью lp
с помощью следующего кода:
# Objective function
knapsack.obj = kd$Cost
# Constraints
knapsack.con = matrix(
c(
rep(1, nrow(kd)),
kd$Value
),
nrow = 2, byrow = TRUE
)
knapsack.dir = c("==", ">=")
knapsack.rhs = c(3, 5)
# Solve
knapsackSolution = lp("min", knapsack.obj, knapsack.con, knapsack.dir, knapsack.rhs, all.bin = TRUE)
# Results
kd[knapsackSolution$solution == 1, ]
Как и ожидалось, это возвращает элементы 1, 2 и 3, которые имеют объединенное значение = 5 и, очевидно, сводят к минимуму цену.
Пример - часть 2
дополнительная сложность, которую я не совсем знаю, как решить сейчас, это добавить код, чтобы убедиться, что выбранные предметы принадлежат как минимум к 2 уникальным категориям. Теперь решение, которое я ожидал бы, это пункты 1, 2 и 4 (или 1, 3 и 4), которые по-прежнему имеют совокупную стоимость 3 и значение 6 (или 8), равное> = 5, но не все "Aэлементы, но содержат также элемент 4, который является элементом "B".
Есть идеи о том, как реализовать это в платформе LP?