网络上关于R语言的条件约束最优化求解的例子不多,而且较为杂乱无章。自己总结一篇文章,方便自己以后查阅,回顾。主要通过一个案例说明,如何在R中如何描述目标问题。使用的包是 Rdonlp2。
- 有如下的条件约束最优化问题:
min(z=x2siny+y2cosx)⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪−100<x<100−100<y<1002≤x+y1≤3x−y≤3xy=2sin(x)∗cos(y)≤3
R语言对问题进行描述
- 对求解问题进行描述
min(z=x2siny+y2cosx)
fn = function(x){
x[1]^2*sin(x[2])+x[2]^2*cos(x[1])
}
- 对x,y值域描述
{−100<x<100−100<y<100
## par.l和par.u分别为约束的左边和右边
par.l = c(-100,-100); par.u = c(100,100) ## 目标值域
- 对线性约束进行描述
{2≤x+y1≤3x−y≤3
A = matrix(c(1,1,3,-1),2,byrow=TRUE) ##线性约束系数
lin.l = c(2,1); lin.u = c(+Inf,3) ## 分别为约束的左边和右边
- 对非线性约束进行描述
{xy=2sin(x)∗cos(y)≤3
nlcon1 = function(x){
x[1]*x[2] ##公式 x*y
}
nlcon2 = function(x){
sin(x[1])*cos(x[2]) ##公式 sin(x)*cos(y)
}
## 两个非线性约束的左右边
## x*y=2 等价于 2<=x*y<=2
nlin.l = c(2,-Inf) ; nlin.u = c(2,0.6)
R语言条件约束最优化求解
将参数输入donlp2函数中进行求解
## 输入参数第一行: x,y值域及目标函数
## 输入参数第二行: 线性约束条件
## 输入参数第三,四行: 非线性约束条件
ret = donlp2(p, fn, par.u=par.u, par.l=par.l,
A, lin.l=lin.l,lin.u=lin.u,
nlin=list(nlcon1,nlcon2),
nlin.u=nlin.u, nlin.l=nlin.l)
## 输出结果
ret$par
# 1.403076 1.425440
完整代码
付Rdonlp2下载地址,有可能在R中不能直接使用 install.package()直接下载安装。
https://r-forge.r-project.org/R/?group_id=156
library(Rdonlp2)
p = c(10,10) #迭代初始值
par.l = c(-100,-100); par.u = c(100,100) ## 目标值域
# 目标
fn = function(x){
x[1]^2*sin(x[2])+x[2]^2*cos(x[1])
}
# 行构成线性约束
A = matrix(c(1,1,3,-1),2,byrow=TRUE)
lin.l = c(2,1); lin.u = c(+Inf,3)
# 构成非线性约束
nlcon1 = function(x){
x[1]*x[2]
}
nlcon2 = function(x){
sin(x[1])*cos(x[2])
}
nlin.l = c(2,-Inf)
nlin.u = c(2,0.6)
# 求解
ret = donlp2(p, fn, par.u=par.u, par.l=par.l,
A, lin.l=lin.l, lin.u=lin.u,
nlin = list(nlcon1,nlcon2),
nlin.u = nlin.u, nlin.l = nlin.l)
# 输出结果
ret$par
# [1] 1.403076 1.425440
作用
在数据挖掘比赛或者研究理论时会常遇到带约束的目标最优化求解,例如,
挖掘竞赛进行模型组合,如长时间时间序列预测,想将多个不同的预测模型进行线性组合,使得结果综合考虑各个模型优缺,那么如何确定不同模型的权重,可以以最小化 RMSE 为目标,就是将不同模型预测值线性组合后达到训练集中的 RMSE 达到最小值。即构建如下问题:
Min(RMSE=g(w1∗forecast1+w2∗forecast2))st.w1+w2=1
其中 g() 为 RMSE 的计算公式。理论方面,如SVM算法的学习策略构建的函数便是软间隔最大的约束最优化问题(即凸优化问题)。课本或者是书本上进行的求解方式,是现将问题转换为对偶问题,在对其进行求解。