近段时间在做PSO算法的优化,在测试性能时要使用CEC05的数据集。但这个数据集提供的测试函数接口十分蛋疼:以条件编译来区分一大堆同名同参数的函数。就像这样:
int a;
#define f1
//#define f2
#ifdef f1
a = XX;
double function()
#endif
#ifdef f2
a = YY;
double function()
#endif
在上面的例子中,如果要运行F2函数,就要把#define f1注释掉,并取消#define f2的注释,然后编译运行。但在CEC05中,这样的函数共有25个。也就是说,进行一轮完整的测试就要手动这个过程25次。况且,肯定不止进行一轮测试。
面对这个问题,一开始想到的是将整个工程重构下,但在重构过程发现,条件编译用得比较分散,改下来很麻烦。而且还可能出现改错的情况,因此改到一半就放弃了。之后才想到适合做重复性日常工作的批处理。思路也很简单:将头文件复制25份,每份对应一种注释,即第一份将F1之外的define都注释掉,第二份将F2之外的define都注释掉。。。。。。然后依次将25份头文件覆盖工程的同名文件,重新编译,并运行。代码如下:
@echo off
set testFun=1
:loop
if %testFun%==26 goto end
echo f%testFun% start at %time%
copy D:\code\PSO\global\f%testFun%.h D:\code\PSO\win_test\global.h
copy D:\code\PSO\global\cf%testFun%.h D:\code\PSO\myConstant.h
msdev D:\code\PSO\pso.dsw /make /rebuild
call D:\code\PSO\Debug\pso.exe f%testFun%_res.txt f%testFun%_mid.txt
echo f%testFun% end at %time%
set /a testFun=%testFun%+1
goto loop
:end
这里解释下几个语句:copy a\x.h b\y.h 就是将路径a的x.h拷到路径b处并将名字改为y.h。 msdev path /make /rebuild 就是调用VC6的编译器,将path路径下的工程重新编译。call path argument1 argument2 就是调用path里的exe,并将argument1和argument2作为参数传给那个exe。
有了这个批处理后,之后的测试只要双击下就行了>_<