沿着多面体的棱往上爬
线性不等式围出一个凸多面体,最好的点一定在某个顶点上;单纯形法从一个顶点出发,每步沿一条棱走到更好的邻居,走不动了就是最优。
1947 年夏天,他在五角大楼要解的是空军那种成百上千个活动互相牵扯的计划。他在 1963 年那本书第 2 章里交代了算法的来路:那个夏天赫维茨和他一起试过好几种解法,库普曼斯出过主意,结果就是单纯形法;而「沿着凸多面体的棱,从一个顶点走到下一个」这个显而易见的念头,起初凭直觉被当作太低效而放弃了——顶点多得吓人。换一种几何去看(他后来叫它「列几何」,与他博士论文里的那种凸组合一脉相承),它才显得有效,「于是幸好试了一下,留了下来」。道理不复杂:线性的目标在凸多面体上没有「局部最高而全局不是」的陷阱,只要站在一个顶点、所有相邻的棱都不再往上,这里就是最高;而一次换基就是从一个顶点沿一条棱走到相邻的顶点。首创权要分层写:他自己在同书第 21 页说,傅里叶 1826 年为「最大偏差最小」的拟合把问题化成找一个多面体的最低点,提议从顶点到顶点往下走,「这大概是已知最早的线性规划问题」,1911 年德拉瓦莱普桑也提过类似的办法——可两人都没往下做,也没有人把它当成一类有用的问题;让它变成一门算得动的学问,是 1947 年的事。他第一次公开讲单纯形法是 1947 年 12 月 29 日美国统计学会与数理统计学会的联合年会,那篇稿子没有发表。演示里的多面体有 32 个顶点、49 条棱;从原点出发,六个方向最多走五条棱就到顶。
点一个目标方向,看单纯形法从原点出发沿哪几条棱爬到顶;右边逐步列出顶点与目标值
目标方向 (1, 1, 1):从原点出发走了 5 条棱(换基 6 次,有 1 次是退化的、原地不动),停在目标值 18.032 的顶点;多面体一共 32 个顶点,逐个去试要算 32 次。
