在本节中,我们讨论系统设计过程的复杂性挑战,主要包括两个方面的复杂性:第一个是以问题求解为目标的设计过程固有的复杂性挑战,即设计复杂性;第二个是基于组件的系统构建过程中系统模型存在的复杂性挑战,即模型复杂性。
如前所述,系统设计从功能需求分析开始,通过系统建模和应用软件开发来实现系统的各项功能,随后对系统组件以及整个系统进行评估和验证,以检测系统是否满足预期需求。这一过程所呈现的复杂性反映了系统设计活动固有的困难。
在系统设计初期,设计人员面临的一个主要困难是缺乏检查需求规范是否完备的方法。这里,完备性意味着在需求分析过程中,待设计系统的各个关键行为或者事件都不会被忽略。然而,在早期阶段,许多系统行为是未知的,设计人员无法准确地描述未知的行为,这通常被称为“ 未知的未知(unknown unknowns) ”。这种类型的“ 本体复杂性(ontological complexity) ”是关键事件或条件遗漏的根本原因。因此,在早期的设计验证过程中,设计人员无法完备地检测到未知的关键行为,也无法预测这些行为何时会发生。当这些行为发生时,也就无法确认它们出现的具体原因。如果在后期的系统集成过程中发现了这些错误行为,或者更糟糕,在系统运行过程中出现了非预期或错误的行为,那么修复这些错误行为则需要更高的成本和代价。
除需求的完备性之外,在需求的描述过程中应当将需求分解为一组属性,如功能安全属性、信息安全属性以及性能属性等,这些属性能够在系统设计模型上进行可满足性检查。 语言复杂性(linguistic complexity) 的特点是难以用准确无歧义的语言刻画用户的需求,尤其是在处理 人机交互(Human Machine Interface,HMI) 或者信息安全相关的属性时,这种困难更加突出,严格的形式语言很难描述诸如舒适性或防止恶意行为攻击等概念。
最常见的复杂性类型为 不确定性的复杂性 ,不确定性的根源在于系统运行平台及其外部物理环境所固有的不可预测性。不确定性所带来的复杂性是构建自主系统的主要障碍,这有许多种原因,例如,系统环境可能是模糊不定的,也可能是随着随机事件(如组件故障)或罕见事件(如恶意攻击)而动态变化的。
认知复杂性(epistemic complexity) 刻画了对系统行为及其环境的建模和理解所固有的困难。建模语言的表达能力是否足以真实地解释所有潜在的系统行为?答案往往是否定的。如何真实地对复杂系统进行建模?事实上,对计算系统严密准确地建模是一个具有挑战的问题,当前尚不存在一个系统化的解决方案。如果无法理解所有可能的系统行为及其细节,我们就无法构建真实的系统模型。从另一方面来说,这也意味着构建近似的抽象系统模型是至关重要的。
图2.2给出了系统设计全流程活动中各种类型的复杂性问题。在这些活动中,设计人员往往需要使用各种软件工具,特别是受限于 计算复杂性(computational complexity) 的形式化验证和分析工具,进行辅助设计。我们知道,理论上,对于无穷状态系统,大多数非平凡的验证问题都是不可判定的,无法用一般化的算法来求解;而对于有限状态系统,尽管存在一般化的求解算法,但其计算复杂性与系统的状态空间规模息息相关,且随着系统状态空间的增加而呈指数级上升。
图2.2 系统设计全流程活动中的复杂性问题
基于组件的系统设计方法通常按照特定的体系架构进行组件的集成和适配,从而构建系统模型。在这种设计方法下,模型复杂性可以通过以下两个方面进行刻画,即组件交互的复杂性以及体系架构的复杂性。下面,我们分别讨论不同级别的 交互复杂性(reactive complexity) 和 体系架构复杂性(architecture complexity) 。
1 . 交互复杂性
假设组件的行为可以通过输入/输出函数来刻画,那么该组件对整体系统复杂性的影响取决于该组件与其他系统组件之间的交互复杂性 [13] 。图2.3给出了不同交互复杂性的组件分类。
(1)转换组件(transformational component) :这是最简单的组件类型,对每个输入值,其输入/输出函数都能计算出一个相应的输出值。典型的转换组件有图像分类软件和算术运行软件等。
图2.3 不同交互复杂性的组件分类
(2)流组件(streamer component) :这是另外一种类型的组件。与上述转换组件不同的是,流组件在某些计算步骤中产生的输出值,不仅取决于当前输入值,还取决于历史输入值。流组件在诸如音视频编码/解码器、信号处理模块和自然语言翻译软件等多媒体应用中较为常见。
(3)嵌入式组件(embedded component) :这是一种更复杂的组件类型,可以视为与外界环境持续交互的流组件,通过实时监控环境状态的变化,计算相应的输出,控制环境状态的演变过程,以确保系统满足给定的属性。典型嵌入式组件包括各类自动化系统,如飞行控制器以及辅助驾驶系统等。
(4)信息物理组件(cyber-physical component) :顾名思义,这是信息物理系统的组成单元,主要用于实现嵌入式控制系统与其物理运行环境的紧密集成。典型的信息物理组件包括自动驾驶汽车的感知、决策和执行等功能模块。这些组件既包括具有离散计算特性的组件,也包括对连续物理过程建模的组件。如何组织异质信息物理组件之间的复杂交互,实现正确且高效的组件集成,仍然是一个极具挑战的难题 [14] 。
2 . 体系架构复杂性
体系架构 是一种组织和描述组件之间交互协作的机制。在系统设计中,体系架构可以在系统层面约束组件的行为,确保给定的全局属性得到满足。如图2.4所示,根据对系统复杂性的影响,体系架构可以分类如下 [15] 。
(1)静态架构(static architecture) :这是最简单的体系架构类型,它仅涉及有限多个组件及其交互规则,如硬件架构、数据流架构等。
(2)参数化架构(parametric architecture) :这是一种以组件数量为参数的组织协作模式,即架构含有任意多个组件。通常,这种架构主要应用在分布式协议中,如 令牌环(token ring) 或缓存协议等。
图2.4 体系架构分类
(3)动态架构(dynamic architecture) :这是一种特殊的参数化架构。在这种架构中,组件个数是任意多个,并且可以在系统运行过程中动态变化。例如,在客户-服务器架构中,伴随着客户的接入或退出,相应组件也可以在系统运行时动态增加或减少。
(4)移动架构(mobile architecture) :这是一种含有可移动组件的动态架构。由于可移动组件的存在,这些架构的结构关系以及组件之间的交互协作规则也将随着时间和空间的变化而动态变化。这类架构主要应用于移动通信系统和网络,如蜂窝网络等。
(5)自组织架构(self-organizing architecture) :这种架构建立在移动架构基础上,除了具有时间和空间关系的动态变化特性,架构中组件的行为也会随着其位置的变化而变化。这些架构允许通过多种组织模式之间的动态切换来进行系统配置更新,并且每种模式都有自身的交互协作规则,对于复杂的自主系统建模至关重要,如集群机器人和自主车联网等。
基于上述对复杂性不同来源的理解,我们能够提出更好的系统设计方法,以应对系统设计过程中的各种复杂性问题。在后续第3章,我们将提出一种严密系统设计方法,该方法的基本原则建立在形式化理论基础之上,能够在一定程度上解决系统设计各个阶段所面临的复杂性问题。