R lpSolveAPI在set.objfn中具有非平凡系数

时间:2017-07-20 09:13:00

标签: r optimization parameters constraints lpsolve

我想优化一个如下所示的函数:

y= P1*y+sum(x1-P1) + P2*y+sum(x2-P2) + P3*y+sum(x3-P3) 

P1,P2 P3 要优化的三个参数和要最小化的函数。 x1,x2 x3 是数据的载体。

在约束下:

P2-P1 >= 0
P3-P2 >=0

由于存在约束,我无法在R中使用函数optim(),因此我查看了lpSolveAPI。

使用lpSolveAPI我会去:

lps.model <- make.lp(0, 3) 
add.constraint(lps.model, c(-1,1,0), ">=", 1)
add.constraint(lps.model, c(0,-1,1), ">=", 1)

但是当我想要定义&#34; set.objfn&#34;必须以这种方式定义:

set.objfn(lprec, obj, indices) with
lprec: an lpSolve linear program model object.
obj: a numeric vector of length n (where n is the number of decision variables in lprec) containing the coefficients of the objective function. Alternatively, if indices is also provided, a numeric vector of the same length as indices containing only the nonzero coefficients.
indices: optional for sparse obj. A numeric vector the same length as obj of unique values from the set {1, ..., n} where n is the number of decision variables in lprec; obj[i] is entered into column indices[i] in objective function. The coefficients for the columns not in indices are set to zero. This argument should be omitted when length(obj) == n.

我仍然可以像这样重写函数y:

y = P1 (y + [ (x1/P1 ) - 1 ]) + P2 (y + [ (x2/P2 ) - 1 ]) + P3 (y + [ (x3/P3 ) - 1 ])

虽然我怎么能在&#34; obj&#34;中的参数前写这些系数?函数的一部分&#34; set.objfn&#34;因为我的参数 P1 - P3 实际上是系数的一部分?

obj = c((y + [ (x1/ P1 ) - 1 ] , ... )

lpSolveAPI可能不是我应该用来优化这种功能的软件包,但我还没有找到任何其他软件包可供使用。

1 个答案:

答案 0 :(得分:0)

我不认为你的等式是线性的,所以lpSolve在你目前的目标函数表达中不会有很大的帮助。

这是我可以做的最好的重新安排你的功能y(我假设你的向量x1 x2 x3每个都是1Xn,不同的大小不应该真正影响下面的分析):

y = P1*y+sum(x1-P1) + P2*y+sum(x2-P2) + P3*y+sum(x3-P3) 
y = y*P1 + y*P2 + y*P3 + sum(x1) + sum(x2) + sum(x3) - n*P1 - n*P2 - n*P3

我认为sum(x1)+ sum(x2)+ sum(x3)确实是必需的,因为它们是某种常数,所以你的目标函数可以简化为:

y = y*(P1 + P2 + P3) - n*(P1 + P2 + P3)
y = -n*(P1 + P2 + P3) / (1 - P1 - P2 - P3) 

或者

y =  n*(P1 + P2 + P3) / (P1 + P2 + P3 - 1)

看一下http://lpsolve.sourceforge.net/5.5/的比率部分,有一些有用的技巧可以帮助您重新安排目标函数中的比率和/或允许您使用lpsolve的约束。