我有许多变量表示我可以更换的设备。当更换时,它们会改善影响指标[I]
。每个变量还具有相关的年度成本节省[S]
和更换成本[C]
。
n <- 1000 # variable count
# impact
# negative for use in minimization function
I <- -rnorm(n, mean=20000, sd=8000)
# cost savings
s <- rnorm(n, mean=2500, sd=1000)
# replacement cost
c <- rnorm(n, mean=15000, sd=5000)
字符串
我想选择更换哪些组件,以在预算范围内最大限度地发挥全面影响,同时仍确保整个项目(作为一个整体)满足一个简单的回报目标。
payback_goal <- 3
budget <- 1000000
型
这个问题由下面的方程描述。
的数据
我很难用lpSolveAPI
来设置它。具体来说,我不知道如何合并等式3。
library(lpSolveAPI)
m <- 2 # number of constraints, disregarding binary constraint set by type
my.lp <- make.lp(m, n)
set.row(my.lp, 1, c)
# i don't think this is the correct way to set up the calculation
set.row(my.lp, 2, c/s) # cost divided by savings
# create obj fn coefficients
set.objfn(my.lp, I)
set.type(my.lp, 1:n, "binary")
eq <- c("<=", "<=")
set.constr.type(my.lp, eq)
set.rhs(my.lp, c(budget, payback_goal))
solve(my.lp)
soln1 <- get.variables(my.lp)
# total cost
s1_cost <- sum(soln1 * c)
# total impact
s1_impact <- -get.objective(my.lp)
# total simple payback
s1_pb <- sum(soln1*c) / sum(soln1*s)
型
我尝试了一个有点笨拙的解决方法,假设总成本将合理地接近预算,这使得第三个等式
的
但这只是一个近似值,我想知道如何在R代码中更准确地实现它。
2条答案
按热度按时间yk9xbfzb1#
你可以用你的符号线性化(3)如下:
字符串
可以重写为:
型
只要
sum([X]*[S])>0
就有效。3phpmpom2#
正如@Erwin Kalvelagen所指出的那样,您可以重新制定约束以使其线性化。
但是,您应该注意到,转换是以
sum([X]*[S])
为条件的,这意味着sum([X]*[S])>0
,我们应该有sum([X]*([C]-payback*[S])) <= 0
sum([X]*[S])<0
,我们应该有sum([X]*([C]-payback*[S])) >= 0
然后,将上述两种情况合并(比较并取最小值),我们可以通过
sum([X]*[S])
来排除影响。代码示例(
CVXR
中)字符串
你会发现
型
使得
sol
被分配有sol1