2016-11-14 46 views
0

我正在研究一個與遺傳算法相關的學校項目。我需要創建一個近似算法,其中我創建隨機lambda表達式以近似正確的值,到目前爲止,我可以創建隨機lambda表達式,這要歸功於我提供的一個示例,但是,我堅持如何運行它們,這是我的代碼:如何生成並運行隨機lambda表達式?

#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(car(generate 2 3) –

+0

@ ThrowawayAccount3Million是的,這是正確的,我必須使用_eval_併發送_namespace_參數。 – Riccardo

+0

那麼你的問題是什麼呢?這就是你運行表達式的方式。 –

回答

0

通常情況下,如果我們只是想用x和y的給定值來計算表達式,我們不需要eval。更直接的將與應用公式一起使用,然而在這種情況下,我們正在運行程序生成的隨機表達式,因此需要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)) 

來源