我想对该数据库Python
中的约束满足问题进行一些实验:所有示例都以文件格式给出。有没有工具可以将这些方程转换为简单的 python 函数,看起来像AMPL
GAMS
二次方(X):
return (X[0]**2 - X[1]**2, 2*X[0]*X[1])
和类似的?
我已经开始阅读本手册,但不确定这是否是正确的方向。(我的编程能力不是很强。)我会很感激可能的提示。
我最近为 Python 中的 AMPL 子集编写了一个解析器,可在此处获得。它不完整,但已经可以处理许多 AMPL 表达式并且可以轻松扩展。
这是一个将目标函数从 AMPL 转换为 Python 的示例:
import ampl, sys
class AMPLToPythonConverter:
def __init__(self, stream):
self.stream = stream
def visit_reference(self, expr):
self.stream.write(expr.name)
def visit_binary(self, expr):
expr.lhs.accept(self)
self.stream.write(' {} '.format(expr.op))
expr.rhs.accept(self)
def visit_decl(self, decl):
if decl.kind == 'minimize':
self.stream.write("def {}(x):\n".format(decl.name))
self.stream.write(" return ");
decl.body.accept(self)
self.stream.write('\n')
compound_stmt = ampl.parse(
"""
var x;
minimize f: x * x;
""", "input")
for node in compound_stmt.nodes:
node.accept(AMPLToPythonConverter(sys.stdout))
运行此代码打印:
def f(x):
return x * x
为了简单起见,示例硬编码参数 name x
,但可以从 AST 派生它。