2007年11月9日星期五

九十月工作阶段小结(Fast Marching Methods)

不知不觉,距当初工作刚开始已经过去了九周了,中间过程曲折反复,本来预计月余即可完工的“小活”,至今仍距完工遥遥无期,现在已经把机子搬来打算“常驻”了。预期的结果中未来的迷雾中。
因为是第一次独立从事研究性的开发工作,所以对于时间的计算很没有把握,抱着一步一步来的心态来进行。开始比较紧张,直接搬入公司,附近就有技术大牛,随时可以得到支持。这在后面证明是保证进度相当重要的一点,很多的东西不是没有想法,大量的时间都消耗在代码的实现上了。在与冰冷的Error和Access violation的斗争中曲折前进,不知道什么时候自己才能达到“自在编程”的境界。
九周的时间进度是这样的,九月份的前三周主要是实现与导师商量好的算法,期间涉及到一个最小堆结构的实现,动态三维数组的设计,空间种子填充算法,以及对微分方程的数值求解等。最小堆是从算法导论上学的,不愧是经典,短短几十行代码效率非常高;动态三维数组申请空间时要多申请几个字节(参考:生死疆界——在new与delete之间);种子填充算法是自己想到,每次压栈的点选取当前点对面的五个点,事后证明运行的还不错。微分方程的求解是按文献中的说法来。期间穿插着网络实验的课程。到了第四周,程序大体结构已经完成,可是方程求解过程中老是出现无解的情况,拖了好几天。最后商量的结果是改变赋初值的方法看看有没有改善,十一之前还没改完,带着这个问题开始了两周的十一假期。
十一归来,新算法依然没有改进,只是无解的情况少了一点,只能采用近似的方法,最后程序是过了,效果也还令人满意。可还存在两个问题,一个是运行速度比较慢,一个是对初始地层扩展后形态的保持性较差。接下来的工作主要集中在这里。因为要应付网络实验考试,中间又占了将近一周时间。最后改来改去结果仍然不令人满意,期间顺手把地层数据体的存储操作做了一个类。对函数指针的使用和各个包之间的关系有了进一步的了解。到了现在,又进入了一个瓶颈阶段,目前是上下不能,体会煎熬的感觉。不过听说另一种方法的实现已经取得了初步的成功,而且没有出现数值不稳定的情况,也算是得到了一点慰籍。(人看到是05年的paper,我看的是99年的书。)
总结这9周,扣掉放假考试和零零碎碎的时间,工作时间5周,编了3000余行代码,平均一天不到100行当有效输出,最大的感觉就是“人力有穷尽”,虽说有数学基础的问题,有时仿佛就被魇住了,几天没有进展,然后旁人一点拨就发现原来只是一个微不足道的疏忽。但这段时间不应该放弃对原著的钻研,另一种方法取得进展就是一个证明,当初如果看了说不定就能从中获得启发。另外一个问题就是对于系统现在还不是很得心应手,虽说改过不少Bug,可是都停留在知其然不知其所以然的情况,很久以前改过的错误再碰到又要想半天,看来有必要深入底层研究一下。

没有评论: