【发布时间】:2016-10-29 08:16:48
【问题描述】:
我正在编写一个遗传算法。为了帮助在运行时使用设置,我正在尝试将设置(突变率、交叉机会、适应度函数......)保存到磁盘。这将允许我修改文件,然后偶尔读取文件以在运行时更新设置。从控制台获取输入会更容易,但 Intellij 获取输入的能力非常糟糕,并且被证明太难使用,所以这是我正在尝试的路线。
我的问题是:设置由记录表示。许多单独的设置都是数字,因此它们很容易保存到磁盘。然而,有些设置是函数,不能很好地保存:
(defrecord Settings [
gene-set
sequence-length
fitness-f])
(with-out-str (pr
(->Settings #{1 2 3}
10
#(count %)))))
产量:
"#ai.genetic_algorithm.genetic_algorithm2_2.Settings{:gene-set #{1 3 2}, :sequence-length 10, :fitness-f #object[ai.genetic_algorithm.genetic_algorithm2_2$eval776$fn__777$fn__778 0x1b30c92 \"ai.genetic_algorithm.genetic_algorithm2_2$eval776$fn__777$fn__778@1b30c92\"]}"
除了适应度函数的表示方式之外,大多数情况下这都很好。如果我尝试重新读取文件:
(read-string
(with-out-str (pr
(->Settings #{1 2 3}
10
#(count %)))))
我明白了:
ai.genetic-algorithm.genetic-algorithm2-2=> RuntimeException No reader function for tag object clojure.lang.LispReader$CtorReader.readTagged (LispReader.java:1245)
我只在尝试保存/读取函数时收到此错误。我猜它无法知道我要求它读取函数的内容,所以它会出错。
有没有办法可靠地将匿名函数保存到文件中?
是的,我知道read-string 有潜在危险。不过我只是将它用于个人项目,所以我并不担心这个漏洞。
【问题讨论】:
-
@OlegTheCat 哎呀。我不知道我怎么没找到。谢谢。对于我需要它来说,这似乎非常复杂。我可能只需要保存函数,尽管这也使事情复杂化:/
标签: clojure