【发布时间】:2017-03-28 17:28:38
【问题描述】:
我正在从事与遗传算法相关的学校项目。我需要创建一个近似算法,在其中创建随机 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))))
这些生成的表达式中的每一个都是随机的,并且是正确值的近似值。如果它们是列表,我如何运行这些生成的表达式?
【问题讨论】:
-
尝试
(eval (car (generate 2 3)))将第一个 lambda 转换为可以作为函数调用的真正 lambda。 -
@ThrowawayAccount3Million 是的,这是正确的,我必须使用 eval 并发送 namespace 参数。
-
那么你的问题是什么?这就是你运行表达式的方式。
标签: lambda scheme lisp racket genetic-algorithm