2016-11-14 7 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

Try '(Eval (автомобиль (генерировать-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) 

Если вы хотите проверить свой код, модифицировать операнды так это выглядит следующим образом (Поскольку он проверяет только х и у переменные в настоящее время):

(define operands '(x y)) 

Источник

 Смежные вопросы

  • Нет связанных вопросов^_^