首页 > 其他分享 >非线性规划——Pyhton库的实现

非线性规划——Pyhton库的实现

时间:2024-01-14 23:27:16浏览次数:29  
标签:约束条件 函数 minimize 优化 非线性 Pyhton 算法 规划 optimize

非线性规划(Nonlinear Programming,简称NLP)是一种优化问题的数学形式,其中目标函数或约束条件中至少有一个是非线性的。优化问题的目标是找到一组变量的取值,使得目标函数在满足一系列约束条件的情况下达到最小值或最大值。在非线性规划中,目标函数和约束条件可以包含平方项、绝对值、指数函数等非线性项,与线性规划相比,这使得问题更为复杂。非线性规划问题的求解可以借助各种优化算法,其中包括梯度下降法、拟牛顿法、全局优化方法等。这些方法旨在在搜索空间中寻找局部或全局最优解,具体选择取决于问题的性质和求解的需求。非线性规划在众多实际问题中发挥着重要作用,例如在工程、经济、金融和科学领域。非线性规划(求极值),从处理方法来说,可以尝试以下几种:纯数学方法,求导求极值;使用神经网络,深度学习来处理,可参考反向传播算法中链式求导的过程;寻找一些python库来做,这里介绍scipy.optimize.minimize的使用方法在Python中,scipy.optimize模块提供了用于求解非线性规划问题的丰富工具。

一、非线性规划的标准型

非线性规划的标准形式:

\[minf(x) \\ s.t.\begin{cases} h_j(x) \geq 0, &j=1,q\\ g_i(x) = 0, &i=1,p \end{cases} \]

其中:\(x=[x_1,...,x_n]^T\)为决策变量,\(f(x)\) 为目标函数,\(h_j(x)\) 和 \(g_i(x)\) 为约束条件。

非线性规划问题实际上就是带有约束条件的非线性函数优化问题。按照我们的学习模式,非线性规划问题的建模和求解与线性规划问题是类似的,按照以下步骤进行:

问题定义,确定决策变量、目标函数和约束条件;
模型构建,由问题描述建立数学方程,并转化为标准形式的数学模型;
模型求解,用标准模型的优化算法对模型求解,得到优化结果。

二、Scipy库简介

Scipy 是一个基于 NumPy 构建的开源科学计算库,提供了许多用于数学、科学和工程的高级工具和算法。它包含了众多子模块,包括插值、积分、优化、信号处理、统计等,涵盖了科学计算的广泛领域。scipy 的目标是为科学家、工程师和研究人员提供强大而灵活的工具,帮助他们解决复杂的问题。通过 scipy,用户可以方便地访问许多数值计算和优化算法,以及统计和信号处理等领域的功能,从而加速科学研究和工程开发。
Scipy库在线帮助网址

2.1 Scipy 求解非线性规划问题的函数

Scipy 是 Python 算法库和数学工具包,包括最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号和图像处理、常微分方程求解等模块。Scipy 工具包中的 optimize 模块求解常见的非线性规划问题。

  • brent():单变量无约束优化问题,混合使用牛顿法/二分法。
  • fmin():多变量无约束优化问题,使用单纯性法,只需要利用函数值,不需要函数的导数或二阶导数。
  • leatsq():非线性最小二乘问题,用于求解非线性最小二乘拟合问题。
  • minimize():约束优化问题,使用拉格朗日乘子法将约束优化转化为无约束优化问题。

2.2 scipy.optimize.brent()求解单变量无约束优化问题

非线性规划最简单的形式是一维搜索,一维搜索的常用方法是函数逼近法和区间收缩法。brent() 函数是 SciPy.optimize 模块中求解单变量无约束优化问题最小值的首选方法。这是牛顿法和二分法的混合方法,既能保证稳定性又能快速收敛。

scipy.optimize.brent(func, args=(), brack=None, tol=1.48e-08, full_output=0, maxiter=500)

optimize.brent() 的主要参数:

  • func: callable f(x,*args):目标函数 \(f(x)\),以函数形式表示,可以通过 *args 传递参数;
  • args: tuple: 可选项,以$f(x,*args) \(的形式将可变参数\)p\(传递给目标函数\)f(x,p)$;
  • brack: tuple:可选项,搜索算法的开始区间(不是指\(x\)的上下限)

optimize.brent() 的主要返回值:

  • **xmin: **返回函数达到最小值时的 \(x\)(注意是局部最优,不一定是全局最优);
  • **fval: **返回函数的最优值(默认不返回,仅当full_output 为 1 时返回)。
from scipy.optimize import brent, fmin_ncg, minimize
import numpy as np

#Demo1:单变量无约束优化问题(Scipy.optimize.brent)
def objf(x):  # 目标函数
    fx = x**2 - 8*np.sin(2*x+np.pi)
    return fx

xIni = -5.0
xOpt= brent(objf, brack=(xIni,2))
print("xIni={:.4f}\tfxIni={:.4f}".format(xIni,objf(xIni))
print("xOpt={:.4f}\tfxOpt={:.4f}".format(xOpt,objf(xOpt)))

2.3 scipy.optimize.fmin() 求解多变量无约束优化问题

多变量无约束优化问题的算法很多,分类方式也很多。从使用者的角度来说可以分为:只使用目标函数值、使用导数(梯度下降法)、使用二阶导数。大体来说,使用导数的算法收敛较快,使用二阶导数收敛更快,但是收敛快也容易陷入局部最优。fmin() 函数是 SciPy.optimize 模块中求解多变量无约束优化问题(最小值)的首选方法,采用下山单纯性方法。下山单纯性方法又称 Nelder-Mead 法,只使用目标函数值,不需要导数或二阶导数值,是最重要的多维无约束优化问题数值方法之一。

scipy.optimize.fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, initial_simplex=None)

optimize.fmin() 的主要参数

  • func: callable f(x,*args): 目标函数\(f(x)\)以函数形式表示,可以通过 *args 传递参数。
  • x0: nadarray搜索算法的初值。
  • args: tuple可选项,以 f(x,*args) 的形式将可变参数\(p\)传递给目标函数\(f(x,p)\)。

optimize.fmin() 的主要返回值

  • **xopt: **返回最小值时的 \(x\) 值;
  • **fopt: **返回最小值时的目标函数值,fopt=func(xopt)。

from scipy.optimize import fmin
import numpy as np
# Rosenbrock 测试函数
def objf2(x):  # Rosenbrock benchmark function
    fx = sum(100.0 * (x[1:] - x[:-1] ** 2.0) ** 2.0 + (1 - x[:-1]) ** 2.0)
    return fx

# 初始化优化变量
xIni = .array([-2, -2])

# 使用 fmin 函数进行优化
xOpt = fmin(objf2, xIni)

# 打印结果
print("Initial guess: xIni={}, fxIni={:.4f}".format(xIni, objf2(xIni)))
print("Optimal solution: xOpt={}, fxOpt={:.4f}".format(xOpt, objf2(xOpt)))

三、Scipy.optimize.minimize() 求解非线性规划问题

3.1 scipy.optimize.minimize() 函数说明

minimize() 函数是 SciPy.optimize 模块中求解多变量优化问题的通用方法,可以调用多种算法,支持约束优化和无约束优化。

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

optimize.minimize() 的主要参数:

参数 说明
fun: callable f(x,*args) 目标函数\(f(x)\),以函数形式表示,可以通过 args 传递参数
x0: nadarray, shape(n,) 搜索算法的初值,n 是决策变量个数
args: tuple 可选项,将可变参数传递给目标函数 fun、导数函数 jac 和二阶导数函数 hess
method: str 可选项,选择优化算法。默认算法为 BFGS, L-BFGS-B, SLSQP(取决于问题有没有边界条件和约束条件)
jac 可选项,梯度计算方法。可以以函数形式表示,或选择 '2-point', '3-point', 'cs'。该选项只能用于 CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg, trust-krylov, trust-exact 和 trust-constr 算法
hess 可选项,Hessian 矩阵计算方法。可以以函数形式表示,或选择 '2-point', '3-point', 'cs'。该选项只能用于 Newton-CG, dogleg, trust-ncg, trust-krylov, trust-exact 和 trust-constr 算法
bounds 可选项,变量的边界条件(上下限,lb<=x<=ub)。该选项只能用于 Nelder-Mead, L-BFGS-B, TNC, SLSQP, Powell 和 trust-constr 算法
constraints 可选项,定义约束条件 f(x)>=0。该选项只能用于 COBYLA, SLSQP 和 trust-constr 算法,注意不同算法中对于约束条件的定义是不同的

optimize.minimize() 的主要返回值:

参数 解释
res 返回优化结果,以对象方式表示,主要包括优化是否成功、决策变量的优化值 xOpt
optimize.minimize() 默认算法为 BFGS, L-BFGS-B, SLSQP(取决于问题有没有边界条件和约束条件),可以通过 "method=None" 选项调用多种算法
method=‘CG’ 非线性共轭梯度算法,只能处理无约束优化问题,需要使用一阶导数函数
method=‘BFGS’ BFGS 拟牛顿法,只能处理无约束优化问题,需要使用一阶导数函数。BFGS 算法性能良好,是无约束优化问题的默认算法
method=‘Newton-CG’ 截断牛顿法,只能处理无约束优化问题,需要使用一阶导数函数,适合处理大规模问题
method=‘dogleg’ dog-leg 信赖域算法,需要使用梯度和 Hessian(必须正定),只能处理无约束优化问题
method=‘trust-ncg’ 采用牛顿共轭梯度信赖域算法,需要使用梯度和 Hessian(必须正定),只能处理无约束优化问题,适合大规模问题
method=‘trust-exact’ 求解无约束极小化问题的信赖域方法,需要梯度和Hessian(不需要正定)
method=‘trust-krylov’ 使用Newton-GLTR 信赖域算法度,需要使用梯度和 Hessian(必须正定),只能处理无约束优化问题,适合中大规模问题
method=‘Nelder-Mead’ 下山单纯性法,可以处理边界约束条件(决策变量的上下限),只使用目标函数,不使用导数函数、二阶导数,鲁棒性强
method=‘L-BFGS-B’ 改进的 BFGS 拟牛顿法,L- 指有限内存,-B 指边界约束,可以处理边界约束条件,需要使用一阶导数函数。L-BFGS_B 算法性能良好,消耗内存量很小,适合处理大规模问题,是边界约束优化问题的默认算法
method=‘Powell’ 改进的共轭方向法,可以处理边界约束条件(决策变量的上下限)
method=‘TNC’ 截断牛顿法,可以处理边界约束条件
method=‘COBYLA’ 线性近似约束优化方法,通过对目标函数和约束条件的线性逼近处理非线性问题。只使用目标函数,不需要导数或二阶导数值,可以处理约束条件
method=‘SLSQP’ 序贯最小二乘规划算法,可以处理边界约束、等式约束和不等式约束条件。SLSQP 算法性能良好,是带有约束条件优化问题的默认算法
method=‘trust-constr’ 信赖域算法,通用的约束最优化方法,适合处理大规模问题

由于 optimize.minimize() 实际是多种算法的集成接口,各种算法对于问题、约束条件和参数的定义并不完全相同。我们还是针对数学建模的常用需求和小白的特点,结合实际案例来学习基本应用。

3.2Scipy.optimize.minimize()函数的应用

最小化目标函数:\(f(x) = 5x_1 - 2x_2 + x_3\)
约束条件:

\[x_1 + x_2 + x_3 = 1\\x_1^2 + x_2^2 + x_3^2 \leq 1 \\x_1 - x_3^2 \geq 0 \\-x_1 - x_2 - x_3 \geq -1 \]

在这个例子中,目标函数是一个线性函数,但是约束条件包括非线性函数。特别地,第三个约束条件是一个二次函数。这个问题可以通过使用数值优化算法来解决,使用scipy.optimize.minimize()函数。

import numpy as np
from scipy.optimize import minimize

# 定义目标函数和约束条件
def objective(x):
    return 5 * x[0] - 2 * x[1] + x[2]

def constraint1(x):
    return x[0] + x[1] + x[2] - 1

def constraint2(x):
    return 1 - x[0] ** 2 - x[1] ** 2 - x[2] ** 2

def constraint3(x):
    return x[0] - x[2] ** 2

def constraint4(x):
    return -x[0] - x[1] - x[2] + 1

# 定义初始点
x0 = np.array([0, 0, 0])

# 使用 SLSQP 算法求解非线性规划问题
solution = minimize(objective, x0, method='SLSQP', constraints=[
    {'fun': constraint1, 'type': 'eq'},
    {'fun': constraint2, 'type': 'ineq'},
    {'fun': constraint3, 'type': 'ineq'},
    {'fun': constraint4, 'type': 'ineq'}
])

print("Optimal solution:", solution.x)
print("Optimal value:", solution.fun)

四、约束非线性规划问题实例

4.1 非线性规划问题的数学模型1

\[minf(x) = ax_1^2 + bx_2^2 + cx_3^2 + d\\ s.t.\begin{cases} x_1^2 - x_2 + x_3^2 \geq 0\\ x_1 + x_2^2 + x_3^3 \leq 20\\ -x_1 - x_2^2 + 2 = 0\\ x_2 + 2x_3^2 = 3\\ x_1, x_2, x_3 \geq 0 \end{cases} \]

由于 minimize() 函数中对约束条件的形式定义为 f(x)>=0,因此要将问题的数学模型转换为标准形式:

\[minf(x) = ax_1^2 + bx_2^2 + cx_3^2 + d\\ s.t.\begin{cases} x_1^2 - x_2 + x_3^2 \geq 0\\ -x_1 - x_2^2 - x_3^3 +20\geq 0\\ -x_1 - x_2^2 + 2 = 0\\ x_2 + 2x_3^2 = 3\\ x_1, x_2, x_3 \geq 0 \end{cases} \]

程序说明:
在本例程中,目标函数中的参数 a, b, c, d 在子程序中直接赋值,这种实现方式最简单;
定义边界约束,即优化变量的上下限,用 minimize() 函数中的选项 bounds=bnds 进行定义。
定义约束条件:
- 本案例有 4个约束条件,2个等式约束、2个不等式约束,上节中已写成标准形式;
- 本例程将每个约束条件作为一个子函数定义,
- minimize() 函数对约束条件按照字典格式: {'type': 'ineq', 'fun': functionname} 进行定义。'type' 的键值可选 'eq' 和 'ineq',分别表示的是约束和不等式约束;functionname是定义约束条件的函数名。
求解最小化问题 res,其中目标函数 objF4 和搜索的初值点 x0 是必需的,指定优化方法和边界条件、约束条件是可选项。
通过调用最小化问题的返回值可以得到优化是否成功的说明(res.message)、自变量的优化值(res.x)和目标函数的优化值(res.fun)。

from scipy.optimize import brent, fmin, minimize
import numpy as np

#约束非线性规划问题(Scipy.optimize.minimize)
def objF4(x):  # 定义目标函数
    a, b, c, d = 1, 2, 3, 8
    fx = a*x[0]**2 + b*x[1]**2 + c*x[2]**2 + d
    return fx

# 定义约束条件函数
def constraint1(x):  # 不等式约束 f(x)>=0
    return x[0]** 2 - x[1] + x[2]**2
def constraint2(x):  # 不等式约束 转换为标准形式
    return -(x[0] + x[1]**2 + x[2]**3 - 20)
def constraint3(x):  # 等式约束
    return -x[0] - x[1]**2 + 2
def constraint4(x):  # 等式约束
    return x[1] + 2*x[2]**2 -3

# 定义边界约束
b = (0.0, None)
bnds = (b, b, b)

# 定义约束条件
con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'ineq', 'fun': constraint2}
con3 = {'type': 'eq', 'fun': constraint3}
con4 = {'type': 'eq', 'fun': constraint4}
cons = ([con1, con2, con3,con4])  # 3个约束条件

# 求解优化问题
x0 = np.array([1., 2., 3.])  # 定义搜索的初值
res = minimize(objF4, x0, method='SLSQP', bounds=bnds, constraints=cons)

print("Optimization problem (res):\t{}".format(res.message))  # 优化是否成功
print("xOpt = {}".format(res.x))  # 自变量的优化值
print("min f(x) = {:.4f}".format(res.fun))  # 目标函数的优化值

4.2 非线性规划的数学模型2

\[\min \quad \log_2(1+\frac{2x}{3})+\log_2(1+\frac{3y}{4}) \\\text{s.t.} \quad \log_2(1+\frac{2x}{5}) ≥ 5 \\\quad \quad \log_2(1+\frac{3y}{2}) ≥ 5 \]

from scipy.optimize import minimize
import numpy as np

fun = lambda x: np.log2(1+x[0]*2/3)+np.log2(1+x[1]*3/4)
x0 = np.array([0.5,0.5])

cons = [{'type':'ineq', 'fun':lambda x:np.log2(1+x[0]*2/5)-5},
        {'type':'ineq', 'fun':lambda x:np.log2(1+x[1]*3/2)-5}]

res = minimize(fun, x0, method='SLSQP', constraints=cons)
print(res.fun) # 9.763212360886708
print(res.x) # [77.5        20.66666658]

4.3 非线性规划问题的数学模型3

\[minf(x) = 10-x_1^2 -x_2^2\\ s.t.\begin{cases} -x_1^2 + x_2 \geq 0\\ x_1 + x_2 = 0\end{cases} \]

from scipy.optimize import minimize
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt

# 目标函数
def func(x):
    return 10 - x[0]**2 - x[1]**2

# 约束条件,包括不等式约束和等式约束
def con(x):
    return [x[1] - x[0]**2, x[0] + x[1]]

# 画三维模式图
def draw3D():
    fig = plt.figure()
    ax = Axes3D(fig)
    x_arange = np.arange(-5.0, 5.0)
    y_arange = np.arange(-5.0, 5.0)
    X, Y = np.meshgrid(x_arange, y_arange)
    Z1 = 10 - X**2 - Y**2
    Z2 = Y - X**2
    Z3 = X + Y
    plt.xlabel('x')
    plt.ylabel('y')
    ax.plot_surface(X, Y, Z1, rstride=1, cstride=1, cmap='rainbow')
    ax.plot_surface(X, Y, Z2, rstride=1, cstride=1, cmap='rainbow')
    ax.plot_surface(X, Y, Z3, rstride=1, cstride=1, cmap='rainbow')
    plt.show()

# 画等高线图
def drawContour():
    x_arange = np.linspace(-3.0, 4.0, 256)
    y_arange = np.linspace(-3.0, 4.0, 256)
    X, Y = np.meshgrid(x_arange, y_arange)
    Z1 = 10 - X**2 - Y**2
    Z2 = Y - X**2
    Z3 = X + Y
    plt.xlabel('x')
    plt.ylabel('y')
    plt.contourf(X, Y, Z1, 8, alpha=0.75, cmap='rainbow')
    plt.contourf(X, Y, Z2, 8, alpha=0.75, cmap='rainbow')
    plt.contourf(X, Y, Z3, 8, alpha=0.75, cmap='rainbow')
    C1 = plt.contour(X, Y, Z1, 8, colors='black')
    C2 = plt.contour(X, Y, Z2, 8, colors='blue')
    C3 = plt.contour(X, Y, Z3, 8, colors='red')
    plt.clabel(C1, inline=1, fontsize=10)
    plt.clabel(C2, inline=1, fontsize=10)
    plt.clabel(C3, inline=1, fontsize=10)
    plt.show()

if __name__ == "__main__":
    x0 = np.array((1.0, 2.0))  # 设置初始值
    res = minimize(func, x0, method='SLSQP', constraints={'type': 'eq', 'fun': con})
    print("Optimal value:", res.fun)
    print("Success:", res.success)
    print("Optimal solution:", res.x)

    # draw3D()
    drawContour()

总结

Scipy 工具包中的 minimize() 函数集成了多种求解线性规划问题的算法,可以处理边界条件和等式、不等式约束,对于常见的非线性规划问题都能获得较好的解。scipy.optimize 模块中的 minimize 函数是用于求解最小化目标函数的多功能工具。该函数支持对标量目标函数进行最小化,同时考虑等式和不等式约束。minimize 函数可以用于各种实际问题,包括机器学习、数据拟合、物理建模等。用户可以通过指定不同的算法、约束条件和初始猜测值来调整优化过程。一些常用的优化算法包括共轭梯度法(Conjugate Gradient)、BFGS(Broyden-Fletcher-Goldfarb-Shanno)等。

参考文献

  1. Python小白的数学建模课-12.非线性规划
  2. 非线性规划及Python实现
  3. 利用Scipy求解非线性规划问题
  4. python科学计算——scipy.optimize

标签:约束条件,函数,minimize,优化,非线性,Pyhton,算法,规划,optimize
From: https://www.cnblogs.com/haohai9309/p/17964175

相关文章

  • 2024-个人职业生涯规划
    2024-个人职业生涯规划一、认识自我1.个人基本情况我叫刘海涛,今年22岁,大四,就读于石家庄铁道大学软件工程专业。我来自一个普通的农民家庭,父母都是农民,他们对于我所学的专业以及未来的发展方向并不能给予指引,但是他们最大限度的尊重我的选择。在业余时间,我喜欢阅读、运动以及一......
  • 击败 8 名人类规划师:清华团队提出强化学习的城市空间规划模型
    作者:彬彬编辑:李宝珠,三羊清华大学研究团队提出了强化学习的城市社区空间规划模型与方法,并实现了人类规划师与人工智能算法协作的城市规划流程,为智能城市的自动化规划提供了全新思路。城市,不仅承载着人们对于安居乐业的热切期望,同时也是支撑各类经济活动的重要底座。从农耕时代到......
  • [转]电子对抗作战任务规划:战场平行仿真系统
    本文转自:微信公众号军桥网作战任务规划来源于美军,所对应的英文为“OperationPlanning/MissionPlanning”,此“OperationPlanning(OP)”与“MissionPlanning(MP)”是一个整体。美军对“OP”与“MP”均有详细定义,前者指战略、战役层指挥员对整体作战的行动谋划活动,后者指战术......
  • 非线性状态误差反馈NLSEF
    一、作用找到一种非线性的控制组合代替传统的PID控制器的线性组合,获得更有效的误差反馈控制率,只需将误差信号换成关于误差的非线性函数如fst函数(fhan函数)和fal函数等,可实现“小误差大增益,大误差小增益”的效果。二、理论分析有了跟踪微分器TD之后,我们就可以利用误差e1=v1-x1和误......
  • 开源大数据集群部署(一)集群实施规划
    作者:櫰木本次集群规划信息本次实际生产业务体量存在巨大差异,但集群规划内容相同,因此建议实际生产环境按照按照一定比例扩展即可。主机操作系统要求软件信息参数配置8C16G操作系统版本CentOSLinuxrelease7.8.2003(Core)java版本javaversion"1.8.0_281"......
  • Elasticsearch分片大小设定和集群容量规划
    本文以Elasticsearch7.9.2为准。分片大小日志类:单个分片不超过50G搜索类:单个分片不超过20G先估算总数据量,再根据分片大小,确定分片数。容量规划容量规划时要考虑的因素:机器的软硬件配置单个文档的尺寸,文档总数,索引大小,分片个数,副本个数文档写入方式(如bulk的单次数......
  • 执行pyhton的方式
    1执行python的两种方式1.1交互式,在cmd中运行优点:直接给出结果1+1输出2缺点:无法保存*jupyter对这种进行封装命令行式,通过在cmd中输入python3文本.txt文件,.py都可以优点:可以保存缺点:无法得到及时的报错反馈三个步骤1.编写python文件2.找到文件路径,只是相当于文本......
  • 软件测试/测试开发/全日制 |你知道该如何制定合理的职业规划吗?
    职业规划是每个职场人士都需要认真思考和制定的重要事项。无论你是刚入职场的新人,还是在职业生涯中迈入新的阶段,都需要有清晰的目标和规划,以更好地实现个人职业发展。我们为您提供了一个绝佳的机会参加【职业规划公开课】,让您从中受益匪浅。【职业规划公开课】即将开讲,我们邀请了霍......
  • Python入门学习规划
    新手学习Python,可以参考以下计划:基础概念学习(预计1周):熟悉Python的基本语法和数据类型(1天)学习控制流程(if、while、for等)(1天)学习函数和模块(1天)学习面向对象编程(类和对象)(1天)学习文件操作(1天)实战练习(预计2周):练习使用Python进行数据处理和科学计算(1周)练习使用Python进行网络编程(如WebS......
  • 【动态规划】【字符串】扰乱字符串
    作者推荐视频算法专题涉及知识点动态规划字符串LeetCode87扰乱字符串使用下面描述的算法可以扰乱字符串s得到字符串t:如果字符串的长度为1,算法停止如果字符串的长度>1,执行下述步骤:在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串s,则可以将其分......