无约束优化工具箱

本文通过多种标准测试函数,如Extended Freudenstein&Roth、Extended Trigonometric等,比较了梯度下降法、牛顿法、拟牛顿法及信赖域法等多种无约束优化算法的性能表现。
摘要由CSDN通过智能技术生成

无约束优化工具箱

# import packages
%matplotlib inline
import sympy as sp
import matplotlib.pyplot as plt
import optimtool as oo
def train(funcs, args, x_0):
    f_list = []
    title = ["gradient_descent_barzilar_borwein", "newton_CG", "newton_quasi_L_BFGS", "trust_region_steihaug_CG"]
    colorlist = ["maroon", "teal", "slateblue", "orange"]
    _, _, f = oo.unconstrain.gradient_descent.barzilar_borwein(funcs, args, x_0, False, True)
    f_list.append(f)
    _, _, f = oo.unconstrain.newton.CG(funcs, args, x_0, False, True)
    f_list.append(f)
    _, _, f = oo.unconstrain.newton_quasi.L_BFGS(funcs, args, x_0, False, True)
    f_list.append(f)
    _, _, f = oo.unconstrain.trust_region.steihaug_CG(funcs, args, x_0, False, True)
    f_list.append(f)
    return colorlist, f_list, title
# 可视化函数:传参接口(颜色列表,函数值列表,标题列表)
def test(colorlist, f_list, title):
    handle = []
    for j, z in zip(colorlist, f_list):
        ln, = plt.plot([i for i in range(len(z))], z, c=j, marker='o', linestyle='dashed')
        handle.append(ln)
    plt.xlabel("$Iteration \ times \ (k)$")
    plt.ylabel("$Objective \ function \ value: \ f(x_k)$")
    plt.legend(handle, title)
    plt.title("Performance Comparison")
    return None

Extended Freudenstein & Roth function

f ( x ) = ∑ i = 1 n / 2 ( − 13 + x 2 i − 1 + ( ( 5 − x 2 i ) x 2 i − 2 ) x 2 i ) 2 + ( − 29 + x 2 i − 1 + ( ( x 2 i + 1 ) x 2 i − 14 ) x 2 i ) 2 , x 0 = [ 0.5 , − 2 , 0.5 , − 2 , . . . , 0.5 , − 2 ] . f(x)=\sum_{i=1}^{n/2}(-13+x_{2i-1}+((5-x_{2i})x_{2i}-2)x_{2i})^2+(-29+x_{2i-1}+((x_{2i}+1)x_{2i}-14)x_{2i})^2, x_0=[0.5, -2, 0.5, -2, ..., 0.5, -2]. f(x)=i=1n/2(13+x2i1+((5x2i)x2i2)x2i)2+(29+x2i1+((x2i+1)x2i14)x2i)2,x0=[0.5,2,0.5,2,...,0.5,2].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = (-13 + x[0] + ((5 - x[1])*x[1] - 2)*x[1])**2 + \
    (-29 + x[0] + ((x[1] + 1)*x[1] - 14)*x[1])**2 + \
    (-13 + x[2] + ((5 - x[3])*x[3] - 2)*x[3])**2 + \
    (-29 + x[2] + ((x[3] + 1)*x[3] - 14)*x[3])**2
x_0 = (1, -1, 1, -1) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Extended Trigonometric function:

f ( x ) = ∑ i = 1 n ( ( n − ∑ j = 1 n cos ⁡ x j ) + i ( 1 − cos ⁡ x i ) − sin ⁡ x i ) 2 , x 0 = [ 0.2 , 0.2 , . . . , 0.2 ] f(x)=\sum_{i=1}^{n}((n-\sum_{j=1}^{n}\cos x_j)+i(1-\cos x_i)-\sin x_i)^2, x_0=[0.2, 0.2, ...,0.2] f(x)=i=1n((nj=1ncosxj)+i(1cosxi)sinxi)2,x0=[0.2,0.2,...,0.2]

# make data(2 dimension)
x = sp.symbols("x1:3")
f = (2 - (sp.cos(x[0]) + sp.cos(x[1])) + (1 - sp.cos(x[0])) - sp.sin(x[0]))**2 + \
    (2 - (sp.cos(x[0]) + sp.cos(x[1])) + 2 * (1 - sp.cos(x[1])) - sp.sin(x[1]))**2
x_0 = (0.1, 0.1) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Extended Rosenbrock function

f ( x ) = ∑ i = 1 n / 2 c ( x 2 i − x 2 i − 1 2 ) 2 + ( 1 − x 2 i − 1 ) 2 , x 0 = [ − 1.2 , 1 , . . . , − 1.2 , 1 ] . c = 100 f(x)=\sum_{i=1}^{n/2}c(x_{2i}-x_{2i-1}^2)^2+(1-x_{2i-1})^2, x_0=[-1.2, 1, ...,-1.2, 1]. c=100 f(x)=i=1n/2c(x2ix2i12)2+(1x2i1)2,x0=[1.2,1,...,1.2,1].c=100

# make data(4 dimension)
x = sp.symbols("x1:5")
f = 100 * (x[1] - x[0]**2)**2 + \
    (1 - x[0])**2 + \
    100 * (x[3] - x[2]**2)**2 + \
    (1 - x[2])**2
x_0 = (-2, 2, -2, 2) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Generalized Rosenbrock function

f ( x ) = ∑ i = 1 n − 1 c ( x i + 1 − x i 2 ) 2 + ( 1 − x i ) 2 , x 0 = [ − 1.2 , 1 , . . . , − 1.2 , 1 ] , c = 100. f(x)=\sum_{i=1}^{n-1}c(x_{i+1}-x_i^2)^2+(1-x_i)^2, x_0=[-1.2, 1, ...,-1.2, 1], c=100. f(x)=i=1n1c(xi+1xi2)2+(1xi)2,x0=[1.2,1,...,1.2,1],c=100.

# make data(2 dimension)
x = sp.symbols("x1:3")
f = 100 * (x[1] - x[0]**2)**2 + (1 - x[0])**2
x_0 = (-1, 0.5) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Extended White & Holst function

f ( x ) = ∑ i = 1 n / 2 c ( x 2 i − x 2 i − 1 3 ) 2 + ( 1 − x 2 i − 1 ) 2 , x 0 = [ − 1.2 , 1 , . . . , − 1.2 , 1 ] . c = 100 f(x)=\sum_{i=1}^{n/2}c(x_{2i}-x_{2i-1}^3)^2+(1-x_{2i-1})^2, x_0=[-1.2, 1, ...,-1.2, 1]. c=100 f(x)=i=1n/2c(x2ix2i13)2+(1x2i1)2,x0=[1.2,1,...,1.2,1].c=100

# make data(4 dimension)
x = sp.symbols("x1:5")
f = 100 * (x[1] - x[0]**3)**2 + \
    (1 - x[0])**2 + \
    100 * (x[3] - x[2]**3)**2 + \
    (1 - x[2])**2
x_0 = (-1, 0.5, -1, 0.5) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Extended Penalty function

f ( x ) = ∑ i = 1 n − 1 ( x i − 1 ) 2 + ( ∑ j = 1 n x j 2 − 0.25 ) 2 , x 0 = [ 1 , 2 , . . . , n ] . f(x)=\sum_{i=1}^{n-1} (x_i-1)^2+(\sum_{j=1}^{n}x_j^2-0.25)^2, x_0=[1,2,...,n]. f(x)=i=1n1(xi1)2+(j=1nxj20.25)2,x0=[1,2,...,n].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = (x[0] - 1)**2 + (x[1] - 1)**2 + (x[2] - 1)**2 + \
    ((x[0]**2 + x[1]**2 + x[2]**2 + x[3]**2) - 0.25)**2
x_0 = (5, 5, 5, 5) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Perturbed Quadratic function

f ( x ) = ∑ i = 1 n i x i 2 + 1 100 ( ∑ i = 1 n x i ) 2 , x 0 = [ 0.5 , 0.5 , . . . , 0.5 ] . f(x)=\sum_{i=1}^{n}ix_i^2+\frac{1}{100}(\sum_{i=1}^{n}x_i)^2, x_0=[0.5,0.5,...,0.5]. f(x)=i=1nixi2+1001(i=1nxi)2,x0=[0.5,0.5,...,0.5].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = x[0]**2 + 2*x[1]**2 + 3*x[2]**2 + 4*x[3]**2 + \
    0.01 * (x[0] + x[1] + x[2] + x[3])**2
x_0 = (1, 1, 1, 1) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Raydan 1 function

f ( x ) = ∑ i = 1 n i 10 ( exp ⁡ x i − x i ) , x 0 = [ 1 , 1 , . . . , 1 ] . f(x)=\sum_{i=1}^{n}\frac{i}{10}(\exp{x_i}-x_i), x_0=[1,1,...,1]. f(x)=i=1n10i(expxixi),x0=[1,1,...,1].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = 0.1 * (sp.exp(x[0]) - x[0]) + \
    0.2 * (sp.exp(x[1]) - x[1]) + \
    0.3 * (sp.exp(x[2]) - x[2]) + \
    0.4 * (sp.exp(x[3]) - x[3])
x_0 = (0.5, 0.5, 0.5, 0.5) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Raydan 2 function

f ( x ) = ∑ i = 1 n ( exp ⁡ x i − x i ) , x 0 = [ 1 , 1 , . . . , 1 ] . f(x)=\sum_{i=1}^{n}(\exp{x_i}-x_i), x_0=[1,1,...,1]. f(x)=i=1n(expxixi),x0=[1,1,...,1].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = (sp.exp(x[0]) - x[0]) + \
    (sp.exp(x[1]) - x[1]) + \
    (sp.exp(x[2]) - x[2]) + \
    (sp.exp(x[3]) - x[3])
x_0 = (2, 2, 2, 2) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Diagonal 1 function

f ( x ) = ∑ i = 1 n ( exp ⁡ x i − i x i ) , x 0 = [ 1 / n , 1 / n , . . . , 1 / n ] . f(x)=\sum_{i=1}^{n}(\exp{x_i}-ix_i), x_0=[1/n,1/n,...,1/n]. f(x)=i=1n(expxiixi),x0=[1/n,1/n,...,1/n].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = (sp.exp(x[0]) - x[0]) + \
    (sp.exp(x[1]) - 2 * x[1]) + \
    (sp.exp(x[2]) - 3 * x[2]) + \
    (sp.exp(x[3]) - 4 * x[3])
x_0 = (0.5, 0.5, 0.5, 0.5) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Diagonal 2 function

f ( x ) = ∑ i = 1 n ( exp ⁡ x i − x i i ) , x 0 = [ 1 / 1 , 1 / 2 , . . . , 1 / n ] . f(x)=\sum_{i=1}^{n}(\exp{x_i}-\frac{x_i}{i}), x_0=[1/1,1/2,...,1/n]. f(x)=i=1n(expxiixi),x0=[1/1,1/2,...,1/n].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = (sp.exp(x[0]) - x[0]) + \
    (sp.exp(x[1]) - x[1] / 2) + \
    (sp.exp(x[2]) - x[2] / 3) + \
    (sp.exp(x[3]) - x[3] / 4)
x_0 = (0.9, 0.6, 0.4, 0.3) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Diagonal 3 function

f ( x ) = ∑ i = 1 n ( exp ⁡ x i − i sin ⁡ ( x i ) ) , x 0 = [ 1 , 1 , . . . , 1 ] . f(x)=\sum_{i=1}^{n}(\exp{x_i}-i\sin(x_i)), x_0=[1,1,...,1]. f(x)=i=1n(expxiisin(xi)),x0=[1,1,...,1].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = (sp.exp(x[0]) - sp.sin(x[0])) + \
    (sp.exp(x[1]) - 2 * sp.sin(x[1])) + \
    (sp.exp(x[2]) - 3 * sp.sin(x[2])) + \
    (sp.exp(x[3]) - 4 * sp.sin(x[3]))
x_0 = (0.5, 0.5, 0.5, 0.5) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Hager function

f ( x ) = ∑ i = 1 n ( exp ⁡ x i − i x i ) , x 0 = [ 1 , 1 , . . . , 1 ] . f(x)=\sum_{i=1}^{n}(\exp{x_i}-\sqrt{i}x_i), x_0=[1,1,...,1]. f(x)=i=1n(expxii xi),x0=[1,1,...,1].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = (sp.exp(x[0]) - x[0]) + \
    (sp.exp(x[1]) - sp.sqrt(2) * x[1]) + \
    (sp.exp(x[2]) - sp.sqrt(3) * x[2]) + \
    (sp.exp(x[3]) - sp.sqrt(4) * x[3])
x_0 = (0.5, 0.5, 0.5, 0.5) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Generalized Tridiagonal 1 function

f ( x ) = ∑ i = 1 n − 1 ( x i + x i + 1 − 3 ) 2 + ( x i − x i + 1 + 1 ) 4 , x 0 = [ 2 , 2 , . . . , 2 ] . f(x)=\sum_{i=1}^{n-1}(x_i+x_{i+1}-3)^2+(x_i-x_{i+1}+1)^4, x_0=[2,2,...,2]. f(x)=i=1n1(xi+xi+13)2+(xixi+1+1)4,x0=[2,2,...,2].

# make data(3 dimension)
x = sp.symbols("x1:4")
f = (x[0] + x[1] - 3)**2 + (x[0] - x[1] + 1)**4 + \
    (x[1] + x[2] - 3)**2 + (x[1] - x[2] + 1)**4
x_0 = (1, 1, 1) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Extended Tridiagonal 1 function:

f ( x ) = ∑ i = 1 n / 2 ( x 2 i − 1 + x 2 i − 3 ) 2 + ( x 2 i − 1 − x 2 i + 1 ) 4 , x 0 = [ 2 , 2 , . . . , 2 ] . f(x)=\sum_{i=1}^{n/2}(x_{2i-1}+x_{2i}-3)^2+(x_{2i-1}-x_{2i}+1)^4, x_0=[2,2,...,2]. f(x)=i=1n/2(x2i1+x2i3)2+(x2i1x2i+1)4,x0=[2,2,...,2].

# make data(2 dimension)
x = sp.symbols("x1:3")
f = (x[0] + x[1] - 3)**2 + (x[0] - x[1] + 1)**4
x_0 = (1, 1) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)

Extended TET function : (Three exponential terms)

f ( x ) = ∑ i = 1 n / 2 ( ( exp ⁡ x 2 i − 1 + 3 x 2 i − 0.1 ) + exp ⁡ ( x 2 i − 1 − 3 x 2 i − 0.1 ) + exp ⁡ ( − x 2 i − 1 − 0.1 ) ) , x 0 = [ 0.1 , 0.1 , . . . , 0.1 ] . f(x)=\sum_{i=1}^{n/2}((\exp x_{2i-1} + 3x_{2i} - 0.1) + \exp (x_{2i-1} - 3x_{2i} - 0.1) + \exp (-x_{2i-1}-0.1)), x_0=[0.1,0.1,...,0.1]. f(x)=i=1n/2((expx2i1+3x2i0.1)+exp(x2i13x2i0.1)+exp(x2i10.1)),x0=[0.1,0.1,...,0.1].

# make data(4 dimension)
x = sp.symbols("x1:5")
f = sp.exp(x[0] + 3*x[1] - 0.1) + sp.exp(x[0] - 3*x[1] - 0.1) + sp.exp(-x[0] - 0.1) + \
    sp.exp(x[2] + 3*x[3] - 0.1) + sp.exp(x[2] - 3*x[3] - 0.1) + sp.exp(-x[2] - 0.1)
x_0 = (0.2, 0.2, 0.2, 0.2) # Random given
# train
color, values, title = train(funcs=f, args=x, x_0=x_0)
# test
test(color, values, title)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeGLMath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值