【python】最优化方法之一维搜索(黄金分割法+斐波那契法)

文章目录

  • 1.概念
  • 2.遍历搜索
  • 3.优化算法
    • 3.1.一维搜索原则
    • 3.2.黄金分割法
      • Code Block
    • 3.3.斐波拉契法
      • Code Block

1.概念

\qquad一维搜索是最优化方法最简单的一种,即求一个在(a,b)内,连续下单峰函数f(x)f(x)f(x)的极小值。所谓下单峰函数就是只有一个极小值的函数。

2.遍历搜索

\qquad这个问题看似简单,我们只需要指定步长,从区间左端点搜索到右端点,每次根据步长新产生一个值,比对它和前两个值的大小。记录三个值从左到由依次为x1x_1x1,x2x_2x2,x3x_3x3,若出现x1&gt;x2&lt;x3x_1&gt;x_2&lt;x_3x1>x2<x3的情况,则说明极小值点必定落在(x1,x3)(x_1,x_3)x1,x3之间。因此如果指定了最终区间不得超过eps的话,那么搜索步长不得大于0.5eps。
我们很快就会发现,这种遍历法虽然算法简单,但是迭代次数多,浪费资源严重,因此我们需要更快地得到最终区间的方法。在最优化方法这个数学分支中,可以证明斐波拉契法是压缩比(在同样迭代次数下开始区间和最终区间的比值)最高的方法,黄金分割比相比它压缩比小一些,但是算法会比较简单,占用计算资源也会略少。

3.优化算法

3.1.一维搜索原则

\qquad首先在初始区间[a,b]中取两个点x1,x2(x1&lt;x2)x_1,x_2(x_1&lt;x_2)x1,x2(x1<x2),计算f(a),f(x1),f(x2),f(b)f(a),f(x_1),f(x_2),f(b)f(a),f(x1),f(x2),f(b)的值。由于f(x)f(x)f(x)在(a,b)为下单峰函数,即有唯一的极小值,因此a或b必定不是极小值点。
示例图
1.若f(x1)&lt;f(x2)f(x_1)&lt;f(x_2)f(x1)<f(x2)则说明(x1,x2)(x_1,x_2)(x1,x2)我下降段,极小值x∗x^*x点应该在x1x_1x1的右侧,因此修改查找区间为(x1,b)(x_1,b)(x1,b)
2.若f(x1)&gt;f(x2)f(x_1)&gt;f(x_2)f(x1)>f(x2)则说明(x1,x2)(x_1,x_2)(x1,x2)我上升段,极小值x∗x^*x点应该在x2x_2x2的左侧,因此修改查找区间为(a,x2)(a,x_2)(a,x2)
一维搜索算法的核心就是解决取x1和x2x_1和x_2x1x2的问题

3.2.黄金分割法

几何画板
\qquad设黄金分割比为k,取x1=b−(b−a)∗k,x2=a+(b−a)∗kx_1=b-(b-a)*k,x_2=a+(b-a)*kx1=b(ba)k,x2=a+(ba)k
在一维搜索中,如果满足条件1,那么需要在(x1,b)(x_1,b)(x1,b)取值。设ρ=1−k\rho=1-kρ=1k
CD‾=1−ρ,DE‾=ρ,EF‾=1−ρ\overline{CD}=1-\rho,\overline{DE}=\rho,\overline{EF}=1-\rhoCD=1ρ,DE=ρ,EF=1ρ由于在黄金分割比的作用下,1−ρ1=1−2ρ1−ρ\frac{1-\rho}{1}=\frac{1-2\rho}{1-\rho}11ρ=1ρ12ρ,因此DEGH=DEDF=DFCF=k≈0.618\frac{DE}{GH}=\frac{DE}{DF}=\frac{DF}{CF}=k≈0.618GHDE=DFDE=CFDF=k0.618
因此若将E点平移至GH线段,将G的横坐标当做a,H的横坐标当做b,它就相当于是x1x_1x1的位置,因此只需要计算x2=a+(b−a)∗k=b−(b−a)∗ρx_2=a+(b-a)*k=b-(b-a)*\rhox2=a+(ba)k=b(ba)ρ即可
同理,如果满足条件2,DEIJ=DECE=CECF=k≈0.618\frac{DE}{IJ}=\frac{DE}{CE}=\frac{CE}{CF}=k≈0.618IJDE=CEDE=CFCE=k0.618D点相当于IJ线段的x2x_2x2的位置,因此只需要计算x1=b−(b−a)∗k=a+(b−a)∗ρx_1=b-(b-a)*k=a+(b-a)*\rhox1=b(ba)k=a+(ba)ρ

Code Block

编写用户自定义函数的代码讲解参见以下链接:

[动态创建数学函数(CSDN])
以下为黄金分割法进行一维搜索的代码:

from math import *
import matplotlib.pyplot as plt
from pylab import *
# 通用函数f(x)靠用户录入
def function(x):fx = str_fx.replace("x", "%(x)f")  # 所有的"x"换为"%(x)function"return eval(fx % {"x": x})  # 字典类型的格式化字符串,将所有的"x"替换为变量x# 绘图函数:给定闭区间(绘图间隔),绘图间隔默认为0.05,若区间较小,请自行修改
def drawf(a,b,interp=0.05):x = [a+ele*interp for ele in range(0, int((b-a)/interp))]y = [function(ele) for ele in x]plt.figure(1)plt.plot(x, y)xlim(a, b)title(init_str, color="b")plt.show()# 黄金分割法进行一维搜索的函数
def gold_div_search(a,b,esp):data=list()x1=a+rou*(b-a)x2=b-rou*(b-a)data.append([a,x1,x2,b])while(b-a>esp):if function(x1)>function(x2):  #如果f(x1)>function(x2),则在区间(x1,b)内搜索a=x1x1=x2x2=b-rou*(b-a)plt.plot(x2,function(x2),'r*')elif function(x1)<function(x2):  #如果f(x1)<function(x2),则在区间(a,x2)内搜索b=x2x2=x1x1=a+rou*(b-a)plt.plot(x1,function(x1),'r*')else:  #如果f(x1)=function(x2),则在区间(x1,x2)内搜索a=x1b=x2x1=a+rou*(b-a)x2=b-rou*(b-a)plt.plot(x1,function(x1),'r*',x2,function(x2),'r*')data.append([a,x1,x2,b])with open("一维搜索(黄金分割法).txt",mode="w",encoding="utf-8")as a_file: # 保存的txt文件在程序的同目录下for i in range(0,len(data)):a_file.write("%d:\t"%(i+1))for j in range(0,4):a_file.write("function(%.3f)=%.3f\t"%(data[i][j],function(data[i][j])))a_file.write("\n")print("写入文件成功!")return [a,b]rou = 1-(sqrt(5)-1)/2  # 1-rou为黄金分割比
init_str = input("请输入一个函数,默认变量为x:\n")  # 输入的最初字符串
para=input("请依次输入一维搜索的区间a,b和最终区间的精确值(用空格分隔)").split() # 导入区间
para=[float(ele) for ele in para]
a,b,esp=para
str_fx = init_str.replace("^", "**")  # 将所有的“^"替换为python的幂形式"**"
gold_div_search(a,b,esp)  # 调用黄金分割法并保存文件
drawf(a,b,(b-a)/2000)  # 绘制函数图形

以下为交互式界面的效果:(请在Shell或Pycharm中的Python Console里面运行)

    请输入一个函数,默认变量为x:atan(x)-log(2*x+1)+4*x**2-3*x请依次输入一维搜索的区间a,b和最终区间的精确值(用空格分隔)0 1 0.001写入文件成功!

文本文档数据:(如用此程序运行,保存的文本文档与程序同目录

1: f(0.000)=0.0000000 f(0.382)=-0.7649875 f(0.618)=-0.5773825 f(1.000)=0.6867859
2: f(0.000)=0.0000000 f(0.236)=-0.6401822 f(0.382)=-0.7649875 f(0.618)=-0.5773825
3: f(0.236)=-0.6401822 f(0.382)=-0.7649875 f(0.472)=-0.7485370 f(0.618)=-0.5773825
4: f(0.236)=-0.6401822 f(0.326)=-0.7399126 f(0.382)=-0.7649875 f(0.472)=-0.7485370
5: f(0.326)=-0.7399126 f(0.382)=-0.7649875 f(0.416)=-0.7669244 f(0.472)=-0.7485370
6: f(0.382)=-0.7649875 f(0.416)=-0.7669244 f(0.438)=-0.7630202 f(0.472)=-0.7485370
7: f(0.382)=-0.7649875 f(0.403)=-0.7673941 f(0.416)=-0.7669244 f(0.438)=-0.7630202
8: f(0.382)=-0.7649875 f(0.395)=-0.7669382 f(0.403)=-0.7673941 f(0.416)=-0.7669244
9: f(0.395)=-0.7669382 f(0.403)=-0.7673941 f(0.408)=-0.7673906 f(0.416)=-0.7669244
10: f(0.395)=-0.7669382 f(0.400)=-0.7672874 f(0.403)=-0.7673941 f(0.408)=-0.7673906
11: f(0.400)=-0.7672874 f(0.403)=-0.7673941 f(0.405)=-0.7674185 f(0.408)=-0.7673906
12: f(0.403)=-0.7673941 f(0.405)=-0.7674185 f(0.406)=-0.7674176 f(0.408)=-0.7673906
13: f(0.403)=-0.7673941 f(0.404)=-0.7674129 f(0.405)=-0.7674185 f(0.406)=-0.7674176
14: f(0.404)=-0.7674129 f(0.405)=-0.7674185 f(0.406)=-0.7674196 f(0.406)=-0.7674176
15: f(0.405)=-0.7674185 f(0.406)=-0.7674196 f(0.406)=-0.7674194 f(0.406)=-0.7674176
16: f(0.405)=-0.7674185 f(0.405)=-0.7674193 f(0.406)=-0.7674196 f(0.406)=-0.7674194

可以看出我们的最终区间为(0.405,0.406),精度为0.001.
黄金分割法查找的点会被记录在matplotlib绘制的函数图像上,一目了然,可以看出,在最终区间精度为0.001的情况下,我们的算法收敛速度很快。
总览
图像2
\qquad绘图可以看出函数在极小点附近非常平坦,极小值点差不多在0.405的位置,与文本文档的数据一致。

3.3.斐波拉契法

\qquad斐波拉契法是一维搜索中压缩比最高的搜索算法。斐波拉契法基于斐波拉契数列产生比例值,斐波拉契数列{Fn}\lbrace F_n \rbrace{Fn}的定义如下:
F1=F2=1,Fn+2=Fn+1+FnF_1=F_2=1,F_{n+2}=F_{n+1}+F_{n}F1=F2=1,Fn+2=Fn+1+Fn
取分点时,x1=a+Fn−2Fn(b−a),x2=a+Fn−1Fn(b−a)x_1=a+\frac{F_{n-2}}{F_n}(b-a),x_2=a+\frac{F_{n-1}}{F_n}(b-a)x1=a+FnFn2(ba),x2=a+FnFn1(ba)

{x1−a=Fn−2Fn(b−a)x2−a=Fn−1Fn(b−a)x2−x1=Fn−1−Fn−2Fn(b−a)=Fn−3Fn(b−a)b−x2=Fn−Fn−1Fn(b−a)=Fn−2Fn(b−a)\begin{cases} x_1-a=\frac{F_{n-2}}{F_n}(b-a) \\x_2-a=\frac{F_{n-1}}{F_n}(b-a) \\x_2-x_1=\frac{F_{n-1}-F_{n-2}}{F_n}(b-a)=\frac{F_{n-3}}{F_n}(b-a) \\b-x_2=\frac{F_{n}-F_{n-1}}{F_n}(b-a)=\frac{F_{n-2}}{F_n}(b-a) \end{cases}x1a=FnFn2(ba)x2a=FnFn1(ba)x2x1=FnFn1Fn2(ba)=FnFn3(ba)bx2=FnFnFn1(ba)=FnFn2(ba)

几何画板
1.若x1<x2x_1<x_2x1x2,则取新区间为[a,x2][a,x_2][a,x2],则DE‾=Fn−3Fn(b−a),IJ‾=Fn−1Fn(b−a),CD‾=Fn−2Fn(b−a),CDIJ=Fn−2Fn−1,因此D相当于IJ中的x2的位置只需要再取x1=a+Fn−3Fn−1(b−a)即可\overline{DE}=\frac{F_{n-3}}{F_n}(b-a),\overline{IJ}=\frac{F_{n-1}}{F_n}(b-a),\overline{CD}=\frac{F_{n-2}}{F_n}(b-a), \\ \frac{CD}{IJ}=\frac{F_{n-2}}{F_{n-1}},因此D相当于IJ中的x_2的位置\\只需要再取x_1=a+\frac{F_{n-3}}{F_{n-1}}(b-a)即可DE=FnFn3(ba)IJ=FnFn1(ba),CD=FnFn2(ba),IJCD=Fn1Fn2DIJx2x1=a+Fn1Fn3(ba)

2.若x1&gt;x2x_1&gt;x_2x1>x2,则取新区间为[x1,b][x_1,b][x1,b],则DE‾=Fn−3Fn(b−a),GH‾=Fn−1Fn(b−a),CD‾=Fn−2Fn(b−a),DEGH=Fn−3Fn−1,因此D相当于GH中的x1的位置只需要再取x2=a+Fn−2Fn−1(b−a)即可\overline{DE}=\frac{F_{n-3}}{F_n}(b-a),\overline{GH}=\frac{F_{n-1}}{F_n}(b-a),\overline{CD}=\frac{F_{n-2}}{F_n}(b-a), \\ \frac{DE}{GH}=\frac{F_{n-3}}{F_{n-1}},因此D相当于GH中的x_1的位置\\只需要再取x_2=a+\frac{F_{n-2}}{F_{n-1}}(b-a)即可DE=FnFn3(ba)GH=FnFn1(ba),CD=FnFn2(ba),GHDE=Fn1Fn3DGHx1x2=a+Fn1Fn2(ba)

对于要求精度esp,取压缩比C=b−aesp,Fn=min{x∣x≥C,x∈N+}C=\frac{b-a}{esp},F_n=min\lbrace x|x≥C,x∈N^+\rbraceC=espbaFn=min{xxC,xN+},按照上述方法迭代至分母为F2F_2F2为止,最后按照以下方法进行:
在这里插入图片描述

Code Block

首先我们需要一个生产斐波那契数列(Fabonaci)的函数:

# 在本案例中,使用一次性生成斐波拉契列表的方法算法复杂度更低
# 生成的斐波拉契数列F(0)=0,F(1)=F(2)=1,剩余项和普通斐波拉契数列类似
def Fab_list(Fmax):a,b=0,1Fablist = [a,b]  # 返回一个列表while Fablist[-1]< Fmax:a,b = b,a+bFablist.append(b)return Fablist  

再按照斐波那契法迭代编写算法即可:
通用函数的编写仍然参考以下链接:
[动态创建数学函数(CSDN)]
注:需要安装matplotlib模块、pylab模块和Pillow模块,版本为python3

步骤:
Windows键+R,在【运行】窗口输入cmd并回车,在命令提示行下输入:
pip install matplotlib
pip install pylab
pip install Pillow
即可

from math import *
import matplotlib.pyplot as plt  # 绘图模块
from pylab import *  # 绘图辅助模块# 通用函数f(x)靠用户录入
def function(x):fx = str_fx.replace("x", "%(x)f")  # 所有的"x"换为"%(x)function"return eval(fx % {"x": x})  # 字典类型的格式化字符串,将所有的"x"替换为变量x# 绘图函数:给定闭区间(绘图间隔),绘图间隔默认为0.05,若区间较小,请自行修改
def drawf(a, b, interp=0.05):x = [a + ele * interp for ele in range(0, int((b - a) / interp))]y = [function(ele) for ele in x]plt.figure(1)plt.plot(x, y)xlim(a, b)title(init_str, color="b")  # 标注函数名plt.show()return "绘图完成!"# 在本案例中,使用一次性生成斐波拉契列表的方法算法复杂度更低
# 生成的斐波拉契数列F(0)=0,F(1)=F(2)=1,剩余项和普通斐波拉契数列类似
def Fab_list(Fmax):a,b=0,1Fablist = [a,b]  # 返回一个列表while Fablist[-1]< Fmax:a,b = b,a+bFablist.append(b)Fablist.pop()  # 舍掉最后一个元素return Fablist    def Fabonaci_search(a, b, Fab):n = len(Fab)-1  # 获取斐波那契数列的长度if n < 3:return "精度过低,无法进行斐波那契一维搜索"data = list()data.append([a, b])x1 = a + Fab[n - 2]/Fab[n] * (b - a)x2 = a + Fab[n - 1]/Fab[n] * (b - a)t = nwhile (t > 3):if function(x1) > function(x2):  # 如果f(x1)>f(x2),则在区间(x1,b)内搜索a = x1x1 = x2x2 = a + Fab[t - 1]/Fab[t] * (b - a)plt.plot(x2, function(x2), 'r*')data.append([x1, b])elif function(x1) < function(x2):  # 如果f(x1)<(x2),则在区间(a,x2)内搜索b = x2x2 = x1x1 = a + Fab[t - 2]/Fab[t]* (b - a)plt.plot(x1, function(x1), 'r*')data.append([a, x2])else:  # 如果f(x1)=function(x2),则在区间(x1,x2)内搜索a = x1b = x2x1 = a + Fab[t - 2]/Fab[t] * (b - a)x2 = a + Fab[t - 1]/Fab[t] * (b - a)plt.plot(x1, function(x1), 'r*', x2, function(x2), 'r*')data.append([x1, x2])t -= 1x1 = a + 0.5 * (b - a)  # 斐波那契数列第3项和第2项的比x2 = x1 + 0.1 * (b - a)  # 偏离一定距离,人工构造的点if function(x1) > function(x2):  # 如果f(x1)>function(x2),则在区间(x1,b)内搜索plt.plot(x2, function(x2), 'r*')data.append([x1, b])a = x1elif function(x1) < function(x2):  # 如果f(x1)<function(x2),则在区间(a,x2)内搜索plt.plot(x1, function(x1), 'r*')data.append([a, x2])b = x2else:  # 如果f(x1)=function(x2),则在区间(x1,x2)内搜索plt.plot(x1, function(x1), 'r*', x2, function(x2), 'r*')data.append([x1, x2])with open(r"C:\Users\ouni\桌面\一维搜索(黄金分割法).txt", mode="w", encoding="utf-8")as a_file:for i in range(0, len(data)):a_file.write("%d:\t" % (i + 1))for j in range(0, 2):a_file.write("f(%.3f)=%.7f\t" % (data[i][j], function(data[i][j])))a_file.write("\n")print("写入文件成功!")return [a, b]init_str = input("请输入一个函数,默认变量为x:\n")  # 输入的最初字符串
para = input("请依次输入一维搜索的区间a,b和最终区间的精确值(用空格分隔)").split()  # 导入区间
para = [float(ele) for ele in para]  # 将输入的字符串转换为浮点数
low, high, esp = para  # 输入参数列表(最小值、最大值和最终精度)
str_fx = init_str.replace("^", "**")  # 将所有的“^"替换为python的幂形式"**"
print(Fabonaci_search(low, high, Fab_list(int(ceil((high-low)/esp)))))  # 传入区间和斐波拉契列表
drawf(low, high, (high - low) / 2000)  # 默认精度是2000个点

以下代码请在交互式界面运行:

请输入一个函数,默认变量为x:
e^(-x)+x^2
请依次输入一维搜索的区间a,b和最终区间的精确值(用空格分隔)0 1 0.01
写入文件成功!
[0.3402663805075117, 0.35279320792829183]
关闭绘图框以继续交互式命令

文本文档如下:

1: f(0.000)=1.0000000 f(1.000)=1.3678794
2: f(0.000)=1.0000000 f(0.382)=0.8284208
3: f(0.236)=0.8454509 f(0.382)=0.8284208
4: f(0.382)=0.8284208 f(0.618)=0.9209301
5: f(0.382)=0.8284208 f(0.472)=0.8465897
6: f(0.236)=0.8454509 f(0.382)=0.8284208
7: f(0.326)=0.8280571 f(0.382)=0.8284208
8: f(0.236)=0.8454509 f(0.326)=0.8280571
9: f(0.292)=0.8320851 f(0.326)=0.8280571
10:f(0.326)=0.8280571 f(0.382)=0.8284208
11: f(0.326)=0.8280571 f(0.347)=0.8272109
12: f(0.347)=0.8272109 f(0.382)=0.8284208
13: f(0.347)=0.8272109 f(0.361)=0.8273036
14: f(0.326)=0.8280571 f(0.347)=0.8272109
15: f(0.340)=0.8273620 f(0.347)=0.8272109
16: f(0.347)=0.8272109 f(0.361)=0.8273036
17: f(0.347)=0.8272109 f(0.354)=0.8271921
18: f(0.340)=0.8273620 f(0.353)=0.8271855
}

图形如下:
在这里插入图片描述
在这里插入图片描述
可以看出函数的极小值确实在0.35附近,与文本文档标定的一致。
注:以上程序请在Shell或Cmd中运行,如需当做模块运行,请在主要程序的前面加上if __name__=="__main__"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL系列之E-1------MySQL主从复制原理

主从复制是异步复制,可以通过google的一个插件实现半同步E.1 主从复制原理1、建立主从复制的用户名和密码2、将master上主库需要进行复制的库“锁库”3、通过mysqldump备份master上主库&#xff0c;“解锁“&#xff0c;在slave端进行恢复4、更改配置文件5、在丛库上执行change…

工作中常用的 6 种设计模式!

前言 哈喽&#xff0c;大家好。平时我们写代码呢&#xff0c;多数情况都是流水线式写代码&#xff0c;基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢&#xff0c;我觉得&#xff0c;最好的方式就是&#xff1a;使用设计模式优化自己的业务代码。今天跟大家聊聊日常工作中…

【Matlab/C/Python/VB/...】代码复制到word时如何变成彩色的

文章目录下载Notepad复制代码在Notepad粘贴在word中粘贴下载Notepad Notepad是一款免费的Windows软件&#xff0c;一般Windows10和Windows7系统都已经自带&#xff0c;也可以在应用商店直接搜索下载 「win10系统兼容的是7.8版本」 复制代码 在语言编辑乱码复制代码&#xff…

hadoop 2.5.0安装和配置

安装hadoop要先做以下准备&#xff1a; 1.jdk&#xff0c;安装教程在 http://www.cnblogs.com/stardjyeah/p/4640917.html 2.ssh无密码验证&#xff0c;配置教程在 http://www.cnblogs.com/stardjyeah/p/4641524.html 3.linux静态ip配置&#xff0c;教程在 http://www.cnblo…

基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)

目录1.图像旋转的原理1.1.旋转矩阵1.2.双线性插值1.3.像素点匹配2.实现效果与说明1.图像旋转的原理 1.1.旋转矩阵 旋转一幅图像&#xff08;假设这幅图像大小是矩形的&#xff09;&#xff0c;当然应该从像素点&#xff08;pixels&#xff09;开始&#xff0c;在直角坐标系中…

漫画:给女朋友介绍什么是 “元宇宙” ?

什么是更高的自由度呢&#xff1f;或许有人觉得&#xff0c;我们在网络游戏当中&#xff0c;不是也很自由吗&#xff1f;想怎么玩就怎么玩。但是&#xff0c;无论一款网络游戏的元素有多么丰富&#xff0c;游戏当中的角色、任务、职业、道具、场景&#xff0c;都是游戏设计师预…

MyBatis 中为什么不建议使用 where 1=1?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;最近接手了一个老项目&#xff0c;“愉悦的心情”自然无以言表&#xff0c;做开发的朋友都懂&#xff0c;这里就不多说了&am…

【openMV与机器视觉】四旋翼飞行控制背景下的PID控制与摄像头算法简介

文章目录声明1.四旋翼飞行控制简介2.飞行控制算法2.1.接收机PWM生成2.2.PID算法位置PID速度PID3.摄像头算法3.1.图像处理3.2.霍夫曼变换3.3.巡线算法3.3.寻找目标点降落算法声明 \qquad本文的算法在openMV IDE例程的基础上进行原创&#xff0c;在比赛结束后予以发表&#xff1b…

聊聊sql优化的15个小技巧

前言sql优化是一个大家都比较关注的热门话题&#xff0c;无论你在面试&#xff0c;还是工作中&#xff0c;都很有可能会遇到。如果某天你负责的某个线上接口&#xff0c;出现了性能问题&#xff0c;需要做优化。那么你首先想到的很有可能是优化sql语句&#xff0c;因为它的改造…

【MATLAB】Parzen窗与K近邻算法原理与代码详解

文章目录1.非参数估计原理2.Parzen窗2.1.算法原理2.2.Matlab实现与参数探究3.K近邻3.1.算法原理3.2.Matlab实现与参数探究1.非参数估计原理 \qquad已知一个样本的概率分布时&#xff0c;我们只需要对概率分布中的参数进行估计即可得到该样本的概率密度函数。例如已知样本X服从正…

使用 Lambda 表达式实现超强的排序功能

我们在系统开发过程中&#xff0c;对数据排序是很常见的场景。一般来说&#xff0c;我们可以采用两种方式&#xff1a;借助存储系统&#xff08;SQL、NoSQL、NewSQL 都支持&#xff09;的排序功能&#xff0c;查询的结果即是排好序的结果查询结果为无序数据&#xff0c;在内存中…

【mongodb系统学习之四】查看mongodb进程

四、查看mongodb进程&#xff08;可以配合启动和关闭使用&#xff09;&#xff1a; 1&#xff09;、方法一&#xff1a;直接查看mongodb进程是否已经存在&#xff08;用上面的方式启动后&#xff0c;需要另开一个窗口操作&#xff09;&#xff1a;ps –ef|grep mongodb, 如图&a…

【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)

目录0.背景1.粒子群算法1.1.算法简介1.2.算法步骤1.3.算法举例2.PID自整定2.1.基于M文件编写的PID参数自整定*2.2.复杂系统的PID自整定&#xff08;基于simulink仿真&#xff09;2.2.1.PSO优化PID的过程详解2.2.2.在PSO优化过程中修改参数价值权重阅读前必看&#xff1a;本代码…

SpringBoot 使用注解实现消息广播功能

背景在开发工作中&#xff0c;会遇到一种场景&#xff0c;做完某一件事情以后&#xff0c;需要广播一些消息或者通知&#xff0c;告诉其他的模块进行一些事件处理&#xff0c;一般来说&#xff0c;可以一个一个发送请求去通知&#xff0c;但是有一种更好的方式&#xff0c;那就…

【Matlab】模式识别——聚类算法集锦

文章目录0.聚类分析简介0.1.简单的聚类样本生成器1.静态聚类算法1.1.最近邻聚类算法1.1.1.算法原理1.1.2.参考代码1.1.3.参数选择及运行结果1.2.最大最小距离法1.2.1.算法原理1.2.2.参考代码1.2.3.参数选择及运行结果2.动态聚类算法2.1.C均值聚类算法2.1.1.算法原理2.1.2.参考代…

【MATLAB】混合粒子群算法原理、代码及详解

目录1.算法1.1.原理1.2.性能比较1.3.步骤2.代码2.1.源码及注释2.2.执行与效果1.算法 1.1.原理 \qquad建议没接触过粒子群算法的朋友先看较为基础的全局粒子群算法原理及介绍&#xff0c;以下博文链接有详细的讲解、代码及其应用举例&#xff1a; 【Simulink】粒子群算法&#…

MVC HtmlHelper用法大全

HtmlHelper用来在视图中呈现 HTML 控件。 以下列表显示了当前可用的一些 HTML 帮助器。 本主题演示所列出的带有星号 (*) 的帮助器。 ActionLink - 链接到操作方法。 BeginForm * - 标记窗体的开头并链接到呈现该窗体的操作方法。 CheckBox * - 呈现复选框。 DropDownList *…

基于 MyBatis 手撸一个分表插件

背景事情是酱紫的&#xff0c;上级leader负责记录信息的业务&#xff0c;每日预估数据量是15万左右&#xff0c;所以引入sharding-jdbc做分表。上级leader完成业务的开发后&#xff0c;走了一波自测&#xff0c;git push后&#xff0c;就忙其他的事情去了。项目的框架是SpringB…

密码学哈希函数_哈希函数在密码学中的应用

密码学哈希函数A Hash Function is a mathematical function that converts a numerical value into another compressed numeric value. The input value for the hash functions can be of arbitrary length, but the output text that it will produce will always be of fi…

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

目录0.引言1.素材准备2.编程2.1.创建你的界面2.2.创建按钮2.3.鼠标操作2.3.1.单击特效2.3.2.光标感应2.3.3.进度条3.完整代码及效果0.引言 \qquad看了CSDN上很多关于C程序图形化界面的介绍&#xff0c;有的代码繁琐难解&#xff0c;不方便调试修改&#xff1b;有的不够详细。本…