0

I have a python program running under Jython (to use a third party Java API), inside which I would like to calculate a constrained minimization of a multivariate function.

Scipy has a module for this that works perfectly (scipy.optimize) but unfortunately you cannot use scipy within Jython. Does anyone know of a good library/any other way to do this in Jython? If I could just run this under Jython, I'd be all set:

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})

Thanks! -Michael

4

2 回答 2

2

这可能不是针对您的特定用例的最佳解决方案,因为您已经在 J​​ython 中拥有了应用程序,但是JPype链接)允许 CPython 程序与在 JVM 上运行的程序通信,我自己没有尝试过,但找到了一个你好世界的例子在这里

基本上你制作你的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()

我意识到这会颠倒您的应用程序逻辑。另一种选择是使用subprocess和序列化输入/输出。

更新

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

于 2013-02-04T21:52:10.583 回答
1

如果您的项目使用 Jython,您可以使用 Slsqp4j 在 JVM 上本地执行求解,并完全绕过编写 SciPy 代码。Slsqp4j 是 SciPy 中包含的 SLSQP 求解器的 Java 包装器。该 api 与 SciPy 的非常相似。它托管在这里: https ://github.com/skew-opensource/slsqp4j

(披露:我是作者)

于 2020-03-04T18:36:38.877 回答