软件测试悖论之Braess悖论 软件测试
关于 Braess 悖论的原始工作是 Dietrich Braess 的“ über ein Paradox der Verkerhsplannung ”( 1968 )。而我的例子,是基于我发现的几个例子,这几个例子对 Mark Wainwright 的工作作出了贡献。当时我不能亲自参加到 Wainwright 的原始工作中。
Braess 悖论相当复杂,所以这里我给一个简化的、离散近似。假设象图 5 中显示的一样有四个城镇——城镇 A ,城镇 B ,城镇 C 和城镇 D 。
连接任意两个城镇之间的每一条路都有一个关联成本,由图中与路相邻的方程给出。成本是陆上汽车数的函数。你能想象成本代表了在这条路上行驶所需要的时间,或者所需要的汽油,或者你们想要最小化的某些因素。现在假设某一个早晨,有 6 辆车从城镇 A 离开,每次一辆,目的都是城镇 D 。汽车 1 离开的时候,路上完全是空的。该车可以从两条路径中选择: A-B-D 和 A-C-D 。 A-B-D 的成本是 [4(1) + 1] + [1 + 16] = 22 。由于该图的对称性,路径 A-C-D 的成本也是 22 。假设汽车 1 选择了路径 A-B-D 。
图5 公路网络: Braess 悖论
现在汽车 2 准备离开了。他看到汽车 1 在路径 A-B-D 上,因此知道了现在 A-B-D 上的成本是 [4(2) + 1] + [2 + 16] = 27 ,所以他选择了成本只有 22 的路径 A-C-D 。汽车 3 看到每条路径上都有一辆车,所以选择了成本是 27 的路径 A-B-D 。汽车 4 选择了成本是 27 的路径 A-C-D 。汽车 5 看到四辆车是均匀分布的,他选择了路径 A-B-C ,成本是 [4(3) + 1] + [3 + 16] = 32 。最后,汽车 6 选择了成本是 32 的路径 A-C-D 。现在所有六辆车都在从城镇 A 到城镇 D 的某一条路径上。因为每一条路径上有三辆车,而两条路径是对称的,每辆车的成本是 32 。
这是 Braess 悖论出现的地方。如果在城镇 B 和城镇 C 之间增加一条新的、有效的路径,你认为会出现怎样的结果?常识是,增加道路容量会降低司机们的成本。但是既然这种现象被叫做“ Braess 悖论”而不是“ Braess 常识”,你应该猜到实际发生的并不是如此。
假设修改图 5 中的地图,在城镇 B 和城镇 C 之间增加了一条高效快捷路径,它的成本函数是一个常数 1 。在加入了快捷路径的第一个早晨,汽车 1 准备离开城镇 A 。他有四种可能路径选择,各条路经的关连成本如下:
A-B-D cost = [4(1) + 1] + [1 + 16] = 22
这是很有希望的。汽车 1 选择了路径 A-B-C-D ,通过快捷路径来显著降低他的交通成本——至少暂时如此。汽车 2 准备离开了。他看到汽车 1 选择了路径 A-B-C-D ,于是分析他的可能成本:
A-B-D cost = [4(2) + 1] + [1 + 16] = 26
经过快速数学计算之后,汽车2页选择了路径 A-B-C-D 。尽管汽车 1 已经在这条路径上了,快捷路径的有效性仍然使得它是汽车 2 的最好选择。
现在汽车 3 准备离开了,他的选择是:
A-B-D cost = [4(3) + 1] + [1 + 16] = 30
A-C-D cost = [1 + 16] + [4(3) + 1] = 30
A-B-C-D cost = [4(3) + 1] + 1 + [4(3) + 1] = 27
A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35
再次,这个快捷路径 A-B-C-D 是最好的选择。汽车 4 准备离开城镇 A ,观察了钱三个司机的决定,算出了他自己的成本:
A-B-D cost = [4(4) + 1] + [1 + 16] = 34
A-C-D cost = [1 + 16] + [4(4) + 1] = 34
A-B-C-D cost = [4(4) + 1] + 1 + [4(4) + 1] = 35
A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35
快捷路径上目前的交通使得 A-B-C-D 比路径 A-B-D 和 A-C-D 的成本要高。假设汽车 4 选择了路径 A-B-C (如果汽车 4 选择了 A-C-D ,细节会有一点不同,但是总的结果是一样的)。
汽车 5 现在准备离开了,他分析了他的选择:
A-B-D cost = [4(5) + 1] + [2 + 16] = 39
A-C-D cost = [1 + 16] + [4(4) + 1] = 34
A-B-C-D cost = [4(5) + 1] + 1 + [4(4) + 1] = 39
A-C-B-D cost = [1 + 16] + 1 + [2 + 16] = 36
因此汽车 5 决定选择路径 A-C-D 。最后一辆车,汽车 6 ,现在准备离开了,他观察了前面 5 个司机的决定,做出了他自己的分析:
A-B-D cost = [4(5) + 1] + [2 + 16] = 39
A-C-D cost = [2 + 16] + [4(5) + 1] = 39
A-B-C-D cost = [4(5) + 1] + 1 + [4(5) + 1] = 43
A-C-B-D cost = [2 + 16] + 1 + [2 + 16] = 37
汽车 6 选择了路径 A-C-B-D ,因为这是成本最低的。现在 6 辆车都在路上了,你可以算出每辆车的成本。
Car 1 route A-B-C-D, cost = [4(4) + 1] + 1 + [4(4) + 1] = 35
Car 2 route A-B-C-D, cost = [4(4) + 1] + 1 + [4(4) + 1] = 35
Car 3 route A-B-C-D, cost = [4(4) + 1] + 1 + [4(4) + 1] = 35
Car 4 route A-B-D, cost = [4(4) + 1] + [1 + 16] = 34
Car 5 route A-C-D, cost = [2 + 16] + [4(4) + 1] = 35
Car 6 route A-C-B-D, cost = [2 + 16] + 1 + [1 + 16] = 36
回忆一下,如果没有这条快速路,每辆车的成本是 32 。现在增加了额外公路容量,我们却增加每个司机的成本!
这个例子提供了一个对 Braess 悖论的实际接触。因为这和网络系统上所传输的数据包有明显的关系, Braess 悖论受到了研究人员的深入研究。你能非正式的总结这个悖论:有时候增加节点之间的路径数反而会增加网络拥塞。从软件测试角度来说, Braess 悖论会在进行网络性能测试的时候出现。老实说,你碰到 Braess 悖论的机会很少。但是这个现象确实存在。启示是,你不应该假设增加网络容量就会提高性能。如果你增加了容量但是没有看到你所期望的性能提高, Braess 悖论就是应该去调查的。