我正在try 使用R中的两个变量来优化函数.我担心的是,这两个变量只有特定的可能值.我找到了下限/上限都是noptr的解决方案,但我不能"强制"这两个变量都取这个值.使用constrOptim函数的示例将更容易理解:

g <- function(x,y) 100*x+150*y
gb <- function(x) g(x[1], x[2])

A <- matrix(c(1,0,0,1,100,150),3,2,byrow=T)
b <- c(0,0,350)

constrOptim(theta=c(2,2), f=gb, grad=NULL, ui=A, ci=b)

因此,我希望x&amp;y取值0、1或2.在我的示例中,约束进一步写为x>=0y>=0100x+150y>=350.

我的目标是最小化100*x+150*y尊重100x+150y>=350,而xy只取c(0,1,2)的值!

推荐答案

根据应用于实际问题的示例功能,您可以使用强力(如果问题不太大)、整数线性规划(如果目标和约束是线性的)或整数凸规划(如果目标和约束是凸的).所有这些都适用于问题中的例子.

# brute force
list(grid = expand.grid(x = 0:2, y = 0:2)) |>
  with(cbind(grid, g = apply(grid, 1, gb))) |>
  subset(g >= 350) |>
  subset(g == min(g))
##   x y   g
## 6 2 1 350

# integer linear programming
library(lpSolve)
res <- lp("min", c(100, 150), A, c("<=", "<=", ">="), c(2, 2, 350), all.int = TRUE)
res
## Success: the objective function is 350 
res$solution
## [1] 2 1

# integer convex programming
library(CVXR)
X <- Variable(2, integer = TRUE)
v <- c(100, 150)
objective <- Minimize(sum(v * X))
constraints <- list(X >= 0, X <= 2, sum(v * X) >= 350)
prob <- Problem(objective, constraints)
CVXR_result <- solve(prob)
CVXR_result$status
## [1] "optimal"
CVXR_result$getValue(X)
##           [,1]
## [1,] 2.0000228
## [2,] 0.9999743

R相关问答推荐

R:随机抽取所有可能排列的样本

R数据帧中的布尔加法会产生布尔值而不是整值

使用case_when和Mutate搜索多个列以寻找条件

是否有R代码来判断一个组中的所有值是否与另一个组中的所有值相同?

强制相关图以显示相关矩阵图中的尾随零

将一个载体的值相加,直到达到另一个载体的值

根据固定值范围在tible中添加新行

查找具有平局的多个列的最大值并返回列名或平局 destruct 者NA值

基于shiny 应用程序中的日期范围子集xts索引

使用ggplot 2根据R中的类别排列Likert比例gplot

在值和NA的行顺序中寻找中断模式

如何修复R码的置换部分?

抖动点与嵌套类别变量箱形图的位置不对齐

如何自定义3D散点图的图例顺序?

将小数分隔符放在R中的前两位数字之后

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

如何提取R中其他字符串和数字之间的字符串?

多元正态分布的计算

防止正则表达式覆盖以前的语句

快速合并R内的值