使用Jython约束多元函数的极小化

问题描述 投票:0回答:2

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

Scipy为此提供了一个完美运行的模块(scipy.optimize),但不幸的是,您无法在Jython中使用scipy。有人知道在Jython有一个好的图书馆/其他方法吗?如果我可以在Jython下运行此程序,那我就准备好了:

scipy.optimize

谢谢! -迈克尔

python jython mathematical-optimization jython-2.5
2个回答
2
投票

这可能不是针对特定用例的最佳解决方案,因为您已经在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}) JPype)允许CPython程序与JVM上运行的程序进行通讯,但我没有尝试过这是我的自我,但发现了一个您好的世界示例link

基本上是创建Java类,将其编译为jar,然后在CPython中执行

here

尽管我意识到这会颠倒您的应用程序逻辑。另一种选择是使用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() 并序列化输入/输出。

UPDATE

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


1
投票

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

(披露:我是作者)

© www.soinside.com 2019 - 2024. All rights reserved.