19

これは私の最後の質問の続きです。私は方程式を解析し、取得した ast で作業したいと考えています。私がやりたいことは、基本的にそれをランダムにスクランブルして、有効な関数でなければならない新しい方程式を取得することです。これは、遺伝的アルゴリズムで使用されます。

ここから始めます:

class Py2do(ast.NodeTransformer):
def __init__(self):
  self.tree=[]
def generic_visit(self, node):
    print type(node).__name__
    self.tree.append(type(node).__name__)
    ast.NodeVisitor.generic_visit(self, node)
    depth=3
    s = node.__dict__.items()
    s = "    ".join("%s %r" % x for x in sorted(node.__dict__.items()))
    print( "%s%s\t%s" % (depth, str(type(node)), s) )
    for x in ast.iter_child_nodes(node):
      print (x, depth)

def visit_Name(self, node):
    # print 'Name :', node.id
    pass

def visit_Num(self, node):
    print 'Num :', node.__dict__['n']

def visit_Str(self, node):
    print "Str :", node.s

def visit_Print(self, node):
    print "Print :"
    ast.NodeVisitor.generic_visit(self, node)

def visit_Assign(self, node):
    print "Assign :"
    ast.NodeVisitor.generic_visit(self, node)

def visit_Expr(self, node):
    print "Expr :"
    ast.NodeVisitor.generic_visit(self, node)





if __name__ == '__main__':
    node = ast.parse("res= e**(((-0.5*one)*((delta_w*one/delta*one)**2)))")
    import ast_pretty
    print ast.dump(node)
    pprintAst(node)
    v = Py2do()
    v.visit(node)
    print v.tree

私が取り出したいのは次のようなものです:

res= e**(delta*((one/delta_w*one)**2)))

または何らかの種類の別の有効なランダム方程式。これは Fortran プログラムで使用されるので、結果の方程式も Fortran に転送できるとよいでしょう。コードにコメントを付けて、テスト サンプル/ユニット テストを提供してください。

4

2 に答える 2

1

入力出力は Fortran コードですか? そして、任意の Fortran 式/ステートメントを使用したいですか? (配列スライスを含めて...?) Fortran はかなり複雑な言語です。それを読むには、ほぼ完全なパーサーが必要です。

おそらく、すでに Fortran を直接操作できるプログラム変換ツールを使用したいと思うでしょう。このようなツールは、Fortran コードを読み取り、AST を構築し、ランダムに選択された一連の変換を使用して「ランダム化」し、有効な Fortran コードを再生成します。

Fortran フロントエンドを備えたDMS Software Reengineering Toolkitは、これに直接使用できます。

編集 2011 年 8 月 26 日: OP は、実際の Fortran コードを「進化」(変換) したいことを確認しています。本当の Fortran パーサーを作成するのは (他の実際の言語のパーサーを作成するのと同じように) かなり難しいことに注意してください。数か月かかりましたが、私たちのツールはパーサーを定義するのに非常に優れています (DMS を使用して約 40 の言語とさまざまな方言を作成しました) 少なくとも彼が自分の人生や実際の仕事を続けたいのであれば、彼自身の本当の Fortran パーサーを構築することはおそらく良い考えではありません。

OPがFortranコードを非常に制限されたサブセットに制限し、そのためのパーサーを構築することは可能かもしれません.

于 2011-08-21T11:32:26.690 に答える
-1

あなたは何をしようとしているのですか?方程式の正しい順列を探すのは簡単ですが、時間がかかります (n! の可能性)。しかし、新しいものを生成し、遺伝的アルゴリズムを使用してそれらを最適化することは、最適化の問題ではないため、私には不可能です...たとえば x^ 0.00 と x^0.01 は基本的に異なります。また、適切な演算子を最適化することはできません。それは機能しません。ごめん。

とはいえ、状況はそれほど悪くありません。適切な機能を探すことは、非常に一般的なタスクです。私は今、あなたが関数を知らないと仮定していますが、測定値からいくつかのポイントを知っています (とにかく、遺伝的アルゴリズムで適合度を計算するためにそれが必要だったでしょう?)。ラグランジュを使用して、これらの特定の点を通過する多項式を取得できるようになりました。ウィキペディアの記事の途中に 2 つの良い例があり、larange は非常に簡単に実装できます (10 行未満のコードだと思います)。また、基準点を追加するだけで、多項式の精度を向上させることができることに注意してください。

于 2011-06-24T12:54:23.247 に答える