原代码下载 TestRun0512.exe (120KB) 悖论很奇妙。在本月的专栏里,我将向你们展示你们进行软件测试时可能遇到的三个有趣的案例。他们本质上是数学问题,而且他们对你们的问题库是一个很好的补充。
现在,假设对于安全性,原型 A 从 100 个用户当中获得了 85 个用户的优秀评价,而原型 B 从 400 个用户中获得了 300 个用户的优秀评价。对于这个数据,你能看到原型 A ( 85% 的优秀率)再次比原型B( 75% 的优秀率)要好。因此,你认为哪个原型要好?在你回答之前,让我们把图 1 中的数据整合到一个单独的表格当中(图 2 )。
如果你将优秀评价的数目结合起来,你就能看到原型 A 从 300 个用户中获得了 135 个优秀评价,比例仅为 45% 。相反,原型 B 有 63% 的优秀评价率,从 500 个用户当中获得了 315 个用户的优秀评价。因此,原型 B 要好,对不对?或者原型 A 要好?如果是原型 A 要好,你怎样解释这些整合之后的数据?
Simpson 悖论从数学上来说确实不是一种真正的悖论。一个数学悖论产生一个逻辑上不一致的答案,而 Simpson 悖论的结论是奇怪的、意料之外的,但是却是能够得到解释的。如果你想深入研究,网上有很多关于 Simpson 悖论的资料。给我们的启示是,当你检查测试结果数据的时候,你要先怀疑这些数据是不是从其他原始资料整合而来的。如果是,那么你应该看看原始未经整合的数据。另外,如果你在产生一个测试数据报告,当你尝试要整合数据以便简化你的阐述时要相当仔细。有人说“统计能用来说明任何你想要的”,这种情况正是它们说提及的。 Braess 悖论 现在来看看 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 A-C-D cost = [1 + 16] + [4(1) + 1] = 22 A-B-C-D cost = [4(1) + 1] + 1 + [4(1) + 1] = 11 A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35 这是很有希望的。汽车 1 选择了路径 A-B-C-D ,通过快捷路径来显著降低他的交通成本——至少暂时如此。汽车 2 准备离开了。他看到汽车 1 选择了路径 A-B-C-D ,于是分析他的可能成本: A-B-D cost = [4(2) + 1] + [1 + 16] = 26 A-C-D cost = [1 + 16] + [4(2) + 1] = 26 A-B-C-D cost = [4(2) + 1] + 1 + [4(2) + 1] = 19 A-C-B-D cost = [1 + 16] + 1 + [1 + 16] = 35 经过快速数学计算之后,汽车2页选择了路径 A-B-C-D 。尽管汽车 1 已经在这条路径上了,快捷路径的有效性仍然使得它是汽车 2 的最好选择。 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 ,细节会有一点不同,但是总的结果是一样的)。 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 。现在增加了额外公路容量,我们却增加每个司机的成本! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
http://www.yeeyan.com/articles/view/20618/10894?tag_related http://hi.baidu.com/laladu/blog/item/c2abe6dd2f1411ea76c638cd.html |