编程语言本身的自由度是很高的,并且其天生的特点最适合用于数据处理,并不适合用来进行计算机仿真,这也是各种仿真使用软件比较多的原因之一。然而,大量的实际仿真任务可能无法完全依赖于软件,使用编程语言完成仿真任务成为了一项基本的需求。在使用编程语言完成仿真过程中,发现有一下几个难点:
1 过程复杂
完成一个看似简单的仿真任务,其实会有很多过程需要考虑,比如仿真的开始、谁主动通讯、谁被动通讯、仿真的终止条件、仿真的事件并行等,这些子过程组成了整个仿真大的过程。
2 客观规律难以完全抽象表示
仿真是对现实世界的模拟和近似,现实中很多常见的客观规律都需要用合适的方式抽象到仿真中。例如,汽车在转弯时车头的转角变化过程,现实中我们可以很容易想象出整个车头随前轮转向的曲线,但是这个过程就需要仿真去建立方程和过程去表示。换句话说,任何带有“智能”的常识与定理都需要在仿真中进行抽象表示。
3 需要考虑很多不关键但是又必须考虑的问题
想要对一个模型进行仿真时,大体的过程我们一定非常清楚,但是这里面会有很多的细节,这些细节又会消耗实现过程中很大部分精力。例如,对经典的农夫-狼羊草过河问题进行仿真,我们需要花费主要的时间在控制状态转移上面,而不是具体怎么过河过程以及结果的定义上。
4 建模思维与传统数据处理不同
传统数据处理如图像、语音、文字等数据的处理是经典的从上到下执行程序的过程,一个线程从头走到尾,就算涉及并行也只是加速计算。但是仿真不一样,因为仿真有时间的概念在里面,因此导致仿真过程会存在线程切换以及事件调度等问题。事实上,很多仿真事件处理上与电脑冯诺依曼结构很相似,但是它们都与我们正常的数据处理从上到下的人的普通思维不太一致。
5 模型的真实情况难以判断,模型优劣无固定指标
无论多么复杂的模型,只要抽象的够离谱,就一定能够搭建起来。因此,模型建立之后抽象的程度如何,对现实世界模拟的真实情况如何,我们只能通过可视化一些过程来判断。然而,这种判断方法只能给出一个大致的判断,并不能精确判断两个模型谁建立的更好。仿真结果的判断无法像神经网络一样给出一些定量的通用指标来判断,实际上我们大部分的判断方法就是“差不多就行了”。