🧠 第十二章 金融与农业:驱动智能决策与产业升级
📄 一句话概括

八块地、一万二千立方米水。 按面积平均摊,每亩都是 87 立方米,总产量 8441 吨——只有最优的 93.1%,少打 625 吨。 按边际收益贪心分,亩均从 31 到 140,差了 4.5 倍,总产量 9066 吨。 最扎眼的是第 8 块:它 40 亩,按面积摊能分到 3478 立方米,可亩产上限只有 30 公斤。

📝 本节和前面几节的关系

上一节是一块地上的一个决策。这一节是多个对象争一份资源—— 灌溉、电力、带宽、预算,数学结构完全一样。 而这类问题最先撞上的不是算法,是「平均才公平」这个直觉。

一、按面积摊水,看着最公平

灌溉用水按亩分配,几乎是不需要讨论的规矩:谁家地多,谁家水多。 它公平、透明、好执行,而且不需要知道任何一块地的产量函数。 问题是它假设「每块地对水的反应一样」。 而真实的地千差万别:有的地给一点水就增产很多,有的地灌满了也就那样。 平均分等于把水浇在了不需要它的地方。 而且这种浪费是静默的——没有哪块地会喊「我水太多了」,只有总产量比预期低一点。 Demo 造 8 块地,面积共 138 亩,总水量 12000 立方米(亩均 87)。 每块地有自己的产量上限 aa 和半饱和参数 bb,产量是 aa 乘(1 减 exp(负亩均水深除以 bb))。 然后比三种分法:按面积摊、每块平均、按边际收益贪心。 贪心的规则只有一句:每次把下一单位水,给当前边际收益最大的那块地。

二、三种分法的差距在哪

分配方式 最小亩均 最大亩均 总产量 相对最优
按面积摊 87 87 8441 93.1%
每块平均 38 188 8731 96.3%
按边际收益贪心 31 140 9066 100.0%
按面积摊:每亩都是 87,完全均等,总产量 8441 吨。
贪心:亩均从 31 到 140,差 4.5 倍,总产量 9066 吨。
少打 625 吨,占 7%。
这个差距在农业上不算小——它相当于把最优方案的产量砍掉十四分之一。
最能说明问题的是第 8 块地:
它 40 亩,按面积摊能分到 3478 立方米。
但这块地的亩产上限只有 30 公斤,亩均水深过了 20 就基本没用了。
贪心只给它 1240 立方米,省下的全挪给别的地。
注意「每块平均」这一行反而比按面积摊高(96.3% 对 93.1%)。
它连面积都没看,怎么会更好?
因为它给每块地一样多的水,面积大的第 8 块自然就少拿了——误打误撞避开了那块低产地。
这是运气,不是方法。

三、公平和效率的正面冲突

如果只看总产量,贪心显然最优。 但现实中没人敢直接这么分水。 因为第 8 块地的主人会问:凭什么我的亩均只有 31,别人有 140? 这个问题没有技术答案,它是分配制度问题。 所以真实的做法通常是「效率改进 + 公平约束」两段式: 先按规则分基础水量(保证公平),剩下的增量水按边际收益竞价或分配。 这也是水权交易、碳排放权交易、频谱拍卖的共同结构: 初始分配讲公平,再分配讲效率。 把两件事混在一次分配里做,两边都不满意。 还有一个务实的方向:把「公平」定义成「结果的公平」而不是「投入的公平」。 按面积分水是投入公平;如果改成「保证每块地的总产量不低于某个水平」, 那才是结果公平——而它在数学上允许亩均水量差好几倍。

四、落地:贪心只要一句规则

那个贪心算法只有一句规则:每次把下一单位水,给当前边际收益最大的那块地。 它不需要解方程,也不需要知道全局最优的形式,只要能算出「下一单位能多打多少粮」。 这条规则在工程上极其好用,因为它可以在线执行: 水是陆续到的,每来一批就按当前边际收益分一次,不需要事先知道总水量。 而最优解(等边际)需要全局信息才能算。 代价是精度:Demo 里贪心用 20 立方米一步,步长越细越接近最优,但计算量也越大。 实用上 8 块地、20 立方米一步只要几千次计算,可以忽略。 最后一句:边际思维在工程上的样子就是这句话—— 不要问「总共该给多少」,要问「再给一单位,谁最划算」。 前者要全局信息,后者只要一条曲线。

五、动手 Demo:灌溉分配:按面积摊水只有最优的 93%,少打 625 吨粮

造 8 块地(面积共 138 亩,各块产量上限与半饱和参数不同),总水量 12000 立方米。 产量按「aa 乘(1 减 exp(负亩均水深除以 bb))」算。 比较三种分法:按面积摊、每块地平均、按边际收益贪心(20 立方米一步),再对比最小与最大亩均水深。

def prod(w):                 # w 是每块地的总水量
    depth = w / area
    return aa * (1.0 - np.exp(-depth / bb))

w_greedy = np.zeros(m)
left = W
while left > 1e-9:
    stepv = min(step, left)
    cur = prod(w_greedy)
    g = (np.diag(prod(w_greedy + eye * stepv)) - cur) / stepv
    w_greedy[int(np.argmax(g))] += stepv   # 给边际收益最大的
    left -= stepv

实跑输出:

--------------------------------------------------------------------
灌溉分配:按面积摊水只有最优的 93%,少打 625 吨粮
--------------------------------------------------------------------
  地块                     8 块,面积共 138 亩
  总水量                   12000 立方米(87 亩均)
  产量响应                 上限 aa 乘(1 减 exp(负亩均水深除以 bb))
  分水粒度                 每步 20 立方米

  分配方式         最小亩均   最大亩均   总产量   相对最优
  -------------------------------------------------------
  按面积摊               87         87     8441      93.1%
  每块平均               38        188     8731      96.3%
  按边际收益贪心         31        140     9066     100.0%

  **按面积摊水看着最公平:每亩地都拿 87 立方米,一模一样。**
  **但总产量只有最优方案的 93.1%,少打 625 吨。**
  **为什么?因为每块地的响应曲线不一样。**
  **有的地给一点水就增产很多,有的地灌满了也就那样。**
  **平均分等于把水浇在了不需要它的地方。**
  最能说明问题的是第 8 块:**它 40 亩,按面积摊分到 3478 立方米。**
  **但这块地的亩产上限只有 30 公斤,亩均水深过了 20 就基本没用了。**
  **贪心只给它 1240 立方米,省下的全挪给别的地。**
  看亩均那一列:**按面积摊是 87 到 87,完全均等;**
  **贪心是 31 到 140,差了 4.5 倍。**
  **最优方案让亩均水量差出 4.5 倍——差的那几块,给水不划算。**
  有意思的是「每块平均」:**它连面积都没看,反而比按面积摊高(96.3% 对 93.1%)。**
  **因为它给每块地一样多的水,面积大的第 8 块自然就少拿了——**
  **误打误撞避开了那块低产地。这是运气,不是方法。**
  **这就是「公平」和「效率」的正面冲突。**
  **在灌溉、电力、带宽、预算分配里,这是同一个数学问题。**
  那个贪心算法只有一句规则:**每次把下一单位水,给当前边际收益最大的那块地。**
  **它不需要解方程,也不需要知道全局最优的形式,只要能算出「下一单位能多打多少粮」。**
  **这就是边际思维在工程上的样子:**
  **不要问「总共该给多少」,要问「再给一单位,谁最划算」。**
  要说明:地块面积、响应曲线参数都是我**设的**。
  **真实灌溉还要考虑输水损耗、地形、轮灌周期、盐碱化。**
  **但「平均分配次优、边际均衡最优」这条结论不依赖具体参数。**

这张表最容易被误读的是「每块平均 96.3% 比按面积摊 93.1% 高」。 别把它当成方法有效——它只是恰好躲开了低产地。 换一套地块参数,它就会变成最差的那个。 真正稳的是贪心,因为它的依据是每块地自己的边际曲线,而不是任何「平均」的假设。 第 8 块那个数字最值得记住:按面积摊给它 3478 立方米,贪心只给 1240。 差出来的 2238 立方米,在别的 7 块地上能多打几百吨粮。 这就是「平均」的隐性成本——它不产生任何报错,只是少收了粮。 亩均 31 到 140 这个跨度,是这套方案的「政治成本」。 技术上越优的方案,分配上越难看——这是所有资源分配问题的通病。 要说明:地块面积、响应曲线参数都是我设的。 真实灌溉还要考虑输水损耗、地形、轮灌周期、盐碱化。 但「平均分配次优、边际均衡最优」这条结论不依赖具体参数。

30 秒实验

  1. 把地数从 8 块加到 20 块,看按面积摊的相对水平。 会更低——块数越多,「有一块低产地」的概率越大,平均分的浪费也越大。
  2. 把所有地块的参数设成完全一样,再看三种分法。 三者总产量会相同——这说明差距完全来自「地块异质性」,而不是算法本身。
  3. 改步长:20、5、1 立方米各跑一次,看贪心总产量怎么变。逐步上升但很快收敛; 1 立方米和 20 立方米的差距不到 0.5%,说明这套问题的粗粒度贪心已经够用。

常见误区

  1. 「按面积分水最公平,所以最优」。公平和最优是两件事;按面积摊总产量只有最优的 93.1%。
  2. 「每块地平均分也不差」。它这次 96.3% 纯属运气,因为它连面积都没看。
  3. 「亩均水量应该差不多,差太多说明分得不合理」。 最优方案故意让亩均差 4.5 倍——差的那几块给水不划算。
自测三问(点开对答案) 1. 为什么按面积摊水会低于最优? —— 它假设各地对水的响应相同,但实际每块地的产量上限和半饱和点不同; 平均分会让低产、易饱和的地拿到超额的水。 2. 「每块平均」为什么可能比「按面积摊」好? —— 它给每块地同样的水量,面积大的地亩均自然偏低,偶然避开了那块面积最大、亩产最低的地; 这是运气,不可复制。 3. 边际贪心为什么比求全局最优更实用? —— 它只依赖当前的边际收益,可以在线执行、不需要事先知道总水量;而等边际最优解需要全局信息。

水肥都分完了。最后一节换个角度:不是「怎么种」,是「种出来卖给谁、备多少货」。 而备货量的答案,不在预测里,在赔率里。

相关笔记