2016-11-14 2 views
0

Ich arbeite an einem Schulprojekt im Zusammenhang mit genetischen Algorithmen. Ich muss einen Approximationsalgorithmus erstellen, in dem ich zufällige Lambda-Ausdrücke erzeuge, um den korrekten Wert zu approximieren. Bisher bin ich in der Lage, zufällige Lambda-Ausdrücke zu erzeugen, dank eines Beispiels, das mir zur Verfügung gestellt wurde , hier ist mein Code:Wie kann ich zufällige Lambda-Ausdrücke generieren und ausführen?

#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)))) 

Jeder dieser generierten Ausdrücke ist zufällig und es ist eine Annäherung an den richtigen Wert. Wie kann ich diese generierten Ausdrücke ausführen, wenn sie Listen sind?

+1

Try '(eval (Auto (generieren 2 3)))' die erste Lambda in eine echte Lambda drehen, die Sie als eine Funktion aufrufen können. –

+0

@ ThrowawayAccount3Million Ja das ist richtig, ich muss _eval_ verwenden und den _namespace_ Parameter senden. – Riccardo

+0

Also was war deine Frage, dann? So führen Sie die Ausdrücke aus. –

Antwort

0

Normalerweise, wenn wir nur Ausdrücke mit gegebenen Werten für x und y auswerten wollten, brauchen wir eval nicht. Eine direktere Methode wäre apply-formula. In diesem Fall werden jedoch prozedural generierte, randomisierte Ausdrücke ausgeführt, so dass Eval benötigt wird.

Die Eval-Funktion nimmt eine Darstellung eines Ausdrucks oder Definition (als „zitierte“ Form oder Syntax-Objekt) und wertet es

Hier ist ein Beispiel, wieeval auszuführen:

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

Hinweis senden wir Namespace in jedem eval Anruf

würde Meine Lösung aussehen einfach so:

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

Wenn Sie meinen Code testen möchten, ändern Sie die Operanden, so dass es so aussieht (Da es nur Variablen x und y für jetzt bestätigt):

(define operands '(x y)) 

Quelle

Verwandte Themen