1

,我目前正在创建一个遗传模糊学习系统及其相应的训练模拟环境->这个功能和类的集合由一个主脚本控制,其中用户定义诸如:模拟场景、控制器特性等。

结果是大约 50 个不同的 numpy 数组和列表作为我的特定问题的参数。这些参数必须提供给控制器生成函数,以及确定每个控制器有效性的模拟。这个过程目前正在使用 multiprocess.starmap_async 方法来并行化每个控制器的适应度。所以我的主脚本用大约 50 个参数调用控制器生成,多进程用大约 55 个进程调用它的工作人员,工作人员用 57 个输入调用所有模拟文件。(我目前的理解是,为多进程使用这么多输入参数不会增加开销,因为它们只是指向数据的名称,而不是复制或重新初始化它......如果我错了,请告诉我!)

我知道我可以用一个包含我所有参数的列表来替换我的 50 个参数,并且我可以在我的主脚本中使用全局变量来避免必须做所有这些簿记。很多这些变量不会改变,而是我不想多次计算的大型数据结构。是否有其他方法,并且一种被认为是最可以接受的?我希望在我的项目中每次调用任何东西时都避免使用 10 行 args。

尽可能残酷,一切运行完美,但我的模拟只会变得越来越复杂,(非可选)参数的数量越来越多。我删除了所有更具体的 var 名称,但这是我的主脚本运行的调用:

    (opt_str,opt_fit) = Trainer(map_size,Targets,SAMS,SAMS_stat,AIS,AIS_stat,
                          B_mpammo,B_sdammo,Route,vel,B_range,A_range, S_range,B_flight,
                          A_flight, S_flight,... lots more)

在我的 GA 里面,我有:

        step = np.int8(pop_size/8)
        pol = Pool(processes=8)

        res = pol.starmap_async(SimWorker, ((i, i+step, map_size,Targets,
                                SAMS,SAMS_stat,AIS,AIS_stat,
                                B_mpammo,B_sdammo,Route,vel,B_range,
                                A_range,S_range,B_flight,
                                A_flight, S_flight,fitness,
                                ttr,ttb,ttcr,ttcb,pos,times,pop,... lots more args) for i in range(0, pop_size, step)))

和 SimWorker:

for p in range(start, stop):
    fitness[p] = Sim_T(map_size,Targets,SAMS,SAMS_stat,AIS,AIS_stat,
                            B_mpammo,B_sdammo,Route,vel,B_range,A_range,S_range,B_flight,
                            A_flight, S_flight,
                            ttr,ttb,ttcr,ttcb,pos,times,pop[p],... lots more)
4

2 回答 2

1

在面向对象编程的意义上,您绝对应该将所有这些参数封装到一个对象中。这个对象是一个简单的字典还是一个更高级的对象是一个应该仔细考虑的设计问题。我们当然需要更多信息来给出更具体的答案。

于 2013-07-18T12:44:17.707 回答
0

如果你使用关键字参数,也就是**kwargs你可以只传入你需要的参数,而不需要你不需要的参数。然后,您的函数可以检查并获取它想要的函数。

或者,创建一个表示状态的对象(我建议一个类),然后构建它并将其传递给函数。

于 2013-07-18T12:43:01.240 回答