Python 多元函数约束极小化的Jython方法

Python 多元函数约束极小化的Jython方法,python,jython,mathematical-optimization,jython-2.5,Python,Jython,Mathematical Optimization,Jython 2.5,我有一个在Jython下运行的python程序(使用第三方JavaAPI),我想在其中计算多元函数的约束最小化 Scipy有一个模块可以很好地实现这一点(),但不幸的是,您不能在Jython中使用Scipy。有人知道Jython有什么好的图书馆/其他方法可以做到这一点吗?如果我能在Jython手下运行,我会准备好: def func(x, sign=1.0): """ Objective function -- minimize this """ return sign*(2*x

我有一个在Jython下运行的python程序(使用第三方JavaAPI),我想在其中计算多元函数的约束最小化

Scipy有一个模块可以很好地实现这一点(),但不幸的是,您不能在Jython中使用Scipy。有人知道Jython有什么好的图书馆/其他方法可以做到这一点吗?如果我能在Jython手下运行,我会准备好:

def func(x, sign=1.0):
    """ Objective function -- minimize this """
    return sign*(2*x[0]*x[1] + 2*x[0] - x[0]**2 - 2*x[1]**2)

def func_deriv(x, sign=1.0):
    """ Derivative of objective function """
    dfdx0 = sign*(-2*x[0] + 2*x[1] + 2)
    dfdx1 = sign*(2*x[0] - 4*x[1])
    return np.array([ dfdx0, dfdx1 ])

cons = ({'type': 'eq',
         'fun' : lambda x: np.array([x[0]**3 - x[1]]),
         'jac' : lambda x: np.array([3.0*(x[0]**2.0), -1.0])}, #partial derivative of fun
        {'type': 'ineq',
         'fun' : lambda x: np.array([x[1] - 1]),
         'jac' : lambda x: np.array([0.0, 1.0])})   #partial derivative of fun

res = minimize(func, [-1.0,1.0], args=(-1.0,), jac=func_deriv, 
               method='SLSQP', constraints=cons, options={'disp': True})

谢谢-Michael

这可能不是您特定用例的最佳解决方案,因为您已经在Jython中安装了应用程序,但是
JPype
()允许CPython程序与JVM上运行的程序对话,我自己没有尝试过,但找到了一个hello world示例

基本上,您可以创建Java类,将其编译成jar,然后在CPython中执行

import jpype
import os.path

jarpath = os.path.join(os.path.abspath('.'), 'build/jar')
jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.ext.dirs=%s" % jarpath)

# get the class
hello_world = jpype.JClass('com.stackoverflow.HelloWorld')
t = hello_world()  # create an instance of the class
t.helloWorld("Say hello")  # try to call one of the class methods
jpype.shutdownJVM()
我意识到这会颠倒您的应用程序逻辑。另一个选项是使用
子流程
并序列化输入/输出

更新


我最近遇到了一个类似的问题,并决定尝试一下
JPype
,现在可以说它非常值得使用,尽管在OSX上安装它会遇到一些问题,请参阅帮助(需要在
setup.py
中更改一些JVM路径).

这可能不是您特定用例的最佳解决方案,因为您已经在Jython中安装了应用程序,但是
JPype
()允许CPython程序与JVM上运行的程序对话,我自己没有尝试过,但找到了一个hello world示例

基本上,您可以创建Java类,将其编译成jar,然后在CPython中执行

import jpype
import os.path

jarpath = os.path.join(os.path.abspath('.'), 'build/jar')
jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.ext.dirs=%s" % jarpath)

# get the class
hello_world = jpype.JClass('com.stackoverflow.HelloWorld')
t = hello_world()  # create an instance of the class
t.helloWorld("Say hello")  # try to call one of the class methods
jpype.shutdownJVM()
我意识到这会颠倒您的应用程序逻辑。另一个选项是使用
子流程
并序列化输入/输出

更新


我最近遇到了一个类似的问题,决定尝试一下
JPype
,现在可以说它很值得使用,尽管在OSX上安装它时存在一些问题,请参阅帮助(一些JVM路径需要在
setup.py
中更改)。

如果您的项目使用Jython,您可以使用Slsqp4j在JVM上以本机方式执行求解,而完全不必编写SciPy代码。Slsqp4j是围绕SciPy中包含的SLSQP解算器的Java包装器。api与SciPy非常相似。它在这里托管:


(披露:我是作者)

如果您的项目使用的是Jython,那么您可以使用Slsqp4j在JVM上以本机方式执行解决,而完全不必编写SciPy代码。Slsqp4j是围绕SciPy中包含的SLSQP解算器的Java包装器。api与SciPy非常相似。它在这里托管:


(披露:我是作者)

谢谢!我会调查的。如果必须的话,子流程总是一个选项。谢谢!我会调查的。如果有必要,子流程始终是一个选项。请将上下文添加到任何链接,以便您的答案是自包含的。如能举例说明如何使用图书馆,将不胜感激。这也在中进行了解释。请将上下文添加到任何链接,以便您的答案是自包含的。如能举例说明如何使用图书馆,将不胜感激。这一点在中也有解释。