Python实战开发及案例分析(2)——单目标优化

        在Python中,进行单目标优化主要涉及定义一个优化问题,包括一个目标函数和可能的约束条件,然后选择合适的算法来求解。Python提供了多种库,如SciPyPyomoGEKKO等,用于处理各种优化问题。

案例分析:使用 SciPy 进行函数最小化

项目背景:假设我们需要找到一个数学函数的最小值,这是单目标优化中的一个典型问题。这里我们选择使用 SciPy 库中的 minimize 函数来实现。

技术栈

  • SciPy:一个在科学计算领域广泛使用的Python库,提供了多种优化算法。
步骤 1: 定义问题

        首先,定义一个需要最小化的函数,比如一个简单的二次函数 𝑓(𝑥)=(𝑥−3)^2。

def objective(x):return (x - 3)**2
步骤 2: 选择优化算法

        SciPy 的 minimize 函数支持多种优化算法,如 BFGS, Nelder-Mead, TNC 等。我们可以根据问题的性质选择最合适的算法。对于简单的无约束问题,BFGS 是一个不错的选择。

from scipy.optimize import minimize# 初始猜测
initial_guess = [0]# 调用 minimize 函数进行优化
result = minimize(objective, initial_guess, method='BFGS')
步骤 3: 分析结果

        优化过程返回的结果对象包含了大量信息,如最优解、函数在最优解的值、优化是否成功等。

if result.success:optimized_value = result.xprint('Optimized Value:', optimized_value)
else:print('Optimization failed:', result.message)

结果分析

        在此案例中,minimize 函数将寻找给定函数的全局最小值。由于我们选择的是二次函数,其最小值很容易确定,位于 𝑥=3x=3。SciPy 的优化工具能够有效地找到这个最小值,并提供有关优化过程的详细信息。

更复杂的优化问题

        对于涉及多个变量和/或约束的优化问题,我们可以通过定义额外的参数和约束条件来扩展使用 SciPy 的方法。例如,如果我们需要最小化带约束的目标函数,可以定义约束函数,并将其作为参数传递给 minimize 函数。

# 目标函数
def objective(x):return x[0]**2 + x[1]**2# 约束条件
def constraint(x):return x[0] + x[1] - 10# 约束字典
con = {'type': 'eq', 'fun': constraint}# 初始猜测
initial_guess = [0.5, 0.5]# 优化
result = minimize(objective, initial_guess, constraints=[con], method='SLSQP')if result.success:optimized_value = result.xprint('Optimized Value:', optimized_value)
else:print('Optimization failed:', result.message)

        在这个更复杂的例子中,目标函数和约束都更加复杂,但 SciPy 依然能够有效地处理这类问题。通过合理选择算法和配置优化问题的参数,我们可以解决广泛的实际优化问题。

全局优化方法

        全局优化旨在找到函数的全局最优解,而非陷入局部最优。这在许多应用中尤其重要,如在复杂的工程设计和金融模型中。

技术栈

  • SciPy:提供了几种全局优化算法。
  • BasinHoppingDifferentialEvolution:SciPy中的全局优化算法。
示例:使用 Differential Evolution 算法优化

        Differential Evolution(差分进化)是一种常用的全局优化算法,适用于多维且可能非线性、非凸、不连续的优化问题。

from scipy.optimize import differential_evolution# 定义目标函数
def objective(x):return x[0]**2 - 10 * x[0] + x[1]**4 - x[1]**2 + 4# 定义变量边界
bounds = [(-10, 10), (-10, 10)]# 执行全局优化
result = differential_evolution(objective, bounds)if result.success:optimized_value = result.xprint('Global Optimized Value:', optimized_value)
else:print('Global Optimization failed:', result.message)

处理更复杂的约束

        在实际的优化问题中,经常会遇到多种复杂的约束,包括等式和不等式约束。处理这些约束需要使用支持约束优化的方法。

示例:使用 SLSQP 算法优化带约束的问题

        Sequential Least Squares Programming (SLSQP) 是一种能够处理包含等式和不等式约束的优化算法。

from scipy.optimize import minimize# 目标函数
def objective(x):return x[0]**2 + x[1]**2 + x[2]**2# 约束条件
def constraint1(x):return x[0] + x[1] - 10  # 等式约束def constraint2(x):return x[1] + x[2] - 20  # 等式约束# 约束字典
cons = ({'type': 'eq', 'fun': constraint1},{'type': 'eq', 'fun': constraint2}
)# 变量边界
bounds = [(-10, 10), (-10, 10), (-10, 10)]# 初始猜测
initial_guess = [0, 0, 0]# 优化
result = minimize(objective, initial_guess, method='SLSQP', bounds=bounds, constraints=cons)if result.success:optimized_value = result.xprint('Optimized Value:', optimized_value)
else:print('Optimization failed:', result.message)

高级主题:使用多变量和复杂函数形态进行优化

        在实际应用中,优化问题往往涉及多个变量和复杂的函数形态,包括多峰值、高度非线性和不连续性。这些特性使得寻找全局最优解变得更为困难。

示例:优化复杂能量函数

        考虑一个物理或工程问题,其中目标函数表示一个系统的能量状态,该状态依赖于多个变量,并可能包含多个局部最小值(能量井)。

目标函数示例

  • Lennard-Jones Potential:常用于模拟分子间相互作用的势能。
  • import numpy as np# 定义Lennard-Jones势能函数
    def lennard_jones_potential(x):# x: np.array of particle positions (assumed to be 1D for simplicity)# Calculate distance between pairs of particlesr = np.abs(x[:, np.newaxis] - x)np.fill_diagonal(r, np.inf)  # Avoid division by zero for self-interactions# Lennard-Jones Potential: V(r) = 4 * ( (sigma/r)**12 - (sigma/r)**6 )V = 4 * (np.power(1/r, 12) - np.power(1/r, 6))total_potential = np.sum(V) / 2  # Each pair counted twicereturn total_potential# Variables range and number of particles
    num_particles = 5
    bounds = [(-1.0, 1.0)] * num_particles# Using Differential Evolution to find minimum energy configuration
    from scipy.optimize import differential_evolutionresult = differential_evolution(lennard_jones_potential, bounds)print("Optimized positions:", result.x)
    print("Minimum potential energy:", result.fun)
    

行业应用:金融投资组合优化

在金融领域,优化常常用于资产的配置,目的是最大化预期回报并最小化风险。

示例:使用 Mean-Variance Optimization (MVO)模型

Mean-Variance Optimization是现代投资组合理论的核心,旨在通过分散投资组合来降低风险,同时追求回报。

import numpy as np
from scipy.optimize import minimize# 模拟数据
np.random.seed(0)
num_assets = 4
returns = np.random.randn(100, num_assets)# 计算预期回报和协方差
expected_returns = np.mean(returns, axis=0)
cov_matrix = np.cov(returns, rowvar=False)# 目标函数:最小化投资组合的方差
def portfolio_variance(weights):return weights.T @ cov_matrix @ weights# 约束条件:总权重为1,无空头
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})# 变量边界:每个资产的权重在0到1之间
bounds = tuple((0, 1) for asset in range(num_assets))# 初始猜测
initial_guess = np.full(num_assets, 1 / num_assets)# 优化
opt_result = minimize(portfolio_variance, initial_guess, method='SLSQP', bounds=bounds, constraints=constraints)print("Optimal weights:", opt_result.x)
print("Expected return:", opt_result.x.T @ expected_returns)
print("Minimum variance:", opt_result.fun)

结论

(1)在Python中进行单目标优化允许处理从简单到高度复杂的多维优化问题。通过选择合适的算法和正确配置优化问题的参数,可以有效地找到全局最优解或满足特定约束条件的解。SciPy库提供的各种优化算法使得Python成为执行科学计算和工程优化的强大工具。对于开发者来说,理解每种算法的适用场景和限制是非常重要的,这有助于在实际应用中选择最适合解决特定问题的方法。此外,随着问题复杂性的增加,可能需要更多的计算资源或更精细的算法调参来获得满意的结果

(2)通过这些高级主题和实例,我们可以看到Python在处理复杂优化问题方面的能力。无论是在物理模拟中寻找能量最小状态,还是在金融领域进行投资组合优化,Python都提供了强大的工具和灵活的方法来寻找解决方案。这些工具和方法能够帮助研究者和实践者在各自的领域中应对挑战,实现目标。

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

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

相关文章

《LTC与铁三角∶从线索到回款-人民邮电》关于铁三角不错的论述

《LTC与铁三角∶从线索到回款-人民邮电》一书中,关于铁三角不错的论述,收藏之:客户责任人的角色定义及核心价值 AR 的核心价值定位主要体现在三个方面:客户关系、 客户满意度、竞争对手 “ 压制 ” 。 维护客户关系&#x…

zabbix之system.run

Zabbix的system.run是一个主动模式的监控项,它允许用户在Zabbix服务器上执行自定义的命令或脚本,并获取执行结果作为监控数据。 system.run监控项的配置包括以下几个关键参数: 命令:要执行的命令或脚本。可以是任何可执行的命令,包括系统命令、脚本文件等。 参数:命令的…

百川2模型解读

简介 Baichuan 2是多语言大模型,目前开源了70亿和130亿参数规模的模型。在公开基准如MMLU、CMMLU、GSM8K和HumanEval上的评测,Baichuan 2达到或超过了其他同类开源模型,并在医学和法律等垂直领域表现优异。此外,官方还发布所有预…

[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)

文章涉及具体代码gitee: 登录 - Gitee.com 目录 1.插入排序 1.直接插入排序 总结 2.希尔排序 总结 2.选择排序 1.选择排序 ​编辑 总结 2.堆排序 总结 3.交换排序 1.冒泡排序 总结 2.快速排序 总结 4.归并排序 总结 5.总的分析总结 1.插入排…

Visual Studio 2022 工具 选项 没有网络设置问题解决

Visual Studio 2022 工具 选项 没有网络选项了,找了一大圈也没找到。 最后发现Visual Studio 2022的直接使用系统的代理设置了,在浏览器的代理中设置即可。 要使用扩展管理器安装插件,还不能设置pac !!! 顺便记录个pac地址: 1…

Unity---版本控制软件

13.3 版本控制——Git-1_哔哩哔哩_bilibili Git用的比较多 Git 常用Linux命令 pwd:显示当前所在路径 ls:显示当前路径下的所有文件 tab键自动补全 cd:切换路径 mkdir:在当前路径下创建一个文件夹 clear:清屏 vim…

QT, 加载qss文件应用样式

qt 应用中,加载qss文件主要是为了集中管理样式,使用QApplication::setStyleSheet(qssStr) 即可将样式应用到程序中,qss文件中,既可以定义全局样式,也可以针对某些类,甚至某个对象设置样式。关键代码如下&am…

考研就业选择规划【攻略】

考研就业选择规划【攻略】 前言版权推荐考研就业选择首先多问考研就业优势对比我的选择补充 最后 前言 2024-5-5 10:00:02 对于考研就业选择,我的一些看法。 这只是我现在的看法,我不认为现在的我能够看得多远,所以可能局限于现在。 一个…

Linux的socket详解

一、本机直接的进程通信方式 管道(Pipes): 匿名管道(Anonymous pipes):通常用于父子进程间的通信,它是单向的。命名管道(Named pipes,也称FIFO):允…

微星主板安装双系统不能进入Ubuntu的解决办法

在微星主板的台式机上面依次安装了Windows11和Ubuntu22.04。在Ubuntu安装完成后重启,没有出现系统选择界面,直接进入了Windows11。怎么解决?方法如下: (1)正常安装Windows11 (2)安…

《自动机理论、语言和计算导论》阅读笔记:p352-P401

《自动机理论、语言和计算导论》学习第 12 天,p352-P401总结,总计 50 页。 一、技术总结 1.Turing Machine ™ 2.undecidability ​ a.Ld(the diagonalization language) 3.reduction p392, In general, if we have an algorithm to convert insta…

GpuMall的GPU算力资源池化技术有何优势?

GpuMall的GPU算力资源池化技术具有显著的优势,这些优势使得其在智算云领域脱颖而出,为用户提供了高效、灵活且可靠的GPU算力服务。以下是GpuMall GPU算力资源池化技术的主要优势: GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向A…

面向未来:等保测评与持续改进

随着信息技术的不断进步和网络环境的日益复杂,网络安全正面临着前所未有的挑战。等保测评作为提升网络安全管理水平的重要手段,不仅需要应对当前的安全威胁,更应着眼于未来的安全需求。本文将探讨等保测评在持续改进中的角色和实施策略。 ##…

Git系列:config 配置

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Java中的枚举类型介绍

一、背景及定义 情景: 枚举是在JDK1.5以后引入的。 主要用途是: 将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式: 这种定义方式实际上并不好。 例如:如果碰巧有另一个变量也是1,那么…

FIFO Generate IP核使用——AXI接口信号详解

在AXI协议中,提到的s_axis_tready、s_axi_awready、s_axi_wready、m_axi_bready、s_axi_arready和m_axi_rready是AXI接口中用于指示通道就绪状态的信号。这些信号的值通常表示主设备(Master)或从设备(Slave)是否准备好…

笔记85:如何计算递归算法的“时间复杂度”和空间复杂度?

先上公式: 递归算法的时间复杂度 递归次数 x 每次递归消耗的时间颗粒数递归算法的空间复杂度 递归深度 x 每次递归消耗的内存空间大小 注意: 时间复杂度指的是在执行这一段程序的时候,所花费的全部的时间,即时间的总和而空间复…

以太网基础-IP、ICMP、ARP协议

一、IP协议 参考:rfc791.txt.pdf (rfc-editor.org) IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议,提供不可靠的、无连接的、尽力而为的数据报传输服务。 IP报文数据头如下 Version:4bit,4表示…

网络模型与调试

网络模型 网络的体系结构 ● 网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。 ● 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供…

机器学习(一) ----------机器学习概述

目录 概述一、人工智能三大概念人工智能(Artificial Intelligence)机器学习(Machine Learning)深度学习(Deep Learning) 二、机器学习应用领域和发展史发展史三大流派1.符号主义学派(基于数理逻…