2016-11-14 10 views
0

私は遺伝的アルゴリズムに関連する学校プロジェクトに取り組んでいます。私はランダムなラムダ式を作成して正しい値を近似する近似アルゴリズムを作成する必要があります。これまでのところ、ラムダ式をランダムに作成することができましたが、提供された例のおかげで、それらを実行する方法が残っていますここに私のコードはあります:ランダムなラムダ式を生成して実行するにはどうすればよいですか?

#lang racket 
(define operators '(+ *)) 
(define operands '(a b x y)) 

(define element 
    (lambda (L) 
    (list-ref L (random (length L))))) 

(define expression 
    (lambda (n) 
    (cond ((zero? n) (element operands)) 
      (else 
      (list 
      (element operators) 
      (expression (random n)) 
      (expression (random n))) 
      )))) 

;Generates lambda expression 
;n is the amount of expressions 
;p is the depth of each expression 
;Examples below 
(define generate 
    (lambda (n p) 
    (if (zero? n) empty 
     (cons 
     (list 'λ '(x y) (expression p)) 
     (generate (- n 1) p)) 
     ))) 

(generate 1 1) 
'((λ (x y) (* b y))) 
(generate 1 3) 
'((λ (x y) (* (* y y) (* y y)))) 
(generate 2 1) 
'((λ (x y) (+ b x)) (λ (x y) (+ b x))) 
(generate 2 3) 
'((λ (x y) (+ (+ a y) a)) (λ (x y) (* (+ (+ y y) (* a a)) (+ (+ y x) a)))) 

これらの生成された式はそれぞれランダムであり、正しい値に近似しています。これらの生成された式をリストの場合はどのように実行できますか?

+1

てみてください( 'evalの(車(2 3を生成)))'でいくつかの助け。 –

+0

@ ThrowawayAccount3Millionはい、それは正しいです、私は_eval_を使用し、_namespace_パラメータで送信する必要があります。 – Riccardo

+0

あなたの質問は何でしたか?それはあなたが式をどのように実行するかです。 –

答えて

0

通常、xとyの値を指定して式を評価したければ、evalは必要ありません。 apply-formulaでより直接的に使用されますが、この場合、手続き的に生成されたランダム化された式が実行されているため、evalが必要になります。

のeval関数は、(「引用された」として、フォームまたは構文オブジェクト)の発現または定義の表現を取り、それを

を評価します。ここevalのを実行する方法の例、です:

#lang racket 
(define ns (make-base-namespace)) 
((eval '(lambda (x y) (+ x x)) ns) 1 1) 

注我々はすべてのevalの呼び出しで名前空間を送信している

私の解決策は、単純に次のようになります。

((eval (car (generate 2 2)) ns) 1 1) 

あなたは私のコードをテストしたい場合は、次のようになりますので、(それは今だけのために、xとyの変数を検証しているので)、オペランドを変更します。

(define operands '(x y)) 

ソース

関連する問題