原文链接: Python 优化 回溯下降算法

上一篇: windows Android sdk 配置

下一篇: iview 按需引入

使用sympy构造表达式,实现回溯下降算法

画出函数图像,先使用暴力搜索,找到最小值约为2.5左右

然后选定初始点,开始进行回溯搜索,下降方向为负梯度方向

下降的误差与步数大致呈现下面的状态

完整代码

from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from sympy import *
import math# 构造函数表达式
x1 = symbols('x1')
x2 = symbols('x2')
fx = E ** (x1 + 3 * x2 - 0.1) + E ** (x1 - 3 * x2 - 0.1) + E ** (-x1 - 0.1)
# 求偏导数
dx = diff(fx, x1)
dy = diff(fx, x2)# 显示函数图像
def show():fig = plt.figure()ax = Axes3D(fig)max_x = 1X = np.linspace(-max_x, max_x, 100)Y = np.linspace(-max_x, max_x, 100)Z = np.array([np.array([float(fx.evalf(subs={x1: i, x2: j}))for j in Y])for i in X])X, Y = np.meshgrid(X, Y)ax.plot_surface(X, Y, Z, rstride=3, cstride=3, cmap='rainbow')plt.show()# 给定a,b求回溯直线下降
def down(a, b):# 初始值x = np.array([1, 1])t = 1vals = [fx.evalf(subs={x1: x[0], x2: x[1]})]d = [-dx.evalf(subs={x1: x[0], x2: x[1]}), -dy.evalf(subs={x1: x[0], x2: x[1]})]while (d[0] ** 2 + d[1] ** 2) > 1:d = [-dx.evalf(subs={x1: x[0], x2: x[1]}), -dy.evalf(subs={x1: x[0], x2: x[1]})]xk = np.array(x) + np.array(d) * twhile fx.evalf(subs={x1: xk[0], x2: xk[1]}) > \fx.evalf(subs={x1: x[0], x2: x[1]}) - \a * t * (d[0] ** 2 + d[1] ** 2):xk = x + np.array(d) * tt = b * tx = x + np.array(d) * tvals.append(fx.evalf(subs={x1: x[0], x2: x[1]}))return vals# 暴力求解最小值
def test():minf = 1 << 64minx1 = 0minx2 = 0for i in np.linspace(-10, 10, 1000):for j in np.linspace(-10, 10, 1000):f = math.e ** (i + 3 * j - 0.1) + math.e ** (i - 3 * j - 0.1) + math.e ** (-i - 0.1)if f < minf:minx1 = iminx2 = jminf = fprint(minf, minx1, minx2)# 保存图像
def saveImg(a, b, arr):print(a, b, len(arr))plt.figure()plt.plot([i for i in range(len(arr))], [i for i in arr])plt.xlabel('k')plt.ylabel('fx')plt.title(f"a={a}\nb={b}")plt.savefig(f'./imgs/{a}_{b}.png')plt.close()#  根据不同的ab,保存图片
def fun():for i in np.linspace(0.1, 0.4, 4):for j in np.linspace(0.1, 0.9, 9):saveImg(i, j, down(i, j))test()
# fun()# show()

Python 优化 回溯下降算法相关推荐

  1. python 动态规划 回溯_回溯算法 - 全排列算法实现(pythondart)

    回溯算法 , 就是 穷举 解决一个回溯问题,实际上就是一个决策树的遍历过程. 路径: 也就是已经做出的选择 选择列表: 也就是你当前可以做的选择 结束条件: 也就是到达决策树底层,无法再做选择的条件. ...

  2. Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化

    拿来主义: python -m cProfile -o profile.pstats to_profile.py gprof2dot -f pstats profile.pstats |dot -Tp ...

  3. 数据结构与算法(Python)– 回溯法(Backtracking algorithm)

    数据结构与算法(Python)– 回溯法(Backtracking algorithm) 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条 ...

  4. 八十四、Python | Leetcode回溯算法系列

    @Author:Runsen @Date:2020/7/7 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...

  6. python回溯方法的模板_实例讲解Python基于回溯法子集树模板实现图的遍历功能

    这篇文章主要介绍了Python基于回溯法子集树模板实现图的遍历功能,结合实例形式分析了Python使用回溯法子集树模板针对图形遍历问题的相关操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Py ...

  7. Python实现回溯指针

    Python实现回溯指针 Python没有指针的概念,因此不能像C++那样通过指向父结点的指针访问父结点的方法. 比如在树中,要实现指向父结点的指针,C++ 的代码为: #include<ios ...

  8. python 物理实验_基于Python和梯度下降算法的物理实验数据一元线性拟合方法

    基于 Python 和梯度下降算法的物理实验数据一元线性拟 合方法 关毅铬 ; 程敏熙 [期刊名称] < <物理通报> > [年 ( 卷 ), 期] 2019(000)010 ...

  9. python优化、进化算法、启发式算法

    一个封装了7种启发式算法的 Python 代码库 (差分进化算法.遗传算法.粒子群算法.模拟退火算法.蚁群算法.鱼群算法.免疫优化算法) python优化中文文档

最新文章

  1. 判断是否为闰年oracle,ORACLE 通过日期变量判断是否闰年
  2. spring mvc -@RequestMapping注解详解
  3. 理解并取证:广域网上的PPP协议
  4. 怎么用python自动注册_python selenium自动化(二)自动化注册流程
  5. case 日期when 范围_多个日期段如何分组 case when convert等用法
  6. loadrunner录制脚本,页面无法显示
  7. 蓬勃发展的社区将帮助您的项目成功的6种方式
  8. 为numpy数组增加一个维度的方法
  9. python:查看函数方法的具体信息、参数等
  10. R语言进入,提示都是日文怎么切换
  11. Error: recoverUnfinalizedSegments failed for required journal
  12. 悟空,削他!善了个哉的……
  13. 矽力杰代理商的增长与模拟信号
  14. PLA,FPGA 简介
  15. jQuery里面的 .on 和 .bind 的区别
  16. Soapui报错There are currently 1 running SoapUI MockServices解决办法
  17. Vue实例中生命周期created和mounted的区别(具体细节分析)。
  18. Logback:同时按照日期和大小分割日志(最新日志可以不带日期或数字)
  19. 2022.03.23绝世武功
  20. Linux 查看系统日志命令

热门文章

  1. 计算机能不能升级固态硬盘,不算很老的计算机升级,换一块MLC的固态硬盘吧,新电脑回来了!...
  2. 使用kubekey的all-in-one安装K8S1.24及KubeSphere3.3
  3. 最近,我读完了张小龙的2351条饭否
  4. 如何通过Shell脚本,批量配置路由器或交换机配置
  5. 计算机如何打开无线网络适配器,网络适配器无法启动如何解决?解决方法步骤...
  6. AUTOCAD使用心得
  7. 兆易创新 GD32 系列(一) 启动过程分析
  8. 微信公众号开发--微信消息可以直接点击,然后请求中控服务器获取数据
  9. 程序设计思维与实践第九周作业
  10. matlab 邻近度 离群点_Matlab 六章知识点及课后解答