【问题标题】:Serializing anonymous functions序列化匿名函数
【发布时间】: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 有潜在危险。不过我只是将它用于个人项目,所以我并不担心这个漏洞。

【问题讨论】:

标签: clojure


【解决方案1】:

如果您将代码更改为,而不是生成函数,然后从命名空间中提取该函数以将其保存到文件中,您宁愿为设置生成表达式,然后立即将表达式保存到文件中。然后使用加载该文件的结果作为新状态。

user> (let [new-config '{:gene-set #{1 2 3}
                        :sequence-length 10
                        :fitness-f (fn [x] (count x))}]
           (with-open [w (clojure.java.io/writer "/tmp/config.edn")]
             (binding [*out* w]
               (pr new-config)))     
           (load-file "/tmp/config.edn"))

{:gene-set #{1 3 2}, 
 :sequence-length 10, 
 :fitness-f #function[user/eval111126/fn--111127]}

当您定义要保存的新适应度函数时,将其生成为符号序列并在将其编译为函数类之前保存该序列。让它编译的唯一时间是它被加载的时候,这样你就知道它总是可以加载的。这将捕获错误。

如果您发现自己想要机械地生成这些组合,您可能需要考虑给它们命名,只在配置中保存组合顺序。

【讨论】:

    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多