优化 pyomo 中的 Fortran 函数

2023-12-12

我希望使用 Pyomo 优化 Fortran 函数。目标函数和约束都是用 Fortran 编写的。根据给出的答案here, 我们可以用ExternalFunction表达式对象。但即使是最简单的函数我也无法得到结果。下面给出的是一个可重现的示例,其中包含 Fortran 函数、python (Python 2.7.12) 脚本、为优化而执行的命令以及错误。

Fortran 函数文件(funcs.f) -

  SUBROUTINE OBJ1(ARG,OBJ)
  DOUBLE PRECISION, INTENT(IN) :: ARG(2)
  DOUBLE PRECISION, INTENT(OUT) :: OBJ
  OBJ = ARG(1)+ARG(2)
  RETURN
  END SUBROUTINE

Python 脚本(pytest.py) -

import funcs
from pyomo.environ import *
from pyomo.opt import *
from pyomo.core import *

m = ConcreteModel()
m.a = Var(RangeSet(1,2),within=NonNegativeReals,bounds=(0,10))
m.f = ExternalFunction(library='funcs.so',function='OBJ1')
expr = m.f(m.a)
m.obj = Objective(expr=expr,sense=minimize)

opt = SolverFactory('ipopt')
results = opt.solve(m,tee=True)
print(results)

在终端执行的命令 -

>> f2py -c -m funcs funcs.f
>> python pytest.py

Error -

File "/usr/local/lib/python2.7/dist-packages/pyomo/core/base/external.py", line 160, in load_library
FUNCADD(('funcadd_ASL', self._so))(byref(AE))
AttributeError: /home/utkarsh/Desktop/python/modules/blackboxOptimization/funcs.so: undefined symbol: funcadd_ASL

我只给出了我认为相关的一小部分错误。

鉴于此,我有以下问题 -

  1. 如何使用 pyomo 成功解决这个无约束优化问题?

  2. 对于我的完整项目,我必须在 Fortran 本身中给出约束。约束子例程将返回一个实数,该实数将使用 pyomo 进行限制。如何对这些类型的约束进行建模?

  3. 我假设 Pyomo 将这个黑匣子视为非线性优化。因此,我正在使用ipopt求解器。这个假设正确吗?

软件包的版本 -

  1. Pyomo - 5.5.1 (VOTD)(Linux 4.4.0-127-generic 上的 CPython 2.7.12)

  2. ipopt - ipopt 3.12.8

  3. f2py - 与 numpy 1.16.2 一起安装

感谢您的帮助!


如果您不受约束Pyomo你可以使用优秀的Pygmo包提供不同类型问题的求解器,包括黑盒求解器。

这是一个关于如何在连续约束单目标测试问题上使用它的小示例:

import pygmo as pg
import pandas as pd


class Rosenbrock():
    """Rosenbrock function constrained to a disk.

    See: https://en.wikipedia.org/wiki/Test_functions_for_optimization
    """

    def fitness(self, x):
        """Evaluate fitness.

        Instead of the Rosenbrock function you could call your Fortran
        code here e.g. by using F2PY: https://www.numfys.net/howto/F2PY/
        """
        obj = (1-x[0])**2+100*(x[1]-x[0]**2)**2
        ineq = x[0]**2+x[1]**2-2
        return [obj, ineq]

    def get_bounds(self):
        """Return boundaries."""
        return ([-1.5]*2, [1.5]*2)

    def get_nic(self):
        """Determine number of inequalities."""
        return 1


# set up and solve problem
pro = pg.problem(Rosenbrock())
pop = pg.population(pro, size=200)
# see: https://github.com/esa/pagmo2/blob/master/include/pagmo/algorithms/
algo = pg.algorithm(pg.ihs(gen=10000))
algo.set_verbosity(100)
pop = algo.evolve(pop)

# extract solutions
fits = pd.DataFrame(pop.get_f())
vectors = pd.DataFrame(pop.get_x())
best_idx = pop.best_idx()
best_vector = vectors.loc[best_idx].to_frame().T
best_fitness = fits.loc[best_idx].to_frame().T

print(best_vector)
print(best_fitness)

然后,您只需在适应度函数中处理“连接”Fortran 代码即可。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化 pyomo 中的 Fortran 函数 的相关文章

  • 优化 itoa 功能

    我正在考虑如何使用SSE指令实现整数 4字节 无符号 到字符串的转换 通常的例程是将数字相除并将其存储在局部变量中 然后反转字符串 本示例中缺少反转例程 char convert unsigned int num int base stat
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se
  • 使用 PuLP 进行线性优化,变量附加条件

    我必须用 Pull 解决 Python 中的整数线性优化问题 我解决了基本问题 现在我必须添加额外的约束 有人可以帮助我用逻辑指示器添加条件吗 逻辑限制是 如果 A gt 20 则 B gt 5 这是我的代码 from pulp impor
  • Fortran 中的数组第一个索引

    我认为 Fortran 中数组的第一个索引是 1 但是为什么这段代码可以工作呢 代码是 Wavewatch 的修改部分 http polar ncep noaa gov waves wavewatch http polar ncep noa
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid
  • 使用多个模块时优化 Flex

    我有一个 Flex 应用程序 加载时间非常重要 消费者网站 我希望能够在屏幕上显示一些内容 然后允许根据需要加载其他模块 我面临的问题是所有模块的总和比我将所有组件包含在单个 swf 文件中要大得多 原因很明显 例如 访问 Web 服务所需
  • 如何在 conda 中静音或抑制 gfortran (或 clang?)后端?

    我一直致力于构建一个非常特殊的 conda 环境 专为python and R与串扰使用rpy2 我想出的方法可以安装正确的R包如下 install main environment sh now date T echo Start Tim
  • 有效地查找正则表达式的所有重叠匹配项

    这是后续与 java 正则表达式匹配的所有重叠子字符串 https stackoverflow com q 11303309 244526 有没有办法让这段代码更快 public static void allMatches String
  • 澄清创建临时表的连接顺序

    我在 mysql 中有一个大型查询 涉及将多个表连接在一起 它太慢了 所以我做了 解释 发现它正在创建一个临时表 我怀疑它占用了大部分执行时间 我找到了一些相关资料 mysql 文档 http dev mysql com doc refma
  • 规范“毒”方式真的值得吗? (3NF)

    我正处于数据库设计的早期阶段 所以还没有最终的结果 并且我正在为具有可选标签的线程使用 TOXI 3表设计 但我忍不住觉得加入是并不是真的必要 也许我只需要依赖我的简单标签列posts我可以在其中存储类似 varchar 的表
  • 在 any() 语句中迭代一个小列表是否更快?

    在低长度迭代的限制下考虑以下操作 d 3 slice None None None slice None None None In 215 timeit any type i slice for i in d 1000000 loops b
  • std::类似向量的类经过优化以容纳少量项目[重复]

    这个问题在这里已经有答案了 在程序的一个时间关键部分中 有一个类成员如下所示 std vector m vLinks 在分析过程中 我注意到该向量大约 99 98 的执行仅包含 0 或 1 个项目 然而 在极少数情况下 它可能会容纳更多 根
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 什么是大O表示法?你用它吗? [复制]

    这个问题在这里已经有答案了 什么是大O表示法 你用它吗 我想我错过了这门大学课程 D 有人使用过它并给出一些现实生活中使用它的例子吗 也可以看看 八岁孩子的大O https stackoverflow com questions 10716
  • Swift 3 中是否提供内置内部函数?

    我可以在 Xcode 自动完成弹出窗口中看到各种内置函数 如 builtin popount builtin clz 等 我不确定这些是从哪里获取的 单击命令不会导致快速定义或任何文档 Swift 3 中是否有 builtin 或等效的内部
  • 如何读取 Fortran 中内容不以空格分隔的 2D 文件

    我有一个矩阵存储在文件 number txt 中 如下所示 12323456 54254311 76534522 我如何在 Fortran 中读取这样的矩阵 结果将是 1 2 3 2 3 4 5 6 5 4 2 5 4 3 1 1 7 6
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • 识别操作系统

    我在 Intel 编译器上的 Fortran 90 代码取决于它运行的操作系统 例如 if OS win7 then do X else if OS linux then do y end if 我如何以编程方式执行此操作 您可以使用预处理

随机推荐

  • JavaFX TableView 和 ObservableList - 如何自动更新表?

    我知道类似的问题已经在不同的日期被问过 但我会在这里放置一个 SSCCE 并尝试简单地提出这个问题 我希望能够更新数据模型 并自动更新其上的任何视图 这样任何更新模型的调用者都不知道当前存在的任何视图 这是我到目前为止学到 尝试过的 并且没
  • 无法以正确的格式对特殊字符电子邮件、gmail api 和 ae.net.mail 进行编码

    我正在开发一个可以发送带有附件的电子邮件的应用程序 它可以工作 直到我尝试特殊字符 我尝试了一下不同的编码 看起来主题是用 ISO 8859 1 编码的 而邮件的其余部分是用 UTF 8 编码的 这是我生成 Google Gmail API
  • 使用 CodeRunner 扩展通过 VStudio Code 运行 C++

    我无法使用 Code Runner 扩展从 VStudio Code 运行我的 cpp 文件 当我更换时 include test h with include test cpp 主要它工作正常 但将其替换回来会给我以下错误 运行 cd c
  • Facebook OAuthException:(#1)

    我有一些将图像上传到用户个人资料的应用程序 几个小时前 所有应用程序都工作正常 但现在请求上传时 会出现此错误 Fatal error Uncaught OAuthException 1 An unknown error occurred
  • WordPress插件如何添加内容?

    这可能是一个奇怪的问题 当我添加 Facebook Like Button 和 Gigpress 等插件时 它们提供了在每个单页博客文章之前或之后插入内容的选项 例如 我将 Gigpress 和 FB Like 按钮设置为在我的帖子文本下方
  • Oracle 触发器每月检查约束

    只是想知道是否可以创建一个触发器来每月检查指定的约束基础 eg 桌租 ID 会员 书籍 1 约翰 童话 2 约翰 摩擦 3 约翰 漫画 4 约翰 杂志 限制 会员每月只允许借阅4本书 我想过使用 count book 有什么建议吗 使用触发
  • 使用 SIMD 查找素数列表 - SSE/AVX

    我很好奇是否有人对如何使用 SIMD 查找素数列表有建议 我特别感兴趣如何使用 SSE AVX 来做到这一点 我一直在研究的两种算法是试除法和埃拉托斯特尼筛法 我设法找到一种使用 SSE 进行试除的方法 我找到了一种更快的除法方法 该方法非
  • Hadoop 从 Hadoop 节点的本地文件系统访问第 3 方库

    我的所有 Hadoop 节点上都有一个 jar 文件 位于 home ubuntu libs javacv 0 9 jar 以及其他一些 jar 文件 When my 映射减少应用程序正在执行Hadoop节点 我收到此异常 java io
  • XML 反序列化和松散数组项

    因此 我正在处理一些我认为很可能格式错误的 XML 文件 并且我正在尝试弄清楚如何以及是否可以使用 XmlSerializer 将此 XML 反序列化为逻辑业务对象 假设我有以下 XML 文件
  • 我如何找出谁强制推送了 git?

    有人用过git push force但我无法从日志中看出是谁干的 有没有办法找出罪魁祸首 2018 年 11 月更新 如果您要推送到集中式 Git 存储库托管服务 例如 GitHub then你将能够看到谁强制推送了你的分支 但这只是因为
  • 将二维矩阵向右旋转[重复]

    这个问题在这里已经有答案了 我想要一个二维矩阵向右旋转 它编译得很好 但是当我尝试运行时 它说数组索引越界异常 例如 我想要 10 20 30 40 50 60 旋转成 40 10 50 20 60 30 public static int
  • 使用 WCF 从类库公开对象

    我正在使用一个公开一些对象的类库 这些对象有几个属性来保存我的客户所需的数据 我想创建一个 WCF 服务 将对象返回给我的客户端 但我无法更新类库以添加 DataContract 和 DataMember 属性 暴露这些对象的最简单方法是什
  • 通过蓝牙将 GPS 位置发送到 iOS 设备

    我们正在寻找一种通过蓝牙将 GPS 位置发送到 iPhone 或 iPad 的方法 这样做的好处是 外部 GPS 设备可以比 iOS 中的内置 GPS 设备产生更准确的位置 出于我们的测试目的 如果能够由 QA 手动生成 GPS 也很好 我
  • 如果 OpenProcess() 因 ACCESS_DENIED 失败,如何从 pid 获取进程文件名?

    我正在尝试从其 pid 获取进程名称 用户以管理员身份运行 UAC 已启用 但未提升 一些系统进程 例如services exe 以这样的方式设置他们的安全性OpenProcess PROCESS QUERY INFORMATION 失败了
  • postgresql 触发器:禁用自动提交并设置隔离级别

    我正在数据库上编写一个触发器 而不是在表上插入 进行一些操作 然后将数据插入到不同的相关表中 现在我需要禁用自动提交并在触发器内设置不同的隔离级别 我该怎么办 除了嵌入式 SQL 之外 PostgreSQL 没有禁用自动提交的设置 如果您尝
  • 致命错误:未捕获错误:未找到“Cloudinary”类

    当我尝试在 cloudinary 中上传图像时 致命错误 未捕获错误 未找到 Cloudinary 类 我的配置文件中出现此错误 我的配置文件包含 为什么我会得到这个 05 2021 我希望你找到了解决方案 如果没有尝试这个 Cloudin
  • 我可以在 Google 跟踪代码管理器中添加 Facebook 转化跟踪吗?

    我会在 Google 标签管理中添加 Facebook 转化跟踪像素 我看到的唯一问题是 FB 要求在标签之间添加代码 而 GTM 则位于 有点令人困惑 有任何想法吗 FB 转换跟踪代码应介于 and 正确部署Google Tag Mana
  • 如何参数化 Pytest 夹具?

    考虑以下 Pytest import pytest class TimeLine object instances 0 1 2 pytest fixture def timeline return TimeLine def test tim
  • 使用 OpenXML 将 PowerPoint 演示文稿另存为 PDF

    我的目标是建立一个自动化的服务器端流程来转变 ppt into a pdf Microsoft 自己建议我使用 OpenXML 现在我正在考虑这一点 我的问题是 我真的可以使用 OpenXML 实现我的目标吗 我很难找到我期望的方法 例如
  • 优化 pyomo 中的 Fortran 函数

    我希望使用 Pyomo 优化 Fortran 函数 目标函数和约束都是用 Fortran 编写的 根据给出的答案here 我们可以用ExternalFunction表达式对象 但即使是最简单的函数我也无法得到结果 下面给出的是一个可重现的示