Optimization 在pyomo中优化Fortran函数

Optimization 在pyomo中优化Fortran函数,optimization,fortran,pyomo,Optimization,Fortran,Pyomo,我希望使用Pyomo优化Fortran函数。目标函数和约束都是用Fortran语言编写的。根据给出的答案,我们可以使用ExternalFunctionexpression对象。但即使对于最简单的函数,我也无法得到结果。下面给出了一个可复制的示例,其中包括Fortran函数、python(python 2.7.12)脚本、为优化而执行的命令和错误 Fortran函数文件(funcs.f)- Python脚本(pytest.py)- 在终端执行的命令- >> f2py -c -m fun

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

Fortran函数文件(
funcs.f
)-

Python脚本(
pytest.py
)-

在终端执行的命令-

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

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
我只给出了我认为相关的一小部分错误

有鉴于此,我对以下问题有一个初步的看法-

  • 如何使用pyomo成功地解决这个无约束优化问题

  • 对于我的整个项目,我必须用Fortran本身给出约束条件。约束子例程将返回一个实数,该实数将使用pyomo进行限定。如何对这些类型的约束进行建模

  • 我假设Pyomo将这个黑盒作为非线性优化。因此,我使用的是
    ipopt
    solver。这个假设正确吗

  • 软件包的版本-

  • Pyomo-5.5.1(VOTD)(Linux 4.4.0-127-generic上的cpython2.7.12)

  • ipopt-ipopt 3.12.8

  • f2py-与numpy 1.16.2一起安装

  • 谢谢你的帮助

    如果您不受约束,您可以使用优秀的软件包,该软件包为不同类型的问题提供解决方案,包括黑盒解决方案

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

    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)
    
    然后,您只需在fitness函数中处理Fortran代码的“接口”


    希望这有帮助

    你在寻找唯一的黑盒优化吗?在我看来,从pyomo的角度看,你的问题似乎是无约束的,所以你有一个无约束的单目标优化问题。如果是这种情况,您可以尝试pygmo(),它为全局和局部优化问题提供(也是黑盒)算法。我自己使用这个包来优化LPs/MILPs,这些LPs/MILPs是用Pyomo编写的,具有多个目标。如果这也适用于你,我可以提供一个例子!非常感谢您@CordKaldemeyer。问题中的例子是不受约束的。但对于我的项目,我想使用pyomo作为约束为某些fortran函数添加边界。话虽如此,我希望看到你希望分享的例子。
    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
    
    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)