使用Jython约束最小化多元函数

时间:2013-02-04 21:13:21

标签: python jython mathematical-optimization jython-2.5

我有一个在Jython下运行的python程序(使用第三方Java API),我希望在其中计算多变量函数的约束最小化。

Scipy有一个完美的模块(scipy.optimize),但不幸的是你不能在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

2 个答案:

答案 0 :(得分:2)

这可能不是您特定用例的最佳解决方案,因为您已经在Jython中拥有应用程序,但JPypelink)允许CPython程序与在JVM上运行的程序进行通信,我没有尝试过我自己,但发现了一个问候世界的例子here

基本上你创建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上安装它有一些问题,请参阅帮助here (某些JVM路径需要在setup.py中更改)。

答案 1 :(得分:1)

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

(披露:我是作者)