张春成
2022/12/23阅读:39主题:默认主题
人口红利
人口红利
姜文电影有一句名言
我就是为了这碟醋,才包的这顿饺子。
我让 ChatGPT 给我编了一段解释兰彻斯特方程的代码,于是我给它加了一个可视化的壳,现在已经说不清谁是饺子谁是醋了。代码可见我的前端笔记本
The Lanchester function explaining by ChatGPT[1]
兰彻斯特方程
兰彻斯特方程是著名的数学方程在军事冲突中的应用案例。而我想让 AI 帮我弄明白这个东西。
Lanchester's laws are mathematical formulae for calculating the relative strengths of a predator/prey pair. This article is concerned with military forces.
Lanchester's laws | Military Wiki | Fandom[2]
ChatGPT 给我的
先卖关子说一个哲学问题,那就是
什么问题是适合让 AI 替我们去做的?
我在这里大胆地认为,世上问题可以分为两类,一类是生成答案很难,但验证答案的正确性却很简单的;另一类是无论什么答案,验证答案的正确性却十分困难。在这里举个简单的例子,
哥德巴赫 1742 年给欧拉的信中哥德巴赫提出了以下猜想:任一大于 2 的整数都可写成三个质数之和。
那么,对于任意一个大于 2 的整数,我们可以放心地让 AI 去寻找一组解。而验证这组解的正确性非常简单,看它们是否均为质数,且其和是否正确即可。此为第一类问题。
然而,如果要问这组解是否是唯一的,或者如何能够找到全部符合条件的解,那么无论 AI 给出怎样的解集,我们验证解集完备性的困难都是相当大的。此为第二类问题。
目前,我认为第一类问题大概属于康德的”分析判断“,第二类问题大概属于他的”综合判断“。回到上面的问题,由于解的完备性不能够内涵于解的正确性,因此完备性是”综合“到正确性之上的外部概念,这导致难以证实它。
进一步来说,AI 适用于解决第一类问题,因为所需证明的概念是在命题之中的,在提出问题时,验证方法也立即确定了。而 AI 不适合解决的是第二类问题,因为它需要借助其他的证据,而验证过程往往也难以获得实证的证据。
而当我向 ChatGPT 提问兰彻斯特方程,并进行一些迭代后,它给我返回了这样一段代码。这段代码用于根据兰彻斯特方程模拟一场战斗,并给出胜利者和他幸存的兵力。验证这段代码”很简单“,只要它能通过一些测试用例即可。而要通过它来解释一些问题,则开始进入第二类问题的领域。
/*
Sure! The Lanchester function is a mathematical model that describes the relationship between the size of two opposing forces and their relative strength. The function takes the form of:
S1 / S2 = (B1 / B2) ^ (1/a)
Where:
- S1 is the size of force 1
- S2 is the size of force 2
- B1 is the strength of force 1
- B2 is the strength of force 2
- a is a constant that represents the relative efficiency of the two forces
Here is a JavaScript function that demonstrates the Lanchester function:
*/
function simulateBattle(s1, s2, b1, b2, a) {
// Initialize the size of each force
let size1 = s1;
let size2 = s2;
// Simulate the battle until one side loses
while (size1 > 0 && size2 > 0) {
// Calculate the relative strength of each force
let strength1 = Math.pow(b1 / b2, 1 / a);
let strength2 = Math.pow(b2 / b1, 1 / a);
// Calculate the number of units lost by each force
let loss1 = strength2 * size2;
let loss2 = strength1 * size1;
// Update the size of each force
size1 -= loss1;
size2 -= loss2;
}
// Return the winner and the final size of each force
if (size1 <= 0 && size2 > 0) {
return ["force 2", size2];
} else if (size2 <= 0 && size1 > 0) {
return ["force 1", size1];
} else {
return ["tie", 0];
}
}
// Example usage:
console.log(simulateBattle(100, 200, 2, 1, 2)); // Outputs: ["force 2", 100]
开席
这里饺子开始蘸醋啦。简单来说,我给它配了一个前端的壳,将它的结果进行大量模拟,形成了胜负和幸存数量图。图中横坐标代表部队 2 与部队 1 的数量关系(s2 值),其中部队 1 的数量始终为 100;图中纵坐标代表部队 2 与部队 1 的战力关系(b2 值),其中部队 1 的战力始终为 1.0;图中点的颜色代表获胜方,而大小代表获胜时幸存部队数量。

Simulation-grid
我按照部队 1 的数值情况将图分为 4 个象限,第一象限和第三象限分别代表部队 1 和部队 2 在数量和战力两个数值上均占绝对优势的情况。结果并不出人意料,在第一和第三象限中部队 1 和 2 分别完胜对方。
有意思的是另外两个象限,第二象限代表部队 2 的战力高于部队 1,但数量少;第四象限代表部队 2 的数量高于部队 1,但战力低。从获胜方的分布来看,部队 2 在第四象限的胜算更大,这说明数量上的压制效果大于质量上的优势。这即是所谓”人口红利“。

Simulation-curve
在进一步分析中,我将不同的 s2 和 b2 值单独以线条的形式绘制出来,如上图所示。由于我在单独绘制时,并没有改变坐标轴位置,因此空出来的另一个轴我用来表示幸存部队数量,正数代表部队 2 获胜,负数代表部队 2 落败。
可以看到随着 s2 的增多,见左图颜色越来越深的曲线族,部队 2 就越容易取得胜利,二者也近似满足平方律关系。并且,大量的曲线位于纵轴右侧,代表随着数量优势的增加,部队 2 不仅能胜利,他们的战斗减员也更少。另外,随着数量的增加,曲线迅速向右移动,这说明数量提升具有事半功倍的效果。
而随着 b2 的提高,见右图颜色越来越深的曲线族,虽然随着战力增加,部队 2 也越容易获胜,剩余部队数量与战力提升呈现逐级误差的关系,体现在曲线的上限不高,越往上却越密集。
这即是所谓”人口红利“。斗胆想一想,这也是古罗马奴隶军团能够战胜古希腊市民城邦的数学原理。
下图是模拟结果的等势面图,它可以展示一些结果的细节。

Simulation-contours
随机化
上面是规规矩矩的模拟,下面使用蒙特卡洛法对参数进行采样,可以让图像富于变化,如下图所示。看到中间出现的那条紫色的深谷了吗?在那里就是两支部队博弈的均衡点,这个模型告诉我们,关键时刻人多比素质高更有用。

Full-mc
参考资料
The Lanchester function explaining by ChatGPT: https://observablehq.com/@listenzcc/the-lanchester-function-explaining-by-chatgpt
[2]Lanchester's laws | Military Wiki | Fandom: https://military-history.fandom.com/wiki/Lanchester%27s_laws#:~:text=The%20Lanchester%20equations%20are%20differential%20equations%20describing%20the,to%20demonstrate%20the%20power%20relationships%20between%20opposing%20forces.
作者介绍