optimization - 多目标优化但函数方程未知?
问题描述
首先,我完全不在我的专业领域,所以请多多包涵。
我开发了一个具有 5 个暴露参数(例如 A、B、C、D、E)的流体动力学引擎。当你给这个引擎这 5 个参数时,它会变魔术并给出一个值“Z”。
我想编写一个脚本,它可以探索哪些 AE 组合给出了最低(或接近最低)的 Z 值。
我知道优化算法是存在的,但是从我对示例的所有搜索中,它们使用了一些函数。
所以我想我的功能只是最小化 Z?但是AE去哪儿了?
解决方案
不是真正的答案,而是一些问题和想法可能会帮助您思考解决此问题的最佳方法。我们不了解需要为这些参数探索多大范围的值,或者 Z 的行为方式,所以这非常模糊......
如果您查看给定 A...E 值的 Z 值,Z 值是否会因参数值的微小变化而跳跃很多,或者 Z 值是否合理平滑地变化?
如果 Z 值不是太不稳定,您可以尝试某种梯度下降方法,使用 Z 的计算值来计算某些参数值来近似梯度 - 假设将“A”的值从 1 更改为 2 会产生更好的变化Z 值比其他参数的类似大小变化,然后尝试 A 的其他值,同时保持其他参数固定,直到找到给出最佳 Z 值的 A 值。然后尝试更改其他参数值以查看哪个一个给出最陡的下降并尝试为该参数找到一些更好的值。重复此过程,直到您找不到任何改进,并且您将找到(本地)最小值。然后,您可以从参数空间中的不同位置开始并重试 - 您可能会发现几个局部最小值,并且可能只选择其中最好的。不能证明是最佳的,但可能已经足够好了。当然,如果 Z 足够平滑,您可以变得聪明并使用共轭梯度、Newton-Raphson 或类似的东西。
如果 Z 值非常不稳定,那么您可能只需要对 A...E 的可能组合进行一些抽样,以获得 Z 值并选择您能找到的最佳值。同样,您可以以某种系统的方式(例如,参数空间中的网格上的点)或完全随机地执行此操作,或两者兼而有之。
如果您发现存在具有相似参数值的良好解决方案的“集群”,那么也许某种本地搜索会有所帮助 - 想法是在已知良好解决方案的本地邻域中通常有更好的解决方案。因此,也许可以尝试从已知解决方案中稍微扰动您的参数值,看看这是否可以导致更好的解决方案 - 通过某种梯度下降方法或随机采样。
不幸的是,如果您的 Z 计算很复杂,那么任何将其用作黑盒的方法都可能会很慢,因为它需要多次重新评估。
推荐阅读
- python - 使用 pandas 数据框中的多列同时按月分组的计算
- reactjs - 在子组件中使用 React 钩子
- java - 如何注入实现在 Java 或 Groovy 代码中调用的接口方法的类?
- reactjs - firebase 通知事件在服务工作者中不起作用(notifcationclose,notificationclick)
- haskell - 使用 Haskell 对列表的元素进行分组
- python - 有没有办法使用 python 中的 schedule 模块请求输入?
- c++ - c++ make_shared<> 与二维数组
- azure - 将 Docker 容器连接到与 Azure Pipelines 中的当前容器相同的网络
- javascript - Webpack:包含 html 文件及其 js 脚本以及独立的 js 脚本
- python - 在 Pandas DataFrame 上对迭代函数进行矢量化