- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 Common Lisp (CLISP) 中实现进化算法,但遇到了问题。
我有一个树状类:
(defclass node ()
((item :initarg :item :initform nil :accessor item)
(children :initarg :children :initform nil :accessor children)
(number-of-descendants :initarg :descs :initform nil :accessor descs)))
还有一些方法:
(defmethod copy-node ((n node))
(make-instance
'node
:item (item n)
:descs (descs n)
:children (mapcar #'copy-node (children n))))
(defmethod get-subtree ((n node) nr)
(gsth (children n) nr))
(defmethod (setf get-subtree) ((val node) (n node) nr)
(setf (gsth (children n) nr) val))
(defmethod get-random-subtree ((n node))
(gsth (children n) (random (descs n))))
(defmethod (setf get-random-subtree) ((val node) (n node))
(setf (get-subtree n (random (descs n))) val))
(defun gsth (lst nr)
(let ((candidate (car lst)))
(cond
((zerop nr) candidate)
((<= nr (descs candidate)) (gsth (children candidate) (1- nr)))
(t (gsth (cdr lst) (- nr (descs candidate) 1))))))
(defun (setf gsth) (val lst nr)
(let ((candidate (car lst)))
(cond
((zerop nr) (setf (car lst) val))
((<= nr (descs candidate))
(setf (gsth (children candidate) (1- nr)) val))
(t (setf (gsth (cdr lst) (- nr (descs candidate) 1)) val)))
val))
我想做的是交换种群中两棵随机树的两个随机子树。但是当我做这样的事情时:
(defun stdx (population)
(let ((n (length population))
(npop))
(do ((done 0 (+ done 2)))
((>= done n) npop)
(push (stdx2 (copy-node (random-el population))
(copy-node (random-el population)))
npop))))
(defun stdx2 (father mother)
;; swap subtrees
(rotatef (get-random-subtree father)
(get-random-subtree mother))
(check-for-cycles father)
(check-for-cycles mother))
有时会检测到循环,这显然不应该发生。
检查循环没问题,我也用 (trace) 检测到循环。我一直在更新后代数。
我猜 (setf get-subtree) 有问题。我是 LISP 的新手,我不太擅长 setf 扩展。请帮助我。
最佳答案
想想这将如何实现:
;; swap subtrees
(rotatef (get-random-subtree father)
(get-random-subtree mother))
rotatef
形式将被宏扩展成类似这样的东西:
(let ((a (get-subtree father (random (descs father))))
(b (get-subtree mother (random (descs mother)))))
(setf (get-subtree father (random (descs father))) b)
(setf (get-subtree mother (random (descs mother))) a))
(您可以使用 macroexpand
来准确了解您的情况下的扩展。)
换句话说,随机子树将被选择两次(读取时一次,更新时一次),因此子树不会相互交换,而是对子树的引用被复制到另一棵树中的随机位置。
例如,在下图中,算法可能会选择蓝色和红色子树进行交换。但是当涉及到附加它们时,它会将它们放在标有圆点的点上。
图表的下半部分显示了子树附加到新点后的结果数据结构:您可以看到已经创建了一个循环。
所以你需要修改代码,这样你就可以选择随机子树一次。可能是这样的:
(let ((a (random (descs father)))
(b (random (descs mother))))
(rotatef (get-subtree father a)
(get-subtree mother b)))
关于tree - Setf(?)导致树中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13805966/
在 Practical Common Lisp 章节中 17. Object Reorientation: Classes Accessor Functions 部分,我发现很难理解 SETF 的扩展
我测试了《实用C++程序设计》一书中的代码。但是下面的例子并不像书上说的那样有效。我错过了什么?请帮忙。 #include int main() { int number = 0x3FF;
在使用 Common Lisp 进行开发时,我们可以通过三种方式来定义新的 setf 形式: 我们可以定义一个函数,其名称是两个符号的列表,第一个是 setf,例如(defun (setf some-
阅读 this question让我思考什么构成了表达式的有效汽车。显然,可以使用通常的语法“调用”符号和 lambda。根据hyperspec , function name n. 1. (in a
如果我像这样创建一个闭包, (let ((A (make-array '(10) :initial-element 5))) (defun h (i) (aref a i)) (
我正在使用动态变量,让我们调用其中一个值为 10 的 *x*。 我想通过将变量名作为参数传递给函数调用来更改它的值: (defun change-value (varname) (setf var
我正在 Common Lisp (CLISP) 中实现进化算法,但遇到了问题。 我有一个树状类: (defclass node () ((item :initarg :item :initform
船员, 我属于那种坚持使用 SETF 定义变量的类型。我已经升级到一台新机器(和一个新版本的 SBCL)并且它并没有让我摆脱这样做(自然地,我得到了适当的“==> undefined variable
目前正在学习 common lisp,遵循 Peter Seibel 的 Practical Common Lisp(我在第 11 章,关于集合),我很难理解 setf在引擎盖后面工作。 考虑到这个表
*mit = 13311 std::istringstream iss(*mit); double temp; iss.setf(ios::fixed, ios::floatfield); iss.p
我认为这在 Common Lisp 中是可能的(通过重载 setf),但不确定 Emacs Lisp。 我想做的是: (setf (local variable) value) (local ...)
为下面的变量执行 setf 的正确方法是什么? CG-USER(279): (defun LETTERSEARCH (string1 string2) (let ((newString nil))
我在我的脚本中定义了一个特殊变量 *unsorted-lst* 和一个用于重置此变量的函数: (defparameter *unsorted-lst* nil) (defun reset-to-uns
我知道我可以在 Common Lisp 中执行以下操作: CL-USER> (let ((my-list nil)) (dotimes (i 5) (setf my-l
我正在尝试编写一个函数,该函数将从列表中破坏性地删除 N 元素并返回它们。我想出的代码(见下文)看起来不错,除了 SETF 没有按我预期的方式工作。 (defun pick (n from) "D
假设我有两个变量,我想将值较小的变量设置为 nil。 有没有可能让它以这种方式工作? (setf a1 5) (setf a2 6) (setf (if ( (defparameter a1 5
上下文 根据我有限的 Common Lisp 经验,我发现像这样的代码并不罕见 (setf (gethash key table) (my-transformation (gethash
我试图在 Lisp 中编写“最接近”的函数,而不使用 setq/setf 等... 该函数找到给定向量的最近向量(在列表的列表中找到它)。 我试过了,但是没有套装太难了,非常感谢。 最佳答案 通常变量
在 Lisp 中,我定义了一个数组 a,然后让 b 等于 a。我现在想重新定义 b 的条目,使其等于 a 中的另一个条目,如下所示: (setf a (make-array '(2 2) :initi
以下代码生成从 1 到 n 的素数: (defun prime-list(n) (let ((a)(b)(x (floor (sqrt n)))) (loop for i from (fl
我是一名优秀的程序员,十分优秀!