java代码jump search_用JuMP进行非线性优化的一个例子

作为使用Julia的JuMP建模语言理解非线性优化的测试,我试图通过约束 0 <= x[i] <= 0.5 来最小化10维中的Rosenbrock函数 . 第一个带有可变参数的Rosenbrock:

function rosen(x...)

local n = length(x); local s = 0.0

for i = 1:length(x)-1

s += 100*(x[i+1] - x[i]^2)^2 + (x[i] - 1)^2

end

return s

end

## rosen (generic function with 1 method)

使用Ipopt作为求解器定义优化模型,

using JuMP; using Ipopt

m = Model(solver = IpoptSolver())

## Feasibility problem with:

## * 0 linear constraints

## * 0 variables

## Solver is Ipopt

以及具有约束约束和起始值的变量 x[i] = 0.1 :

@variable(m, 0.0 <= x[1:10] <= 0.5)

for i in 1:10 setvalue(x[i], 0.1); end

现在我明白我必须注册目标函数 .

JuMP.register(m, :rosen, 10, rosen, autodiff=true)

我不确定这里是否可以这样做,或者我是否需要定义和注册 mysquare 函数,就像在JuMP手册的"User-defined Functions"部分中所做的那样 .

@NLobjective(m, Min, rosen(x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]))

我怎么能更紧凑地写这个?一个表达式

@NLobjective(m, Min, rosen(x[1:10]))

##ERROR: Incorrect number of arguments for "rosen" in nonlinear expression.

给出错误 . 如果我想用100个变量来解决这个问题怎么办?

现在我们解决这个模型问题了,唉,它回归了一个解决方案,而且正如我所知,通过NEOS IPOPT求解器解决它的确是正确的解决方案 .

sol = solve(m);

## ...

## EXIT: Optimal Solution Found.

因为我只对x [10]的确切值感兴趣,所以提取它:

getvalue(x[10]

## 0.00010008222367154784

这可以以某种方式简化吗?想想用MATLAB中的 fminsearch 或R中的 optim 解决这个问题是多么容易 .

R> optim(rep(0.1,10), fnRosenbrock, method="L-BFGS-B",

lower=rep(0.0,10), upper=rep(0.5,10),

control=list(factr=1e-12, maxit=5000))

## $par

## [1] 0.50000000 0.26306537 0.08003061 0.01657414 0.01038065

## [6] 0.01021197 0.01020838 0.01020414 0.01000208 0.00000000

当然,除了它说 $par[10] 是0.0,这是不正确的 .

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值