我想优化一个如下所示的函数:
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可能不是我应该用来优化这种功能的软件包,但我还没有找到任何其他软件包可供使用。
答案 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的约束。