Netlogo 过渡,向后兼容

Netlogo transition, backwards compatibility

想将 100-150 个本地 Netlogo 4.1.3 程序升级(如果是这样的话)到 Netlogo 6,最好通过 Perl 或其他脚本语言批量升级,然后是(必要的) ) 人工检查并完成。

令我沮丧的是 Netlogo 6 无法打开 Netlogo 4 文件,所以我通过在 Netlogo 5 中打开它们升级了其中的一些文件,保存并在 Netlogo 6 中重新打开并保存。不是特别优雅的方式。

有什么建议吗?

看起来 Netlogo 6 无法读取 4.1.3 文件的原因是它需要 12 个部分,而 4.1.3 文件有 10 个或 11 个部分。据我所知,部分被分解了通过字符串“@#$#@#$#@”。此外,旧的 .nlogo 文件具有版本 6 无法理解的 "CC-WINDOW" 参数。最后,Netlogo 6 中的按钮也需要用值 1 或 0 进行参数化,以确定该按钮是否在滴答开始之前被禁用。

下面的 python 3 代码将 all 个 Netlogo 文件放在同一文件夹中,并删除 "CC-WINDOW" 行。它还在每个 "Button" 块的末尾添加一个 1。当代码读取文件时,它会计算“@#$#@#$#@”中断的次数。如果在文件末尾,少于 11 个,它会附加足够的“@#$#@#$#@”分隔符,使总数达到 11。

如果你想运行这个代码,我会把你想更新的旧文件复制到一个新文件夹中。将包含以下代码的 .py 文件放入同一文件夹中,当您 运行 时,它将为 6.0 兼容版本创建新文件(请注意,它不会仅 更新 4.1.3 文件,但 任何 该文件夹中的 netlogo 文件 )。这不适用于每个文件 - 例如,一个文件没有正确更新,因为原始模型的 "GRAPHICS-WINDOW" 没有正确参数化。也就是说,此代码适用于我测试的大多数 4.1.3 模型库模型。另外,我只知道它允许您在 Netlogo 6 中打开文件,我不知道之后需要做什么才能确保模型实际上 运行 正如您所期望的那样。

希望对您有所帮助!如果我在某些方面不清楚,请告诉我。

import os

with open("files_updated.txt", "w") as files:
    for filename in os.listdir("."):
        if filename.endswith(".nlogo") and not filename.startswith("6"):
            files.write(filename + '\n')
            opened = open(filename, "r")
            n = 0
            printat = -1
            cut_count = 0
            count_breakers = 0

            new_file_name = ("6_"+filename.strip(".txt") + ".nlogo")
            print(new_file_name)
            with open(new_file_name, "w") as out:
                for line in opened:
                    n += 1
                    if line == "@#$#@#$#@\n":
                        count_breakers += 1
                    if line == "CC-WINDOW\n":
                        cut_count = 8
                    cut_count -= 1
                    if cut_count < 0:
                        out.write(line) 

                    if line == "BUTTON\n" :
                        printat = n + 14

                    if printat == n:
                        out.write("1\n")

                if count_breakers < 11:
                    out.write("@#$#@#$#@\n" * (11 - count_breakers))

这里是simple conversion script。欢迎提出改进建议。