Nano Hash - криптовалюты, майнинг, программирование

Как реализовать бинарное ограничение в LPSolve?

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

library(lpSolveAPI)

# Required nutrients
nitrogen = 1500
phosphate = 530

# Product properties (sample dataset, this will later be expanded with more products and nutrients)
products <- data.frame(
  p1 = c(0.2, 0.1),
  p2 = c(0.8, 0),
  p3 = c(0.15, 0.2),
  p4 = c(0.1, 0.25),
  p5 = c(0, 0.4)
)

# Create model
model <- make.lp(nrow = 2, ncol = ncol(products))

# Add the products as decisions
for (p in 1:ncol(products)) {
  set.column(model, p, products[, p])
}

# Set the required amount as constraint 
set.constr.value(model, rhs = c(nitrogen, phosphate))
set.constr.type(model, types = c(2,2))

# Set the objective function
set.objfn(model, rep(1, ncol(products)))
lp.control(model, sense='min')

solve(model)
get.objective(model)

Однако теперь я хочу добавить ограничение, согласно которому можно использовать не более определенного количества (например, 2) продуктов. Я думал о добавлении двоичного ограничения, но не могу понять, как это реализовать. Единственный вариант, который мне удалось обнаружить, - это установить для переменной решения двоичное значение, но это не дает возможности использовать несколько единиц продукта.

Итак, как я могу добавить ограничение, чтобы не использовать более 2 или 3 продуктов?


Ответы:


1

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

Итак, в основном у вас есть:

min sum(j, x(j))
st  sum(j, a(i,j)*x(j)) >= b(i)  for i=1,2
    x(j) >= 0      

Теперь вы хотите посчитать ненулевые переменные. Это требует дополнительных двоичных переменных и некоторых ограничений на x (j).

min sum(j, x(j))
st  sum(j, a(i,j)*x(j)) >= b(i)  for i=1,2
    x(j) <= U(j)*y(j)
    sum(j, y(j)) <= 2 (or 3)
    y(j) ∈ {0,1} 
    0 <= x(j) <= U(j)      

Я оставлю вам транскрибировать это в код. Обратите внимание, что CVXR или OMPR может быть проще в использовании, чем LpSolveAPI, когда модель становится немного сложнее.

22.04.2020
  • Вы имеете в виду с U(j) большую константу? 23.04.2020
  • U - верхняя граница x. Он должен быть максимально плотным. 23.04.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..