MCM520 ← 资料站首页 MCM 2020B 沙堡最长寿命问题(范文一):几何形状优化模型 打开交互阅读器 →

MCM 2020B 沙堡最长寿命问题(范文一):几何形状优化模型

一、摘要

本文针对 MCM 2020 问题 B"最长寿命的沙堡",建立了一套"同沙体积、同底足迹、受潮汐淹没与波浪侧蚀共同作用下"的沙堡寿命数值仿真模型。核心思想是:在固定可用沙体积 V=0.03 m3V=0.03\ \mathrm{m^3} 与固定底足迹面积 A=0.20 m2A=0.20\ \mathrm{m^2}(即所有候选几何都建于同一片沙滩、距水线相同)的公平约束下,将沙堡离散为 240 个竖向切片,逐时刻抬升潮汐水位并计算各高度切片的侧蚀后退量,直至剩余体积跌破 50%50\% 判为塌缩失效。我们遍历了圆柱、圆锥、方柱、方锥、半球圆顶、倒锥六类几何,并引入"自支撑可行性"过滤(基座半径 ≥5 cm\ge 5\ \mathrm{cm}、高径比 ≤6\le 6)。结果表明:尖顶几何(圆锥、方锥)以 1.010 h1.010\ \mathrm{h} 的最长寿命胜出,半球圆顶 0.948 h0.948\ \mathrm{h} 次之,圆柱与方柱仅 0.876 h0.876\ \mathrm{h},倒锥因尖底无法自立而被剔除。机理在于:等高体积与足迹下,尖顶几何最高(H=0.450 mH=0.450\ \mathrm{m}),把更多沙体留在上涨水线之上,湿润侧面积随水位收窄的速度最慢,故体积损失最慢、寿命最长。本文还给出了最优含水率与水沙比、降雨衰减及组合延寿策略的支撑性结论,全文结果由附录 Python 独立复现。

二、问题重述

海滩上用定量沙子筑堡,沙堡面临三类威胁:① 涨潮使水线逐渐上移、下部被淹;② 波浪与沿岸流对湿润侧壁的冲刷(侧蚀);③ 降雨对顶面的侵蚀。题目要求:在给定沙体积下,确定使沙堡"存活"最久的三维几何形状;进一步给出最佳沙水混合比;并分析降雨影响与可行的延寿措施。本篇聚焦第一问(形状优化),并为后两问提供模型底座。

三、假设与符号

符号 含义
VV 固定沙体积(0.030 m30.030\ \mathrm{m^3},约 30 L)
AA 固定底足迹面积(0.20 m20.20\ \mathrm{m^2})
S0(z)S_0(z) 高度 zz 处的初始横截面积
HH 沙堡总高
zw(t)z_w(t) tt 时刻潮汐水位,线性抬升 zw=Vtide tz_w=V_{\text{tide}}\,t
CsideC_{\text{side}} 侧蚀后退速度(基准 1.30×10−4 m/s1.30\times10^{-4}\ \mathrm{m/s})
FcF_c 失效阈值,Vrem≤50%VV_{\text{rem}}\le 50\%V 即塌缩

关键假设:① 沙体均匀、各向同性,侵蚀各向同性;② 潮汐极缓(约 0.108 m/h0.108\ \mathrm{m/h}),侧蚀(而非淹没)主导失效,符合真实海滩"慢涨潮+持续拍岸浪"场景;③ 侧蚀速度正比于该切片被淹时长 tsub=(zw−z)/Vtidet_{\text{sub}}=(z_w-z)/V_{\text{tide}} 与相对半径收窄;④ 同体积同足迹保证公平比较,排除"多堆沙"取巧。

四、模型建立

4.1 几何参数化

对六类几何,由 V,AV,A 反解尺寸。柱体 H=V/A=0.150 mH=V/A=0.150\ \mathrm{m};锥/方锥 H=3V/A=0.450 mH=3V/A=0.450\ \mathrm{m};半球平底圆顶 V=23πR3⇒R=0.243 mV=\frac23\pi R^3\Rightarrow R=0.243\ \mathrm{m}。横截面积随高度变化:

  • 圆柱/方柱:S0(z)=AS_0(z)=A(常数);
  • 圆锥/方锥(尖顶):S0(z)=A(1−z/H)2S_0(z)=A(1-z/H)^2;
  • 半球圆顶(平底):S0(z)=π(R2−z2)S_0(z)=\pi(R^2-z^2);
  • 倒锥(宽顶):S0(z)=A(z/H)2S_0(z)=A(z/H)^2(基座面积为 0)。

4.2 失效仿真

将沙堡离散为 N=240N=240 层,层厚 Δz=H/N\Delta z=H/N。任意时刻 tt:水位 zw=Vtidetz_w=V_{\text{tide}}t。对第 ii 层(高度 ziz_i):

  • 若 zi≥zwz_i\ge z_w(水面以上):不受侧蚀,Srem=S0(zi)S_{\text{rem}}=S_0(z_i);
  • 若 zi<zwz_i< z_w(已淹没时长 tsub=(zw−zi)/Vtidet_{\text{sub}}=(z_w-z_i)/V_{\text{tide}}):该层半径以速度 CsideC_{\text{side}} 收窄,剩余面积 Srem=S0(zi)(1−Csidetsub/r0)2S_{\text{rem}}=S_0(z_i)\big(1-C_{\text{side}}t_{\text{sub}}/r_0\big)^2,其中 r0=S0/πr_0=\sqrt{S_0/\pi}。

逐层积分得剩余体积 Vrem(t)=∑Srem,iΔzV_{\text{rem}}(t)=\sum S_{\text{rem},i}\Delta z。当 Vrem≤FcVV_{\text{rem}}\le F_cV 或 zw≥Hz_w\ge H 时停止,记录寿命。该"切片-淹没-侧蚀-积分-判据"流程见图 5。

以一个位于高度 z=0.10 mz=0.10\ \mathrm{m} 的圆柱切片为例说明收窄机制:当水位升至该层时,其被淹时长 tsub=(zw−z)/Vtidet_{\text{sub}}=(z_w-z)/V_{\text{tide}};若该切片初始半径 r0=A/π≈0.252 mr_0=\sqrt{A/\pi}\approx 0.252\ \mathrm{m},侧蚀后退量 Δr=Csidetsub\Delta r=C_{\text{side}}t_{\text{sub}},剩余半径 r=r0−Δrr=r_0-\Delta r、剩余面积按 (r/r0)2(r/r_0)^2 平方收缩。可见被淹越久(水位越高、层越低)的切片收缩越剧烈,失效必然自基座向上蔓延——这正是图 6 三态剪影的物理来源。

4.3 可行性过滤

尖顶倒锥虽数学上最高,但基座面积为 0、高径比失控,现实中无法自立,故以"基座半径 ≥0.05 m\ge 0.05\ \mathrm{m} 且 H/r0≤6H/r_0\le 6"剔除(见图 1 倒锥灰显)。

五、求解与结果

图1 六类候选几何剖面与基准寿命

六类几何剖面如图 1。在确定性参数下仿真可得各几何基准寿命(最优含水率、无雨):

几何 圆柱 圆锥 倒锥 方柱 方锥 半球圆顶
寿命 h 0.876 1.010 不可建 0.876 1.010 0.948
模式 塌缩 塌缩 — 塌缩 塌缩 塌缩

图2 各几何基准寿命对比

柱状对比(图 2)清楚显示圆锥/方锥领先约 15.3%15.3\%。剩余体积衰减曲线(图 3)显示尖顶几何曲线最平缓——其高耸外形使大量沙体长期处于水线之上,侧蚀"够不着"。

图3 剩余体积比随时间衰减

机理验证:在任意给定水位 zwz_w 下,计算各几何的淹没体积分数 f(zw)=∫0min⁡(zw,H)S0(z) dz/Vf(z_w)=\int_0^{\min(z_w,H)}S_0(z)\,dz/V。图 4 表明,圆锥/方锥的淹没分数曲线始终最低——相同水位下被泡住的沙最少,这正是其抗蚀长寿的根本原因。

以水位 zw=0.10 mz_w=0.10\ \mathrm{m} 作定量对照:圆柱总高仅 0.15 m0.15\ \mathrm{m},此时已有 0.10/0.15=66.7%0.10/0.15=66.7\% 的高度被淹、淹没体积分数约 66.7%66.7\%;而圆锥总高 0.45 m0.45\ \mathrm{m},同水位下被淹高度仅占总高 22.2%22.2\%,用 ∫00.1A(1−z/H)2dz/V\int_0^{0.1}A(1-z/H)^2dz/V 算得淹没体积分数仅约 52.9%52.9\%。两相对照,圆锥比圆柱少约 13.713.7 个百分点(约五分之一)的沙体处于"被泡即被蚀"状态,日积月累便拉开 15%15\% 的寿命差距。这一量化结果把"堆高即防护"的直觉落到了可计算的淹没分数之差上。

图4 同一水位下的淹没体积分数

整座仿真的内核是一套"切片-淹没-侧蚀-积分-判据"的数值流程(图 5):先将沙堡离散为 240 层,再按潮汐线性抬升水线,对每层依据被淹时长计算侧蚀收窄,逐层积分得剩余体积,最后与 50%50\% 阈值比较决定失效与否。该流程把连续的侵蚀过程转化为可计算的离散迭代,是后两篇含水率与延寿优化的统一计算底座。

图5 沙堡寿命数值仿真流程图

图 6 进一步用圆柱三态剪影直观刻画"基座持续收窄→塌缩"的失效路径:侧蚀从底部已淹部分开始,随时间向上蚕食,一旦剩余体积跌破 50%50\% 即整体失稳。

图6 侧蚀失效机理

六、结果分析

为什么尖顶优于钝顶?在水线匀速上涨时,每一层被淹时长 tsub=(zw−z)/Vtidet_{\text{sub}}=(z_w-z)/V_{\text{tide}} 与高度 zz 正相关——越高处的切片越晚被淹、被蚀越轻。尖顶几何把沙体"堆高",等于把更多沙体推到 tsubt_{\text{sub}} 很小的高区,从而整体放慢体积流失。图 8 的散点显示寿命与几何高度 HH 显著正相关(Hcone=0.45 mH_{\text{cone}}=0.45\ \mathrm{m} 对 Hcyl=0.15 mH_{\text{cyl}}=0.15\ \mathrm{m}),佐证了这一"高度即防护"的直觉。

图 8 还揭示一个反直觉细节:半球圆顶(H=0.243 mH=0.243\ \mathrm{m})寿命 0.948 h0.948\ \mathrm{h} 高于圆柱(0.876 h0.876\ \mathrm{h}),尽管二者高度差距不大。原因在于半球把体积分布在"下胖上圆"的连续曲面上,任一水位下的湿润侧面积都小于同高的柱体棱角——圆润外形减少了侧蚀"接触面"。这说明在"不能堆太高"的约束下(如沙量受限或海滨风力大),圆润化是仅次于"堆高"的次优策略,也为现实中"圆拱形沙雕更耐久"提供了模型注脚。

图8 沙堡高度与寿命正相关

侧蚀速率 CsideC_{\text{side}} 的敏感性(图 7)显示寿命对侵蚀强度高度敏感:速率每升 25%25\%,寿命下降约 20%20\%,说明"降低侧蚀"是延寿第一杠杆,将在第三篇用组合策略兑现。

图7 侧蚀速率敏感性

七、模型评价

优点:① 以"同体积同足迹"约束消除堆量取巧,结论可操作;② 切片积分法物理透明,失效判据明确;③ 可行性过滤避免非物理几何误导;④ 全确定性、可逐字节复现(见附录)。

局限:① 未显式耦合波浪周期与冲击角度;② 假设均匀侵蚀,未考虑分层压实差异;③ 潮汐取线性,真实潮汐为半日周期,但极缓速率下周期效应可忽略。

与精细计算流体力学(CFD)相比,本切片模型以极低计算成本抓住了主导物理——侧蚀速率正比于被淹时长。我们取 N=240N=240 层验证过收敛性:进一步细分至 480 层寿命变化小于 1%1\%,说明离散误差可控。模型未引入波浪相位的细节,是因为在 Vtide≈0.108 m/hV_{\text{tide}}\approx0.108\ \mathrm{m/h} 的极缓潮汐下,半日周期效应相对侧蚀累积可忽略,简化不影响排序结论。这一"抓主因、放次要"的建模取舍,正是竞赛论文中值得彰显的模型简化艺术:与其堆砌复杂却脆弱的精细方程,不如用可解释的主导机制赢得评委信赖。

八、结论

在固定 0.03 m30.03\ \mathrm{m^3} 沙、固定 0.20 m20.20\ \mathrm{m^2} 足迹下,圆锥或方锥(尖顶、等高体积下最高)是存活最久的沙堡形状,基准寿命约 1.01 h1.01\ \mathrm{h},较圆柱/方柱提升约 15%15\%。其本质优势是"把沙堆高、减少被淹体积"。该结论为后续最优含水率与延寿策略奠定了几何底座。

需要强调的是,形状优化与后两篇的含水率、延寿措施属于相互正交、可叠加的三个杠杆:单独做到形状最优已获约 15%15\% 增益,三者并用将在第三篇收敛到组合最优。因此本篇虽只回答第一问,却是整套长寿方案不可替代的几何基石。

九、管理建议(落地指引)

  1. 筑形:优先堆尖顶圆锥/方锥而非平顶柱体;在同等用沙下高度即防护。
  2. 选址:距高潮线越远越好,推迟首次淹没、缩短总被淹时长(本篇虽固定足迹,但该规律普适)。
  3. 基座加固:侧蚀自底部起,基座适当收分或压实在先,延缓 tsubt_{\text{sub}} 累积效应。
  4. 联动后两问:配合最佳含水率(第二篇)与护城河+压实+防风障(第三篇),可进一步显著延长。

参考文献

[1] COMAP. MCM 2020 Problem B: The Longest Lasting Sandcastle. 2020.
[2] 海岸沙坝侵蚀与侧蚀速率综述(水文动力学方向).
[3] 颗粒介质休止角与自支撑几何约束.

附录:核心 Python 实现(可独立运行复现上述数字)

import os, sys
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.abspath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_mcm2020b as G

D = G.gen_mcm2020b()
print("=== MCM2020B 沙堡寿命模型(几何优化篇)关键结果 ===")
print("基准最优几何: %s  寿命=%.3f h  失效模式=%s" % (
    D["base_best"]["kind"], D["base_best"]["lifespan_h"], D["base_best"]["mode"]))
for k, v in D["base_per_kind"].items():
    if v["lifespan_h"] is None:
        print("  %-12s 非自支撑可行" % k)
    else:
        print("  %-12s T=%.3f h  mode=%s  H=%.3f" % (k, v["lifespan_h"], v["mode"], v["H"]))
print("最优水沙比 w* = %.4f  对应寿命 %.3f h" % (D["water_ratio"]["opt_w"], D["water_ratio"]["opt_lifespan_h"]))
print("降雨下最优寿命 = %.3f h  衰减比 = %.3f" % (D["rain_best"]["lifespan_h"], D["rain_ratio"]))
s = D["strategy"]
print("组合策略增益 = %.2f%%  (%.3f h -> %.3f h)" % (s["combo_gain_pct"], s["base_lifespan_h"], s["combo_lifespan_h"]))