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…

百川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.插入排…

Unity---版本控制软件

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

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…

Git系列:config 配置

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

Java中的枚举类型介绍

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

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

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

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

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

网络模型与调试

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

Elasticsearch:如何使用 Java 对索引进行 ES|QL 的查询

在我之前的文章 “Elasticsearch:对 Java 对象的 ES|QL 查询”,我详细介绍了如何使用 Java 来对 ES|QL 进行查询。对于不是很熟悉 Elasticsearch 的开发者来说,那篇文章里的例子还是不能单独来进行运行。在今天的这篇文章中,我来详…

MySQL CRUD进阶

前言👀~ 上一章我们介绍了CRUD的一些基础操作,关于如何在表里进行增加记录、查询记录、修改记录以及删除记录的一些基础操作,今天我们学习CRUD(增删改查)进阶操作 如果各位对文章的内容感兴趣的话,请点点小…

【网络编程下】五种网络IO模型

目录 前言 一.I/O基本概念 1.同步和异步 2.阻塞和非阻塞 二.五种网络I/O模型 1.阻塞I/O模型 2.非阻塞式I/O模型 ​编辑 3.多路复用 4.信号驱动式I/O模型 5. 异步I/O模型 三.五种I/O模型比较​编辑 六.I/O代码示例 1. 阻塞IO 2.非阻塞I/O 3.多路复用 (1)select …

Electron 对 SQLite 进行加密

上一篇讲了如何在 Electron使用 SQLite,如果 SQLite 中存有敏感数据,客户端采用明文存储风险很高,为了保护客户数据,就需要对数据进行加密,由于 electron 对代码并不加密,所以这里排除通过逆向工程进行数据…

想要快速接收的看过来:Cell旗下毕业神刊,中科院二区、平均审稿周期1个月,冲!

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 就是它了,Cell旗下全OA期刊iScience。影响因子5.8分,中科院二区,年发文量逐年上涨,2023年发文近3000篇,2024年第一季…

一周学会Django5 Python Web开发 - Django5 ModelForm表单定义与使用

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计51条视频,包括:2024版 Django5 Python we…

一种算法分类方式及其应用

在计算机科学领域,算法是解决问题的有效方法,而对算法进行分类有助于理解它们的特性、优劣以及在不同场景下的应用。常见的算法分类方法,包括按设计思想、问题类型、数据结构和应用领域等,每一类算法会对应有其典型和实际应用。 算…

spring boot3多模块项目工程搭建-上(团队开发模板)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 目录 写在前面 多模块结构优缺点 模块介绍 Common 模块: API 模块: Web 模块: Service 模块: DAO 模块: 搭建步骤 1.创建 父…