首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将“`AMPL`”或“`GAMS`”文件转换为“`Python`”

将“`AMPL`”或“`GAMS`”文件转换为“`Python`”
EN

Stack Overflow用户
提问于 2015-06-05 12:38:25
回答 2查看 2.1K关注 0票数 4

我想在Python中做一些实验,用这个数据库的约束满足问题:所有的例子都是以AMPLGAMS文件格式给出的。是否有一个工具可以将这些方程转换为类似于

def二次(X):

代码语言:javascript
代码运行次数:0
运行
复制
 return (X[0]**2 - X[1]**2, 2*X[0]*X[1])

还有相似之处?

我已经开始阅读本手册,但不确定这是否是正确的方向。(我编程能力不强。)我将感激可能的暗示。

EN

回答 2

Stack Overflow用户

发布于 2015-06-06 22:23:35

我最近用Python为AMPL的一个子集编写了一个解析器,它是可用的这里。它是不完整的,但已经可以处理许多AMPL表达式,可以很容易地扩展。

下面是将目标函数从AMPL转换为Python的示例:

代码语言:javascript
代码运行次数:0
运行
复制
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))

运行此代码将打印:

代码语言:javascript
代码运行次数:0
运行
复制
def f(x):
  return x * x

为了保持简单,示例硬编码参数名x,但是可以从AST派生它。

票数 4
EN

Stack Overflow用户

发布于 2018-01-18 09:45:09

GAMS和Pyomo之间的下列联系可能有用:

皮奥莫是一个基于Python的开源软件包,它支持各种不同的优化功能,用于建立、解决和分析优化模型。

GAMS提供的转换函数允许您从GAMS-模型生成一个Pyomo具体标量模型。

因此,您应该能够将GAMS模型转换为Pyomo模型,然后通过Pyomo提供的功能访问它的功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30666785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档