<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>ShaddockNH3</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://shaddocknh3.github.io/</id>
  <link href="https://shaddocknh3.github.io/" rel="alternate"/>
  <link href="https://shaddocknh3.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, ShaddockNH3</rights>
  <subtitle>Just a humble and obscure soul, dreaming of ascending to prominence while journeying along the path.</subtitle>
  <title>Shaddock's Blog</title>
  <updated>2026-04-14T12:37:51.980Z</updated>
  <entry>
    <author>
      <name>ShaddockNH3</name>
    </author>
    <category term="转专业" scheme="https://shaddocknh3.github.io/tags/%E8%BD%AC%E4%B8%93%E4%B8%9A/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这篇博客本该安排在今年结束后再动笔，奈何最近越想越烦，索性现在就写出来宣泄一下。</p><p>在正文开始前，我得先给自己叠个甲。</p><p>本人并没有维护过什么惊天动地的大型项目，也不是什么技术大牛。我所做的开源，更多是指公开的整理工作，比如整理文档，或者像大家都会做的——整理历年卷和复习资料。</p><p>曾经我认为纯开源的行为是放弃一切收益，做出来的东西就得给别人免费用。</p><p>不过后来随着时间的推进，我逐渐理解了那些成熟项目的运作逻辑。</p><p>以 RustDesk 为例，这套软件本身是免费的，但搭建服务有两种截然不同的方式。</p><p>第一种是你自己去搭建服务。这意味着你需要自己找一台服务器，耐着性子阅读官方文档，如果碰到问题，你需要继续阅读文档或在网络上寻找别人的解决方法。你付出的代价是时间和学习成本。</p><p>第二种是使用官方提供的付费服务。你付钱，别人为你解决麻烦。</p><p>这让我意识到一个很朴素的道理：人还是要吃饭的。开源不等于就要当义工，更不等于要无底线地伺候别人。</p><p>曾经我和很多人一样天真。我认为，如果我花费时间和精力去恩惠他人，或者回馈那些帮助过我的项目，这种善意是可以传递的。正如我曾经受惠于网上的资料，我也希望成为那个传递火炬的人。</p><p>但现实给了我一记响亮的耳光。</p><p>事实是，懂得反过来感恩的人毕竟是少数。大多不表感恩的沉默者其实也无所谓，大家各取所需，互不打扰。</p><p>最让人心寒的是，会有越来越多的傻逼跳出来，肆意践踏你的心血。</p><p>少数的傻逼足以毁掉整个环境。</p><p>过于圣人只会走向极端的圣母，最后被这些人生吞活剥。我想，这也正是为什么像 ALAS 这样的官方社区，如今越来越趋于极端化、不得不竖起高墙的根本原因。</p><h2 id="什么是蠢，什么是厌蠢"><a href="#什么是蠢，什么是厌蠢" class="headerlink" title="什么是蠢，什么是厌蠢"></a>什么是蠢，什么是厌蠢</h2><p>首先，我们需要界定一下这里讨论的对象。</p><p>事实上我不应该用蠢这个词，因为这容易让人误会我在歧视智商。</p><p>当然，对于那些把厌蠢挂在嘴边，标榜自己患有厌蠢症的人，在我看来，那也是一种真蠢。</p><p>如果你仅仅是因为掌握了更多的信息，就把自己的处事经验强加给别人，那不叫聪明，那是傲慢；对于新手来说，不懂是阅历问题，不是智力问题。</p><p>我们这里所要讨伐的蠢，绝非智商高低，而是指一种又犟、又坏、又懒的恶性复合体。</p><p>这种蠢，本质上是认知匮乏与傲慢的叠加。</p><p>在这些人的认知模型里，开源项目并不是开发者好心施舍的礼物，而被他们默认视为一种理所应当的公共服务。这就形成了一种荒谬的比例关系：</p><p>越是不懂技术、越是没有共情能力的人，觉得自己理应被服务的权利感反而越强。</p><p>他们无法想象创作者为了解决一个 Bug、整理一份文档耗费了多少个日夜，他们脑子里只剩下一个简单的逻辑：我按了按钮没反应，就是你的错。</p><h3 id="傻逼三重奏"><a href="#傻逼三重奏" class="headerlink" title="傻逼三重奏"></a>傻逼三重奏</h3><p>这群人具体表现为三个特征：</p><ol><li>懒。文档明明就在手边，解决方案写得清清楚楚，Ctrl+F 就能搜到的那种，但他们选择视而不见。他们宁愿花时间在群里发一堆问号，张嘴就要喂饭，稍有不顺就大呼小叫。</li><li>坏。他们把开源作者当成免费的 24 小时客服，甚至当成欠他们债的奴仆。你这东西怎么这么难用？——一旦需求得不到满足，恶意便随之而来。</li><li>犟。这是最要命的。当他们的错误被指正时，为了维护那点可怜且脆弱的自尊心，他们绝不承认自己没看文档，反而要反咬一口，指责作者态度不好、高高在上、圈子排外。</li></ol><p>这种人其实是把现实生活中的无力感，发泄到了网络上最好欺负的老好人——开源作者身上。因为他们深知，在网络上骂一个开源作者，几乎不需要付出任何成本。</p><h3 id="强调过无数次的事，为什么还会犯"><a href="#强调过无数次的事，为什么还会犯" class="headerlink" title="强调过无数次的事，为什么还会犯"></a>强调过无数次的事，为什么还会犯</h3><p>本质是傲慢。</p><p>这种傲慢源于一种奇怪的优越感：我的时间是时间，你的时间不是时间。</p><p>在他们看来，阅读文档是浪费他们的时间，而你去回答他们弱智的问题则是你应该做的。他们不关心技术细节，不关心社区礼仪，只关心自己的问题有没有在三秒钟内被解决。</p><p>这种傲慢甚至让他们产生了一种错觉：我用你的东西是给你面子。</p><h2 id="转专业"><a href="#转专业" class="headerlink" title="转专业"></a>转专业</h2><p>我们学校的转专业社区完全是学生自发组建的，本质上就是做慈善，不收任何费用，纯粹靠爱发电。</p><p>原本社区里只有学长学姐零散维护的对应想转专业经验贴，每个人都可以投稿。</p><p>但是这些稿件缺乏系统性的转专业常识，只是转去对应专业的经验。</p><p>后来为了方便大家，我花了非常久的时间去优化、整理了一份常识性的文档。</p><p>在去年文档尚未写的时候，我还心存善意，尽量去回答每个人的问题。</p><p>但是今年，当文档已经落地，一切都写得明明白白的时候，我的心态彻底变了。一旦看到有人问出文档里已经写好的常见问题，我就直接开骂。</p><p>毕竟我直接明晃晃地先把不可以问的问题先贴出来了，你还要往枪口上撞，这不是蠢是什么？如果你问的是不常见的、边边角角的问题，我依然乐意解答，但这群人问的往往就是第一行字就写着的答案。</p><p>这种环境逼得人不得不变得冷漠。</p><p>最近发生了更恶劣的事，有一位热心的学姐被无休止的私聊骚扰到崩溃，最后不得不要求本人彻底下架他写的转专业经验贴。</p><p>下架经验贴看起来是很极端的做法，但这背后是多少次的骚扰和理所当然的索取？</p><p>这几年，慢慢把自己的 QQ 号从帖子里下掉、选择隐身的人不在少数。</p><p>有些人就是这样的，他们觉得只要自己发问了，你就必须回答。</p><p>而对于维护者来说，最开始总会有一种莫名其妙的救世主情结：不回答别人的问题心里就难受，总觉得是不是自己没做到位。</p><p>但现在我要说：放心大胆地直接拒绝。</p><p>你的善良，不该成为别人勒索你的筹码。</p><h2 id="防御性社交"><a href="#防御性社交" class="headerlink" title="防御性社交"></a>防御性社交</h2><p>编程领域有一个经典概念叫防御性编程。通俗来说，就是写代码时预设用户会进行各种误操作，比如在输入年龄的地方输入了 ABC，从而提前写好代码来防范报错。</p><p>而当这个概念延伸到开源社区运营时，就变成了防御性社交。</p><p>当一个开源项目做得太好用、门槛降得太低时，必然会吸引大量毫无技术背景的白嫖党。这些用户数量庞大，且产生的噪音——无论是无效的 Issue 还是情绪化的抱怨，都远远超过了他们可能带来的价值。</p><p>在常规状态下，维护者一开始总是试图感化用户，耐心解答，结果往往是被活活累死或气死。</p><p>于是，为了生存，社区不得不进入极端化。</p><p>这就是为什么我们看到很多成熟社区竖起了高墙：</p><ul><li>设置极高的入群门槛（答题）；</li><li>编写晦涩但详尽的文档（技术需要，筛选机制）；</li><li>执行严厉到近乎无情的群规（不看置顶直接飞）。</li></ul><p>这看起来激进、高冷，甚至不近人情，但就像细胞膜必须阻挡病毒入侵一样，这其实是维护者为了生存而被迫进行的筛选。</p><p>这里的防御，防御的不仅仅是代码层面的报错，更是为了防止这些傻逼用户的行为，击穿维护者仅存的心理防线。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>所以，不要责怪开源作者变得冷漠。</p><p>完善文档、提高门槛，本质上是一种筛选机制。</p><p>能读懂文档的，是潜在的同路人；读不懂还不愿意学的，就是必须过滤掉的杂音。</p><p>既然他们不看文档，既然他们缺乏基本的尊重，那竖起高墙，把他们挡在门外，就是对开源热情最好的保护。</p>]]>
    </content>
    <id>https://shaddocknh3.github.io/2026/01/16/6.how-stupid-damage-open-source/</id>
    <link href="https://shaddocknh3.github.io/2026/01/16/6.how-stupid-damage-open-source/"/>
    <published>2026-01-16T11:04:08.000Z</published>
    <summary>基于转专业社区维护的真实经历，探讨为何开源项目（泛指）中会出现大量又犟又坏又懒的巨婴用户，以及为何高墙是维护者保护心理防线的唯一手段。</summary>
    <title>为什么傻逼总在糟蹋开源</title>
    <updated>2026-04-14T12:37:51.980Z</updated>
  </entry>
  <entry>
    <author>
      <name>ShaddockNH3</name>
    </author>
    <category term="美赛" scheme="https://shaddocknh3.github.io/tags/%E7%BE%8E%E8%B5%9B/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>前几天，周老师私聊问我要不要分享一下美赛经验，我简单思考了一下就同意了。</p><p>其实即使老师不提，我也打算在考研结束后整理一下这方面的经验发篇博客，既然老师提前找了，那就提前写一篇。</p><p>第一次听说数学建模是在高中的时候。当时读了一本小说《学霸的黑科技系统》，主角带领团队参加数学建模竞赛，最终拿下 O 奖，看得我热血澎湃。自此，一粒种子悄悄种下了——我对大学的其中一个畅想，就是和朋友鏖战几天几夜，产出一篇优秀的论文。</p><p>数学建模对我的大学生涯来说意义重大，或者说我大学期间第一个成就就是数学建模。</p><p>大学是什么时候开始真正变好的呢，其实就在得知自己美赛 F 的那个凌晨，它带领我走出了大学获取成就第一步，随之而来的是厚积薄发。有些事情一旦迈出第一步，后面的路就都很好走，在半年多的时间里，我的成长是巨大的，真正从别人口嗨中的 ✌ 成长为一个还算不错、可靠的学长。</p><p>事实上，我清晰的知道我距离那些大佬至少还差一整个大档次，距离超级大巨佬至少差两个档次。而且我对我自己大学期间的要求，还差一块关键性的拼图（其他拼图已经找到，不过仍在完善）。由于家庭等不可抗力因素，零基础的成长往往比非零基础的成长艰难很多——光是找到适合自己的道路就需要很长的时间，更别说还得亲手去检验这条路的正确性。</p><p>这也是我为什么把这次分享定在“零基础”这三个字上，很多事情，只有真正从“零基础”过来的人才清楚。</p><p>由于职业规划的问题，我决定进行一场伟大的冒险，如果冒险胜利了，我会更新博客，谈谈对零基础的理解以及冒险胜利的感悟。</p><p>希望下一次更新，是成为真正的“传奇”。</p><p>以上。</p><p>我讨厌那种声称要教人搭梯摘星，却在一开始就滔滔不绝讲述宇宙浩瀚的人。</p><p>他们需要的是如何搭建第一级阶梯的木材与钉子，而不是一张描绘了整个银河系的星图。</p><h2 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h2><p><a href="%E6%9F%9A24%E7%94%B5%E5%B7%A5%E6%9D%AF%E8%AE%BA%E6%96%87.pdf">柚 24 电工杯论文</a></p><p><a href="%E6%9F%9A24%E5%9B%BD%E8%B5%9B%E8%AE%BA%E6%96%87.pdf">柚 24 国赛论文</a></p><p><a href="%E6%9F%9A25%E7%BE%8E%E8%B5%9B%E8%AE%BA%E6%96%87.pdf">柚 25 美赛论文</a></p><p><a href="%E6%9F%9A25%E7%94%B5%E5%B7%A5%E6%9D%AF%E8%AE%BA%E6%96%87.pdf">柚 25 电工杯论文</a></p><p><a href="%E6%9F%9A25%E5%9B%BD%E8%B5%9B%E8%AE%BA%E6%96%87.pdf">柚 25 国赛论文</a></p><p><a href="%E6%9F%9A26%E7%BE%8E%E8%B5%9B%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB.pdf">柚 26 美赛经验分享</a></p><h2 id="会议记录"><a href="#会议记录" class="headerlink" title="会议记录"></a>会议记录</h2><blockquote><p>由于时间问题，我本人讲解的时候有些东西没有展开来细讲。建议对着 ppt 看，而且有些东西确实没有做到像自己前面说的那样零基础，还是有点忘了初心啊。</p></blockquote><h3 id="凉柚-NH3-部分"><a href="#凉柚-NH3-部分" class="headerlink" title="凉柚 NH3 部分"></a>凉柚 NH3 部分</h3><h4 id="引入"><a href="#引入" class="headerlink" title="引入"></a>引入</h4><p>老师、同学们晚上好！然后有些人可能不知道我名字，不过看到我头像也大概知道我是谁了。总之很高兴周老师能给我们团队这个机会来分享比赛经验，我们今晚的主题是“零基础速成美赛”。</p><p>这是我们的目录。</p><p>简单看一下我们团队总共参加的比赛，简单看一下就好了，这是我们比赛所有的论文，它都是可以在右下角这个博客中找到。</p><p>然后这是我们比赛中的实录。</p><p>我们直接进行入第二部分：前期准备，也就赛前前期准备，主要就是目的是为了防止大家在比赛期间做一些无意义，或者可以在赛前已经做好的事情。</p><p>这一页的话主要注意一下美赛的时间就可以了，美赛时间是 99 天……它会比国赛多一天。其他这些都看看就好了。</p><p>我们直接来进入主题，我是零基础怎么办？队伍里现在三个人都是零基础，我们都想学东西，但是根本都不知道要学什么。但是大家仔细想，你是零基础吗？</p><p>我这里放了两道题目，第一道是 2025 年全国数学一卷的第 15 题，第二道是 2023 年福建省高考物理的第一题。想象一下你是一个刚刚初中升高中的学生，你第一眼看到这个题目一定很懵逼，但是你肯定不会去害怕这件事情。因为你知道这些解题方法只是你还没学过而已。</p><p>你在小学阶段、初中阶段解过应用题，在高中阶段解过概率大题。以刚刚那两道题为例，卡方检验它是一种相关性分析，而祝融号它是将物体视为质点，它是一种建模的简化方法。</p><p>事实上，数学建模的第一步就是将工程问题转化成数学问题，然后在数学模型的框架下进行求解。那么如何转换成？你在高中阶段刷过大量的物理和数学题，自然知道碰到什么物理题要用什么方法、什么模型。</p><p>大学数学建只不过是将以前熟悉的那套解题方法换成数学建模独有的一套。</p><p>简单总结一下，数学建模就是把实际的工程问题转换成数学模型，然后数学物理方法进行求解这个过程。</p><p>我们最开始的祝融号为零。假设现在有一题让我们要求进入祝融号的速率，那我们的建模就是把祝融号设为质点，以及抽象出它的轨迹，这就是从物理模型转换成数学模型。然后轨迹的长度你需要用高阶微分方程去拟合，这个时候你不可能去用手算微分方程，所以是需要程序去编写，这就是编程。写论文，就是把如何建模和如何求解这一整个过程思路体现出来。</p><h4 id="编程环境"><a href="#编程环境" class="headerlink" title="编程环境"></a>编程环境</h4><p>然后上面既然提到了编程，那我们接下去就来讲一下编程的话。数学建模一般是推荐使用 Matlab 或者 Python，然后优点是这些，大家看一下就好。如果一定要选一个的话，我本人更推荐使用 Python。</p><p>不过事实上，语言只是载体，你选什么语言是没有任何关系的，无所谓。我更想说的是，以我去年的参赛经验来看，很多队伍都会花至少半天的时间浪费在配环境上面。</p><p>无论你选择了什么语言，都是你先把环境配好。以 Python 为例，你至少需要做到这些。我这里推荐 3.12。3 版本，是因为版本比较稳定，就是它不仅是有比较成熟的机器学习库，然后还有去适配那些老的版本的库。你像现在更新的那种 3.14 版本和 3.13 版本，它有些库、有些机器学习库它是没有适配过来的。</p><p>然后不要用 IDLE，界面太抽象了。然后配清华源的话就是为了下速度的，你不配的话会下不动。</p><p>看不懂这些东西也很简单，直接把我这串东西复制粘贴丢给 AI，跟着 AI 一步步配就好。</p><p>这里先简单说一件事情，就是数学建模，它不是一道 OJ 的编程题，它是一道数学应用题。编程是一种简化计算的方法，是快速验证和求解建模思路的工具。</p><p>举一个简单的例子，编程就是用很粗鄙的理解，就是你在高考数学的时候不用笔去计算，而是用计算器去计算。你的思路、你的方法都是你本来脑子里已经有的，计算器能做到只是简化你不必要的麻烦。</p><p>另外，美赛数据分析对应的 C 题，你可以完全一行代码都不用写，而是取什么 SPSS 的数据分析工具、科学分析工具。</p><h4 id="AI-选择"><a href="#AI-选择" class="headerlink" title="AI 选择"></a>AI 选择</h4><p>前期准备第二步就是找几篇历年美赛的 O 奖论文，年份肯定越近越好。对于国赛来讲，你只要看看摘要，看看关键词，然后再看看大概写什么样子就好。</p><p>美赛的话，别人的论文的摘要都是英文，你简单看看关键词就已经可以了。然后你找几篇你自己看的感觉很厉害的论文。</p><p>至于为什么我们是否放下一个章节来讲，很大程度上这几篇论文直接决定了你后面能走多远。</p><p>精美的论文意味着严谨的排版以及直观可视化的图表，如何排版是留给我的队友 ac6 来讲。</p><p>然后是关于数据方面，A 题和 B 题一般来讲是不会直接提供数据的，得自己去找。那找不到数据怎么办？关于检索和整理数据，这个是留给我的队友 firerater 来讲。</p><p>接下来是我要讲的部分。</p><p>看一下，接下来是我要讲的部分，有关于 AI 的选择。</p><p>最推荐使用的就是 Gemini Pro，其次是 ChatGPT。</p><p>如果你没有魔法的话，国产也是有很多好用的，国产现在能用的我都已经贴在上面。</p><p>然后不要用这些。</p><p>为什么？</p><p>我这边简单列了一下。豆包的训练数据很多来源于抖音，娱乐性来讲的话，豆包它是国内大语言模型肯定是最好的。那理工科乃至代码编辑的能力是一言难尽。同时豆包写出来的文字，它是有一股味道，是难以用于进行那种论文化的表述处理。</p><p>文心一言和 Kimi 的话，属于是两年前国内比较强的，现在已经不行了。腾讯元宝就不要用它的 hunyuan 模型，它就是一个 DeepSeek 换皮。</p><h4 id="团队分工"><a href="#团队分工" class="headerlink" title="团队分工"></a>团队分工</h4><p>然后赛前准备还有一个就是分工问题。</p><p>大家第一次准备建模的时候肯定是看过各种经验贴，知道数学建模大致分工分成：建模手、编程手、论文手。</p><p>传统意义上这三个角色的含义就是字面的字面意思。</p><p>一个人负责建模，一个人负责编程，一个人负责论文。建模的意思就是把题目转换成数学模型，然后在数学模型这个框架下，你得给出解题方法；编程的意思就是说，根据建模所给的方案编写程序来求解问题；论文手的意思就是把这些东西整合成论文给评委看。</p><p>那么更先进的做法，就是每个人大概都得负责两块内容：主要负责一块主要负责一个模块，然后辅助负责一个模块。因为每个人其实都得大概知道对方在做什么，不然你是根本沟通都是沟通不了。</p><p>我们队伍采用的和这两种模式都有区别，或许是 AI 时代下一种尝试吧，但是 AI 时代下，它也绝非是三个 AI 手。</p><p>那在介绍我们组的分工之前，首先我要谈谈关于 AI 的事情。</p><p>那就是保持拥抱 AI，但是保持自己的思考。</p><p>AI 和人一样，他会陷入局部思考。如果完全让 AI 带着你去走的话，他可能会带着你绕一个大圈子。所以你的思路你不能完全跟着 AI 走，但是你的代码其实是可以的。</p><p>最后还有一点要强调的就是不要固执的不去使用 AI。AI 普及之后数学建模的论文，它是整体上升了一整个档次的。就以国赛举例的话，原本省二的论文，现在可能拿省三，就是逐级往下推。</p><p>那么在当前 AI 时代来讲，队伍的核心到底是什么？如果说五年前的话，我可以说是编程手，但是现在的话，我认为是论文手，其次是建模还有打杂的工作，最后才是编程手，因为现在编程的很多东西它都是被 AI 代替了。</p><p>当然我也是承担传统意义上编程手的工作的，它是可以用……有更多的事情，比如说参与建模的讨论。</p><p>然后这方面的话是我们组的分工：我们三个人是共同去讨论建模的。但是有一点需要注意，“杂活”它不是那种帮忙倒水拿外卖的那种。</p><p>他主要是可以在另外两个人需要验证思路的时候，可以做到没有任何的后顾之忧。假设我现在提出了某个想法，想要去验证、搜集数据、整理数据，这种事情就必须你得在一个可观的时间内收集并整理完毕，而我本人只需要负责去处理代码内部的逻辑，我不需要去考虑我的数据的来源。</p><h4 id="建模方法论与技能树"><a href="#建模方法论与技能树" class="headerlink" title="建模方法论与技能树"></a>建模方法论与技能树</h4><p>那接下来我要花点时间讲讲，即便你有了数据，你也不会做分析怎么办？这就是涉及到的建模方法。</p><p>首先贴出来，这是学长学姐 PPT 里的两页东西，这个是传统的清风数学建模和司守奎那本教材整理出来的路线，这条路线其实是已经比较成熟的路线。大家看一下就好。</p><p>然后学长学姐的那些，它是比较传统的系统性学习数学建模的东西，那些是属于方法论，它不是一种体系。你现有的各种新东西的那种框架，比如说机器学习这种冲击，这些只学这些肯定是不够的。</p><p>事实上你要掌握的东西，可以归结为基本的数学分析、数据分析框架。这个时候就需要每个队伍至少得了解一种语言，你得会爬虫，你得会数据分析工具库。然后你得会基本的传统回归模型，还有机器学习算法，乃至一些简单的深度学习。然后你需要这些数学知识，还有简单的物理化学素养。</p><p>美赛它尤其是你的 A 题，它不只是考验你的数数据分析框架，还考验你的现场学习能力。</p><p>我们简单来讲一下 Python 爬虫，实际应用中可能会碰到右上角这四种情况。前面三种就不细说了，你现学的话是来不及的。最主要注意一下就是最后这个 API 爬取。有提供 API 的网站，你只需要根据他给好的文档照着文档敲代码，然后就能把它的数据获取下来，就直接下载成一个 Excel，它不需要像前三种情况那样去分析网页的具体情况。你不需要去看网页的源代码。</p><p>然后讲一下，主要讲一下数据分析工具，主要是 Matlab、Numpy 和 Pandas。Matlab 就是 Python 的画笔，然后 Numpy 就是高效运算，Pandas 是 Python Excel。然后 Numpy 不用看，因为更多的库它是基于 Numpy 集成而成的。</p><p>例如接下来我要讲 sk-learn。sk-learn 它不只是封装好机器学习方法，它也封装了很多传统的方法。在调用的时候，你是完全不需要去理解这些方法的内部原理，你只要调库就好了。</p><p>然后这里我点了一下“使用机器学习需谨慎”，我马上讲。</p><p>深度学习这块，大家简单看一下 CNN、RNN、LSTM 就可以了，不要使用 Transformer。Transformer 需要大规模数据支撑。</p><p>另外，这里有的人很重要，数学建模，尤其是美赛的数学建模，他是不喜欢你用机器学习、深度学习这种“通法”。因为这种通法它有点类似于大力飞砖，就是你什么东西都可以去套行深度学或者机器学习。你跑出来效果也肯定是不差的，但是美赛他并不是比拼答案，他比拼的是一些逻辑，以及论文当中一种体现。</p><p>这里有个“私人定制”这四个字，它就是意思比方说你使用了某种机器学习方法，你可以对这道题进行一些特定的优化。</p><p>那么我从爬虫讲到这有什么用？其实对大部分人来讲就是一点用都没有的东西。你只需要对前面这些东西留点印象就可以了。</p><h4 id="建立方法表"><a href="#建立方法表" class="headerlink" title="建立方法表"></a>建立方法表</h4><p>系统性准备建模，其实对于大部分人来讲是一个伪命题。首先是关于教材，司守奎那本教材已经很老，已经偏老了，你不可能使用层次分析法这种问题你去解决你现在那么一个庞大的问题。还有常用的方法全都是被用烂的方法，而且很多跟不上时代，也不符合美赛那种基调。</p><p>时间的话，就是大家都在准备期末考，花时间听讲座已经非常难得了。然后学习成本，我刚刚讲的那套得学一年。</p><p>爬虫我前面有讲过，美赛直接找数据集就可以了，不需要你手动去爬。手动爬太浪费时间。配环境的话你得自己去配，你现在就可以拖出来配了。</p><p>你现在要做的事情是什么？你现在需要做的事情就是提前先整理一张“方法表”。就是可以去包含就是之前学长学姐他们整理的那两个比较传统的数学建模，还有包括我刚列出那些的东西。</p><p>你需要整理一张方法表，然后把每个方法它对应的解决的是什么问题？它的优缺点是什么？它的改进方案是什么？</p><p>你这些东西你是至少得有的，你不一定会，你是得有。因为美赛它其实是开卷考，你很多东西你都可以现场去把这些东西去匹配到题目。美赛它非常考验你的现学能力。</p><p>当然，你如果想系统性的去学的话，你就至少需要做到所有我上面提到的东西，从编程手的角度出发，这样你才是一个合格的编程手：从学长学姐留档那些传统建模，爬虫数据分析，机器学习，乃至些深度学习。不过事实上你学这些东西的底层原理之后，你在用的时候也不用管你底层实现。sk-learn 这个库封装的非常完善，所以本质上学了和有一张方法表的没学没什么区别。</p><p>接下来就是数学，大家都学过高数吧？会微积分和微分方程够了。微分方程。</p><p>然后物理会受力分析就行。</p><p>其他学科都是数学和物理套题转化成数学或者物理模型，够了。可以。</p><p>到现在为止，大家都已经相当于掌握了很多东西了，握了我 PPT 里展示的这些，然后马上就能掌握更多的东西。</p><h4 id="比赛流程实战"><a href="#比赛流程实战" class="headerlink" title="比赛流程实战"></a>比赛流程实战</h4><p>我接下来将以比赛历程的角度来讲讲整个美赛的流程。</p><p>美赛从早上六点开始，你首先你也不用六点整起床，你可能八九点起床，其实也没什么问题。你需要做的事情就是和队友集合，非常重要。因为美赛那几天你会碰到各种各样的问题，最大的问题都是跟队友的问题，不是数学建模问题？美赛碰到最严重的问题永远是队友问题。</p><p>接下来是翻译跟选题，我这里就是刚刚再次强调一下队友的重要性，队友他是不是各干各的、相互联系。大家多交流，然后相互之间包容一下，只要队友之间不出矛盾是什么问题都能解决的。你只要在 99 小时内产出一篇论文，你不吵架，你就已经我感觉能超过 50%的队伍了。</p><p>翻译的话，谷歌翻译、微软翻译、有道翻译、大模型。然后查找国外资料的话就是“沉浸式翻译”这个插件。不要用国内这些翻译。然后或者等大概你开赛几个小时之后，老师会发翻译。</p><p>翻译完之后选题。D、E、F 这三题我们没做过就不讨论。然后美赛他采取的是按照人数、报名人数来划分奖项，所以 A B C 三题排序就是长这样。然后 A 报的人最少，一般占 20%，但是报的人大佬也是比较多的。</p><p>A 题 O 奖我稍微纠正一下周老师吧，A 题 O 奖 其实就只有五个。他是没有十个，他就只有五个。然后 A 题连续，B 题 离散，C 和大数据相关。然后嘛……A、B 题对数学、物理有一定素养，然后 C 题就是考基本数据分析问题。不过 A B 题它其实也是有大量的数据分析。</p><p>然后你现在已经选好题目了，你得开始解题。你解题，这个时候你就得掏出你之前准备好的 O 奖论文，翻到目录，然后你对比一下每张 O 奖论文的目录。其实架构都是长这个样子的：</p><p>问题背景、问题重述、方法概要、问题假设，还有符号的定义，我这里没写出来这个部分，然后接下来是建模的主体，就是这两部分内容。然后最后是敏感性分析、误差分析、模型优缺点、参考文献。</p><p>为什么我之前找到那几篇 O 奖论文直接决定了你的上限？对很多大一新生来讲，美赛期间他写的论文是你这辈子写的第一篇建模论文，和正统的学术论文它是有一定差别的。你如果完全按照学术论文那套东西去写的话，反而会效果不好。</p><p>所以你需要照着 O 奖作文去写。你整个美赛期间你要做的事情是什么？就是“抄”你找的那几篇欧奖论文。就我的意思不是让你去抄欧奖论文的思路，你得去抄他们的排版，抄他们的架构，还要抄他们你进行到推进到哪里，这部分大概要干嘛。</p><p>然后这几部分内容就是仿照以前论文写就可以，这个 ac6 细讲。这里简单讲一下问题假设是什么。</p><p>例如一开始提到了祝融号，你能力不够的话，可以把它假设成质点去做。今年国赛的 A 题，它就是一个导弹射击问题。你可以把它考虑成质点，你也考虑成质点肯定是会扣分的，就注意一下就可以了。然后这里假设运行过程中不会出现任何的机械性故障，先可以写一下。</p><h4 id="AI-辅助建模与代码编写"><a href="#AI-辅助建模与代码编写" class="headerlink" title="AI 辅助建模与代码编写"></a>AI 辅助建模与代码编写</h4><p>这里是我今天要讲的重点，就是讲一下 AI 辅助建模和 AI 写代码。</p><p>讲 AI 辅助建模前，我先首先讲一下大语言模型，它是怎么去识别文件和图片。例如 Gemini Pro 或者国内的智谱，它是原生的支持和图片的理解。还有 DeepSeek 这种图片它是基于 OCR。OCR 的意思就是，它会先识别成文字之后，然后再把字识别出来的文字，再喂给 AI。AI 它并不会原生的去理解图片是什么意思。如果你要直接拖文件进去问的话，不要用 DeepSeek，因为它就是原生它是不理解文件的。</p><p>但是其实更建议你，自己先把文件转成图片，以文字的形式输入给 AI。AI 它对文文字的理解一般来讲是会高于图片。</p><p>然后讲一下 AI 处理能力。Web 端的 AI，它是被限制了输出长度的。无论 AI 它能力有多强，你一下让他回答太多东西，它的输出就是处于那种宏观层面上的解释。</p><p>像对于数学建模，你需要体现你思辨性和层次性的东西。如果你一次性输入的话，它只会给你一个简单……它只会给你一个方法，然后他也不会去深入解释这个方法到底是什么，然后也没更不会有那种多种方法比较这种问题。</p><p>最简单解决方法就一点点传。Web 端的 AI，它都是有那种上下文管理。</p><p>输出更好的话可以有个提示词工程，这也不细讲。</p><p>讲完 AI 的东西，我们来讲一讲你为什么需要知道上面这些东西，我刚刚讲的 AI 的处理能力和 AI 的识别问题。</p><p>数学建模的第一步，它是分析比赛的知道赛题怎么从工程问题转换成数学问题，分析高考物理题那样子去分析。我相信对于一个经历过高考的学生来讲，打破对数学建模恐惧之后去认真分析它是不难的。</p><p>你不知道怎么转换的话，你丢进去问一下 AI。</p><p>然后转化为数学模型之后，然后你接下来去看一下你这道题里面有没有你“方法表”里面的什么东西可以去适配去解决的。那更大的可能性，尤其是做 A 题跟 B 题的来讲，是不会出现的，或者你自己根本都分析不出来这道题他要考的是什么东西。然后接下来你又可以去问人家（指 AI）。</p><p>你需要注意，然后你需要注意什么？你需要的注意鉴别这些东西的使用。因为有可能就是你自己提供那些表它有可能有问题，有可能就是单纯的 AI 提供的这些东西它本来就是错的。</p><p>然后这里需要尤其注意，之前有跟小登交流过这个东西，不要去大篇幅的介绍你的模型是什么。例如你去大篇幅的去介绍微分方程的来源，或者你用的方法来推的。除非这个方法是你原创的。你用出来的方法，你只要不是原创，那一定是别人的工具。你不需要花篇幅去介绍别人的工具，你只需要在最后的附录里面贴出来，你找不到这篇……找到这个工具的来源，就或者说贴出来那篇论文就可以了。在真正写论文的时候，你只需要介绍这个工具的作用就可以，你是不需要关心工具的原理。你写工具的原理，它大概率就是判你凑字数。</p><p>然后美赛它是讲究创新问题。最难的方法是最难的创新，也是最好的创新，就是自己“搓”一套理论出来去适配问题。例如我们去年，我们组名义上的论文手，他就是基于电场和磁场的理论搓出来了一套摩擦场理论去适配问题。不一定你论文手就是全组最弱的那一个，恰恰相反，我们组的论文手还是全组物理和数学素养最高的那一个。</p><p>但是这种方法它风险很大，如果你说出来的东西有问题，那么就很可能是完全不如传统做法。</p><p>最简单的创新方法，你只要对着各种方法排列组合一下，给它用出来就好了。</p><p>到现在为止，我们来总结一下数学建模的建模部分的全流程：</p><ol><li>在问题一，你把工程问题转换成数学的模型。你基于数学模型框架，你使用了一种方法去求解，你或许可以用多种方法求解之后找出最好的那一个。这些东西都是可以体现在论文里面的，你不需要找到一个最好最优解法之后，然后再写进论文里面。</li><li>然后第二问就是沿用上一问的数学模型，然后发现这个老方法在新方法上不适配，改造了这个方法现在适配。</li><li>然后第三问是你填补了一下数学模型。</li><li>第四问就是你发现原来你整个问题全都是有漏洞的，那你只需要前面也不需要全部推翻重启，你只需要在这个方……就是你只需要在当前问题进行修改就好了。</li></ol><p>然后最后体现在论文的时候，在里面的时候，你只需要完整的把我刚刚讲的那个流（流程）写进去就好。我刚刚讲的，你完全不需要直接贴出你的最优解，你直接贴出来……就直接贴出来最优解的那种论文，它是没有那种层次性、没有层次性和思辨性。</p><p>到现在为止，我们有关于建模的问题已经解释清楚了，我们这里也是澄清几个概念。工程问题转化成数学模型，和利用数学模型靠方法去求解，这是建模的两个阶段，你不能给它混起来去谈。然后下面才是用代码来编写求解问题。</p><p>思路就是用的上文所说，就第二阶段那些思路。下面就是讲一下怎么用 AI 来编写代码，也就是如何使用已经被讨论出来的思路去写代码。</p><p>首先介绍两个概念，第一个概念是函数。大家现在都……大家都是学过数学函数的，在接触编程的时候，你接触过编程上的函数。你现在用的生成式 AI，本质上它也就是一个 $f(x) &#x3D; \omega x + b$ 的一个函数，只不过 $\omega$ 和 $b$ 它都是高维矩阵。</p><p>其次是接口的概念，计算机有个概念叫接口。这里看要看的简单看一下就好了，这部分就是主要就是这里。主要就是要理解给出来的接口是无状态的，你不需要去关心内部的细节，你只需要关心这个东西——就接口，它是怎么用就可以了。上面全都听不懂的就都无所谓，你只需要知道，就是你在 AI 让你给你函数的时候，你不需要关注这个接口的内部细节，你只需要关心这个接口怎么用，你只需要关心接口。第一是怎么用？二是它的效果到底是什么？</p><p>然后这里有个很不恰当的例子，简单看一下。总而言之，你让 AI 写代码，你得知道这个函数的输入输出是什么？你得知道这个函数怎么用，然后你还有我之前讲的，你得想办法让这个函数在你的那……在你本地的 IDE 里面跑起来。你只需要知道这些其实就够了。</p><p>我个人认为怎么让本……怎么在本地跑起来，对大多数来讲，大多数人来讲问题是最大的。</p><p>然后谈一谈“降智”。用 AI 的时候，你会碰到降智，有两种情况：第一种情况是官方本身给你限制了，那这没办法；另一种是你用这个窗口太多次了，上下文过多导致的有一种污染。例如你永远都解决……就你永远让 AI，就即便你把那个 Bug 点出来是什么了，你发给 AI，AI 也永远解决不好。这时候最简单的解决方法就是让 AI 自己总结一下本轮对话的重点，把你的文件和重点全都重新喂给一个新的对话，它就没有上下文污染。</p><p>还有个问题，AI 跑不出来代码怎么办？你还记得我最开始讲的一件事吗？数学建模它不是一道 OJ 形式的编程题，它是一道数学应用题。并且美赛它是不需要交任何的代码和附件，所以你只需要提交论文就好了。你编程手的作用进一步弱化，你 AI 跑不出代码，其实是无所谓的，你只要把论文“糊”好，就完全是可以的。</p><p>然后你现在为止，你只要去重复我刚刚所说的建模以及就 AI 建模和 AI 代码过程，你重复这两个部分，你的建模部分就可以很好的被撑起来。重点其实就是去讨论你的层次性和思辨性的。</p><h4 id="赛中危机处理与论文修正"><a href="#赛中危机处理与论文修正" class="headerlink" title="赛中危机处理与论文修正"></a>赛中危机处理与论文修正</h4><p>有两个问题，接下来下面是两个问题。</p><p>第一个问题是交流崩溃。美赛的第三个、第三天晚上，距离美赛结束还有 3、4 个……十个小时，我们直接谈崩了。大概就是我刚刚有说过 ac6 他是找到了一个直接“搓”出来一套理论去写一到三问，但是如果这个理论要去四套五、适配五到八问的话，我们会写不完所有的题目。当时我们压力很大，在那里直接吵了半个多小时。</p><p>然后后来就是他回去睡觉，我和黄幸星在那里，在那边搜网络上的那种解法，然后看一下五到八问怎么补救。然后最后讨论出来就是五到八问就不用……就最后讨论出来就五到八问就不用那个理论了，就是只用传统模型，然后最后用 CNN 跑一遍对比，然后直接给结论。</p><p>后面第二天的时候大家就整理好心情继续。就如果碰到那种交流崩溃的情况，大家就各自冷静一下。千万不要产生放弃的念头！</p><p>和交流崩溃一起出现的问题，思路错误。最严重的就是全篇思路错误。如果你第一天刚开始的时候就错了，那你可以大……那你可以放心大胆的推翻重来。那如果是最后一天错了，那也就只能“曲线救国”，弥补一下。在你发现错误开始地方直接往后说，前面的思路它都不是最优解，我这里提出了一个更好的方法。</p><p>今年国赛是由于我的失误思路走错了，最后半天的时候才发现问题，把最后一问改了，然后最后再摘要强调一下。那就是国赛 A 题是那年是……今年国赛 A 题是五问，我们一整篇论文，只有第五问的后半部分解法是对的，其他都是错的，或者说有问题，但是这样也是能拿省一。你你……他要你写论文就写这种东西，他要的不是你的最优解，他要的是体现你的思辨性、层次性和创新。</p><p>最后敏感性分析和误差性分析，就是美赛这是一个很公式化的东西，大家照着抄就好了。</p><p>在我的部分结束之前，我简单讲一下摘要。摘要它是一整篇文章最重要的部分，你至少花三个小时去修改你的摘要。三个人一起盯着电脑改，花三个小时改，不是一个人改。我们组的习惯是花六个小时，然后盯着摘要就一直逐字逐句在那边改。即便你通一整篇都是狗屁不通的东西，你的摘要至少得是合格的。</p><p>美赛，还有包括国赛的评审，他都是就看摘要。美赛的话，它就是 M 奖以下都是国内评的，只有评 O 的他才会发给美国佬。国内的评审论文也是只看你的摘要，就感觉摘要写的太烂了，他后面可能就不看了。摘要长度的话就是只要超过八分之五，并且不超过一页就可以了，我这里 ppt 可能写的有点问题。</p><p>我的部分就到这里，然后接下来时间是交给我的队友 firerater ，他主要负责的部分是检索，还有整合信息。</p><h3 id="firerater-部分"><a href="#firerater-部分" class="headerlink" title="firerater 部分"></a>firerater 部分</h3><p>好好。现在好，我现在共享屏幕。打开 PPT。Ok 那我现在接着上面 凉柚 NH3 所讲的内容，我来讲一下关于网络检索和信息收集的部分。</p><p>我来先毕竟说明是我当时是首次参加美赛，是首次参加建模比赛。我在其中起到的作用是比较辅助性的，所以我做的是信息收集部分，这一点在美赛中可能。在 a 题我们当时所选的前景下，因为数据缺失，所以我起到了一定作用。然后我在这边分享一下我当时的经验，因为我当时确实是以初学者没有经验的。角色进入这个比赛，我们看首先信息收集，我们先看我们一般会遇到我们上网查东西，我们主要是。一方面我们可能会去借鉴网络上的一些，一方面是参考文献，我们会在网络上去寻找，另一方面就是数据集，我将针对这两个。</p><p>我在比赛期间，我也是针对数据集和参考文献去进行检索，同时在其中摒弃一些不需要的，不应该参考的部分提取其中的精华来讲，首先就是这个网络上有一些建模思路，特别是 B 站上或者可能知乎。我把它播放一下网络上的建模思路，只能取其精华，或者说不建议看，因为发出来的人很多是抱着盈利性目的，他想。给你，他想获利，他想由粗制滥造，或者说速成出来的东西给你，让自己获利。思路大家都看到了，你不建议用，只能取其中一点点可以验证，还可以验证你思路激发你思路的部分，不要不能照抄，或者如果你。顺着他思路来可能会误导你。</p><p>那么我接下来讲，我的部分就是这个建模师，这个是比较重要的，不能去，我在信息收集的时候，我所摒弃的就是这一部分不能去轻信网络上包括 B 站。知乎还有一些突然冒出来的 CSDN 上面的这种网络上的思路部分，然后我们看可以借鉴哪些部分，然后我再介绍一下我所做的事情。</p><p>我零基础的针对当时所选的这个题目去做数据收集，还有一些信息的收集，那么我可能在其中起到主要大作用，就是 at 的数据集的下载处理。去处理，那么 A 题是关于楼梯古代楼梯磨损的一个题目，他的数据非常少，当时花了两天我才勉强找到当时好像。数据匹配性比较高，我做数据集的筛选和拆解，然后从网络上下载了大概 50G 的点云图数据。然后使用它相应的可视化软件，有个叫 cloudcompare 的软件筛选出了十句左右的，有包含楼梯的这种数据，它是点云图，它是我以前不熟悉没见过的一种数据，然后我再现学现用去按需分割出一些需要的部分去细化调仓，然后。给到编程论文手那边去提取数据分析数据，那么这就是我当时就初学者进去，没有一些编程。阅读论文经验的时候，我所做的事情它是相对费时费力的，但是这个数据找到了，可以说当时那个情景下。</p><p>黑体不提供数据，找到这样一个数据集，它的数据很详尽，它有对应的内容。针对古代建筑这个稀缺数据，我们找到数据。这样的情景下，我觉得数据找到的是一个重要的强心剂，它能够增强整个队伍的信心。</p><p>那么我以初学者角度现在下面讲。检索资料的建议和现学现用的建议，检索资料就是刚刚提到的参考文献的检索和数据局的检索在网络上主要是在浏览器上进行查找下载。然后还有可能去学习它里面的一些现有的处理方法，直接现学现用我们我刚刚说的点云图数据之前都没见过这个东西。怎么样去快速的学习这种数据的处理方法去把它快速的提取出我们所需要的部分。给到队友去静下来进行论文的编写和优化，然后这是现学现用的建议，我主要起的辅助作用。</p><p>我第一次讲可能不是很好，我们只是参考一下，不要太在意我里面的一些细节错误，接下来。第一点是资料检索建议刚刚老师和队友也提到了，在没有数据的情况下。我刚刚提到我们当时进行到第二天我才找到数据时间，总体上是很紧迫的，我找到数据的时候大家也是比较。惊讶的很难找，可能说周围的大家基本上没有数据，网络上也查不到有人说什么自己有数据，可能有人找到数据拿出来卖了，但是甚至没有看到这样的言论，数据非常稀缺。</p><p>我要所说的就是我怎么找到数据的就是首先有一个很重要的大局观，因为数据很难找，然后我们题目又比较多。部分题目它难度在后面依赖前提，或者说难度上升。你的分析，你的思辨性，层次性可能体现在和前面一题的。这个联系上面，那么此时你如果花费所有时间去找数据之后又找不到，这是很不好的，所以我起辅助作用，我找数据是在其他队友让我没有后顾之忧的情况下，我去进行这样的数据查找。</p><p>在你们如果是初学者，特别是对于大一新生还有经验缺失的同学，如果找不到数据，我建议是。及时开始配合队友就是验证一些不需要数据的部分去验证一些思路就写一些论文的其他部分推进进度推进最能够帮助你推进进度的部分。而不是花大量的时间去资料检索，我虽然讲这部分，但是这是我要提的，如果找不到那很难受。这就是避免沉没成本，或者说你应该同步。你如果要找数据，你可以同步的去验证一些你后面不需要数据的部分去推进这种进度。</p><p>然后当时甚至因为大部分同学找不到题目的数据，他们用了蒙特卡洛模拟之类的方法去模拟数据，好多网上可能给出的思路也是这样的思路。有一些不能参考思路，也许很多队伍用了，但是其实能够找到数据集是最好的，那么我下面再讲一下。</p><p>首先我们一定要找数据，我们确定了找数据必要性，如果大部分题目都依赖数据的话，我们去检索数据，我们有以下建议，我们刚刚说过，我们是主要依赖浏览器进行数据。查找检索下载，那么我们检索的时候，浏览器就建议使用比较建议使用这两个是首先他们是偏国外的浏览器他们。不是国内的我们使用国外浏览器的原因主要是以下两个。</p><p>首先国内的浏览器很多，它比较不支持插件的这种使用就是浏览器。它可以配置插件，包括刚刚提到的 凉柚 NH3 提到的论文翻译插件，网页论文翻译插件，这是你在下载论文前你查看论文。关键词摘要的时候，你可能会经常用到的一个工具，刚刚提到说叫沉浸式翻译，这个插件，我安装在了 edge 浏览器上面，而国内的一些浏览器？不支持这个东西，或者说很难配置 a9 浏览器比较方便，然后有了这个插件，你可以很方便的去进行网页翻译，然后查看它的内容，这是检索的时候。一个比较关键的地方，你有了这样的好的工具，用了比较好的工具，好的浏览器，你可以更好的检索。</p><p>然后是它还有一些插件，比如说网页资源下载有一些。网站它可能比较下载它权限制的比较严，有的工具插件，它可以爬取网站上的东西。这是其他的强大插件，所以使用这两个浏览器，有助于提高你的效率，能够让你更好的检索。</p><p>当你是一个初学者的时候。请记住少用国内浏览器多使用这两个或者其他的动手的工具，那么还有第二个原因是国内浏览器内核是比较低的，它可能使用它的时候。检索速度会变慢，同时他们默认的搜索引擎就是浏览器，一个是你使用的浏览器内核，另一个是浏览器，它的搜索引擎。搜索引擎，有的浏览器会限制它或者默认使用某一些搜索引擎，这样的搜索引擎，国内的搜索引擎，它很有可能会出现大量广告。覆盖掉我们所要找的参考论文，数据集。这两个最重要的东西可能会被大量广告以及神秘的没有用的思路文章给覆盖掉，从而你很难找到数据集。我们建议使用这种 C 浏览器之类的和配合搜索引擎。</p><p>第二点，搜索引擎配合搜索引擎来进行检索。搜索引擎主要是这两个更常用的是 bing 这个搜索引擎是微软开发的这个搜索引擎。我在上面，我在下一页有贴图在并和这种百度上面国内引擎上面所收集到的内容一眼就可以看出来它的这种内容的纯净性，你在并上面找一个数据集你。你看到好多链接，好多国外的链接，他直接给你贴出来了，而且大部分查到的数据局网站，它是公益性的公开性的，你可以很从上面大批的去查找你所要的东西，然后才能从其中。去筛选出你所需要的数据集。</p><p>那么这是 2.1 个是检索用浏览器，一个是搜索引擎，并且这里多提一点就是必要情况下有一些数据局网站可能得使用魔法工具才能够下载。当时在下载点云图数据的时候，似乎在注册方面就是有的网站，它可能限制你的下载，你可能注册的时候要需要用到。相应的工具你才能注册成功，从而获得下载权限。</p><p>那么这一些插件刚刚提到的像沉浸式翻译这个插件，还有一些下载插件，你。去看一些教程，你可以去寻找，因为我看到后面的安排，里面学长学姐也会讲一些相应的数据检索部分，我这里就。以初学者的角度给大家留一个印象，不细讲对应的插件，网络条件可以赛前准备好并熟悉他们。你可以先试一试。去下一篇论文去适应打开 nature 或者一些数据平台去尝试一遍，有个手感印象。你可以结合后面学长学姐所说的内容。更好的理解，更好的使用工具。</p><p>总结这一页就是用 edge 浏览器用 bing，这是我的配置，我一般是这样配置的 edge 浏览器使用 bing 搜索引擎，然后下一页这我贴的这个。网页搜索在百度和 Bing 引擎上面搜索这两个搜索雷达点云图数据集百度先给了一个广告，然后下面是。CSDN 的不是直接的链接，或者说点进去好多链接用不了以及各种广告，百度明显不建议用，然后 B 这边你看一下子就可以找到这些。百度上检索不到的数据集，他们免费可以下载你要点进去详细的看你去大批量的检索，看有没有适合你的，很多网站是很友好的，你去注册完之后。你可以免费的下载，它有一些数据集。</p><p>还有一个部分就是有一些数据一看量它的占空，它所占空间。很大，我当时下载点云图数据的时候，似乎在注册方面就是有的网站，它可能限制你的下载，你可能注册的时候要需要用到。我找到的点云图数据，每一个基本上都在 20G 以上，然后解压你下载到的大小是一个压缩包，你还要解压它解压出来是双倍的空间，你需要充分的准备你的存储空间你才能够。下载完你才能够打开它，然后才能找到你想要的部分，更加细化精化。</p><p>然后我们刚刚提到我们去找数据集，我们在病上面看到这些好多都是英文名字的，还有外国这种整理出来的数据集，我们为什么要找这样的数据集，我们推荐找英文来源的公开数据集，为什么？因为像百度这里它直接推送了一些 CSDN 网站上的文章，好多也是抱着盈利目的，有的可能贴到把自己的微信公众号链接贴在那边，然后让大家去什么关注扫描。最后竹篮打水一场空没找到数据集浪费的时间，在美赛期间时间紧张的时候，这种网站。会浪费自己的时间。</p><p>然后。这些网站自身有数据自身免费，但是可能会浪费你的时间，他们可能会进入一些你下载不到东西的网站。而且很可能就是盗版来自于我们说的英文来源的公开数据集的，然后他还可能跑到一些直接收费直接跳广告的界面，这边可能不说你。遇到好多情况就是浪费你的时间，所以不建议去看这种类似 CSDN 网站上面的有数据局的文章，可以稍微看一眼看看。里面有提到什么，但是不要点它链接，或者说看到它有广告之后直接关闭界面，不要多看这种浪费时间，强烈建议检索英文数据集，并且搭配刚刚提到的沉浸式翻译之类的汉化插件检索。来提高效率。</p><p>并且好多数据局网站它提供的是浏览器直接下载途径，也就是刚刚提到的数据集好多，它的内存占用内存很大。然后你从国内的，要么他让你网盘下载，要么让你去关注微信公众号去途径让你下载都不如浏览器直接下载，直接迅速浏览器下载，直接使用你的宽带下载它。速度优于你去花时间开会员，或者说好多情况下的下载，我当时下载点云数据网站直接提供浏览器下载。虽然有 20G，但是每一个数据集大概没有超过半个小时就下载完了，那么不要去尝试去花钱去开通很多什么网盘会员去下载所谓的数据集，因为他们。难以看见他们真正的作用有效性。</p><p>我刚我等一下会展示一个网站，它是我当时检索时的网站，它上面可以直接看到点云图，它直接给你提供预览界面，这样的网站是很好的。你可以直接看到这数据集是不是你想要的，他有没有你想要的东西，这种网站很好，你可以去尝试搜索更多这样的网站，而不是下载看不见内容的这种网盘里的文件，然后花钱花时间下下来。打开发现不是一所要的东西，这是浪费时间的，没有效率的。</p><p>那么电视病人（但是别人）刚刚说的上面有一些什么数据集文件，还有提到一些什么建模思路的那种想法。不建议看，但是你在后面我要提到的是现学现用软件的学习的部分，你可以参考其中的一些内容，比如我刚刚提到的处理点云数据时使用的是。Cloud compare 这个软件它其中有一步是调整我们点云图的朝向，它需要去进行欧拉角旋转这样的。好像比较特殊的操作，我是在其他的途径没有找到他的学习内容的，我是在 CSDN 上面某一篇文章，小众文章上面找到了这一个资料的。所以 CSDN 上面可以参考一些软件入门学习的部分。</p><p>然后是现学现用的部分，我们刚刚提到网络上的思路不参考，而网络上有参考文献。他们往往搭配的思路出现，那么思路那些很多是他们论文在参考文献之前出现的，他们把一些。那种参考文献里面的东西组织一下，然后贴进去就发出来了，但是也没有参考文献的精华，你在数据缺失参考文献缺失，比如我当时的。古代建筑楼梯磨损这一块很少有相关的论文，当你自己检索不到更多论文时。你可以去参考所谓的完整论文，他们给出的参考文献，尝试从参考文献里面别人的参考文献。找到想要的东西，很多文章参考文献，它有又有自己的参考文献，你可以一直找你从这个角度出发。你就可以去更好的去发现想要的参考文献，这是参考文献大于网络上思路的部分思路，大部分模仿千篇一律参考文献，它是。很多是来自权威网站，权威期刊，这些参考文献是值得参考的，那么我们做的事情是更好的阅读参考文献。</p><p>我们要找参考文献刚刚说的是数据缺失参考文献很少情况下我们。去参考别人的，一般情况下，我们是自己检索关键词的。我们看我们所需，比如说我们的轴心磨损，我们就检索磨损这个东西。磨损它可以转换成英文关键词，然后去检索，然后去找相应的论文按类下载，然后保存打印。我可能讲的速度比较慢，我讲快一点，然后我们可以获得相应的 pdf 文件，然后我们还可以去查看网络上提到的一些就是我刚才说的那些参考文献，别人有提到的，我们去看一下以及一些重要的关键词，我们去检索。</p><p>我在 open heritage 这个是数据局网站，我在上面去查找楼梯的直接查这个关键词，没有找到，但是我在其他人提到参考文献关键词的时候，我。看到说有一些建筑这种名字，然后我去搜索，我就搜索到想要的东西，所以现学现用部分可以去参考别人一些关键词。</p><p>这是这一页的部分，然后这是我当时的一些看的网课知识课，这是现学现用部分的软件学习部分去学习参考一些网课就是。这一页总结这精简总结就是现学现用我们要学软件，学一些处理方法的时候，最好方法最快的方法就是类似期末速通，我们去看网课，然后找教程确实有时候可以参考 CSDN 支付这些部分，然后。不懂的部分让 ai 教你这三个三毛斧下来，你可以去学习一些相应的东西，那么我这个软件平时难以接触，但是可以通过这样的方法去疏通去学习，然后可以提取我们想要的有效部分。</p><p>然后 CSDN 可以提供一些小众内容帮助你学习，然后这个总结就是选择合适的浏览器，检索引擎，找到想要的数据文献。然后搭配 ai 助力软件，你可能是很陌生的，需要从零到一处理学习，但是提前把这些准备好，你去安装好，它像刚刚 凉柚 NH3 提到的，你先去搭配好你的编程环境之类的，让代码能在本地跑起来，以及这些插件安装好，提前去下一个论文，然后准备一些网络环境重要的工具账号。你就可以更加熟悉工具的使用，提高自己的效率，提前准备好能保证比赛期间不堵塞，然后不要去把自己一些关键信息输进去，可能会泄露。</p><p>这是我的部分，下面可以交给队友来讲，我先退出共享。谢谢。</p><h3 id="ac6-部分"><a href="#ac6-部分" class="headerlink" title="ac6 部分"></a>ac6 部分</h3><h4 id="引入（绘图与排版）"><a href="#引入（绘图与排版）" class="headerlink" title="引入（绘图与排版）"></a>引入（绘图与排版）</h4><p>我这边就接着他讲讲绘图与排版。首先声明一下，现在的数学建模就是以论文手为核心，这是之前我队友说过的，论文是建模比赛的“脸”，是一个“颜值”。评委老师可能只关注你的论文，他根本不关注你数据的来源，你的方法可能也会关注，但是重要的是论文与排版。首先声明一下，这篇是我的个人见解，可能里面部分观点有点极端了，先叠个甲。</p><p>一个建议是一定不要抱着“先建模，然后代码验证，再写论文”的方法。换到高中数学的话，就是一定要先看题目，然后思考怎么解题，然后在草稿纸上把题解完，然后最后再填到答题卡上——这种做法在数学建模比赛中是不可取的，主要是因为来不及。</p><p>这个时间是非常紧张的，有的时候可以建模和论文一同进行。毕竟比如说你的队友在建模的时候，你的论文里可以把一些模型假设，或者一些基本的一些架构先打好。</p><p>这里很多人——美赛是包括很多大一学生——是他们的第一篇论文。第一篇论文，建模论文和普通论文还是有一些区别的。特别是美赛建模论文，就是偏向教科书、杂志这种类型的，要图文并茂，或者是有图有公式。</p><p>像这边是人教版数学九年级的，就是花里胡哨一点。我们的绝大多数书可能是有西方教科书的模式的，但是特别是练习册，包括教学方法，很多都是一些老式的“苏联模式”：就是老师一昧的堆砌概念，定义 1.1 就是什么极限的定义，然后公式 1.1 什么微积分基本定理，然后引理……整本书都是堆砌公式。</p><p>但在你的论文里面，一定不要出现完全堆砌公式的情况。你要注重生活情景，而生活情景、生活主题、社会热点问题，它恰恰就是数学建模的一个过程。比如说我们高中数学用复利问题引入自然对数 $e$，或者用种群增长模型引入这个微分方程，用刚刚的比萨斜塔引入这个简单的解直角三角形。</p><p>你在论文里体现，不能直接体现解直角三角形——上来第一句话就是“我们可以考虑这个解直角三角形”，这是非常突兀的。你要先做一个介绍，一种引入。这是常规的方程中用震荡电路来表现这个微分方程，来引入微分方程，这有一个过渡，不会那么突兀。</p><p>数学本身是为解决问题而发明的工具，我们把它教成了一个抽象体系，然后再去找应用，这似乎本末倒置了。而这个建模比赛就恰恰反映了这个应用是一个抽象它的本身。是先有问题，再有数学，而不是先有数学，然后我们再找这个应用。人类的公然认知是从情景到总结，而不是先有公理，再有应用的。</p><h4 id="关于图片的分类与绘制"><a href="#关于图片的分类与绘制" class="headerlink" title="关于图片的分类与绘制"></a>关于图片的分类与绘制</h4><p>然后我这边分为几类：</p><p>第一类：图表和公式</p><p>首先就是有关作图的。因为是零基础，我这边就以一个初学者的角度来讲一下这种图。包括这种教科书的图，你怎么做？这个图就很简单，网上随便找一个比萨斜塔的图片，然后拿进 PPT 里面画两个箭头，这种图相信绝大多数人都会做。</p><p>我这边图片分为四个模块：</p><ol><li><strong>凑字数的图（充版面的图）</strong>：就是一页文字中你可能绝大部分都是文字，你要用两张图来充版面，让你的这个论文不那么单一。我这边讲的论文是以 Word 文档为主体的。</li><li><strong>反映数据的图</strong>：这也是老师或者是一些网课特别强调的，数据反映的比较直观。如果用一张表或者用文字叙述的话，可能不会像图片这么直观。这里紫色的线的震荡比绿色这个线震荡明显要大，如果用数据或者图表阐述的话，没有那么直观。</li><li><strong>流程图</strong>：类似于思维导图，就是展示文章架构，就是展示你的解题思路的一种图。</li><li><strong>示意图</strong>：跟这个充版面的图其实是差不多的。示意图分类可能很多了，包括受力分析图、几何的画画（函数图像或者抛物线、投篮球的图像），包括前面这个祝融号飞船的航海图像，就是示意图。</li></ol><p>美赛对于论文的写作、图片的绘制是重视度非常高的。这跟国赛是不一样的，国赛可能更注重你的结果，更注重你的那个方法。你的文章可能可以堆砌，可以像“苏联模式”这样堆砌公理、堆砌方法，或者像你高中考试写作业的时候那样。但是美赛一定不行的，一定要有优雅的配图和排版。美赛偏向于是一个杂志，很多图主要是为了美观。</p><h4 id="详细讲解各类图片"><a href="#详细讲解各类图片" class="headerlink" title="详细讲解各类图片"></a>详细讲解各类图片</h4><ol><li>展现数据的图形</li></ol><p>这边我认为数据图最主要的是数据，而不是折线用什么红色白色、这个点是散点图还是什么。主要就是数据如何获得。</p><p>展示数据的图片有很多，一种就是用 Excel，对于初学者来说最简单就是 Excel。比如今天的天气，这周的天气最高气温 15 度、最低气温 5 度……然后画成一张折线图。这是用 Excel 可以做到的，也是非常简单的。</p><p>当然也可以使用 Matlab、Python，就是喂给他数据，然后他给你生成图像。也可以使用网站工具作图，也可以直接把那个数据归给 AI，然后让 AI 给你进行美化。但是要注意一点，你把数据丢给 AI，或者是让 AI 生成图片的时候，它可能会对图片进行“二次创作”。它可能不是跟你喂的数据完全一致，会有些出入或者有些美化，就要注意一点。</p><p>专业的软件，我这里就不讲解了，一般都是现学现用，比如 Origin 这种美化数据的软件。</p><p>你要知道的你需要几种图表，一般来说就是：<strong>柱形图、折线图、散点图、饼图和热力图</strong>。</p><ul><li>柱形图、折线图和饼图是大家小学初中包括高中都特别常用的。</li><li>散点图主要就是展示两个变量之间的相关性。比如青年就业率和结婚率的关系，这种叫相关性，就可以画散点图，可以加拟合线或者线性回归之类的。</li></ul><p>展示量化关系就是这种图片。当然不仅限于这几种图片，可以用一些组合图或者是一些你自创的图片。</p><ol><li>流程图（思维导图）</li></ol><p>我这边最容易上手的就是 PPT 上面的画图。PPT 这边直接插入形状，给它调成黑色，然后用简单的箭头在这里连接，就可以简单的作图了。</p><p>这个流程图重要的是你的思路，你怎么搭的框架。就比如说青年失业率和结婚率的关系，你需要注意的是，输入到输出中间的思路是什么？这其实是你的建模过程。</p><p>就比如说祝融号，你要建模成一个质点，这个是如何建模的？你要体现这个思路。比如说这个祝融号在航海中特别小，这些相当于模型假设。主要是理清思路，而如何理清思路，就是有已知条件和输出。</p><p>中间的假设条件（Assumption）可能是在一定程度下是平稳的，或者是什么移民条件很平稳，然后可以简化成什么模型。就是输入一个东西，产生一种框架。比如无人机的位置，这个投档位置相当于中间变量，引爆位置都是中间变量。</p><p>基本的建模流程图可以笼统一点，也可以详细一点。这其实是一个等到大题的流程图，你每道小题流程图可以再详尽一点。就是讲这里基本建模的时候可以拆开来，如何建模、针对性优化，这只是一个在问题分析后面一个总的建模。把你用到的大体模型给它展示一下就可以了。具体的求解方法，包括灵敏度分析或者误差分析，展示一下就可以了。</p><ol><li>示意图</li></ol><p>示意图也很多样，像这种受力分析图，或者是日历图，或者是时间的年代图。</p><p>主要就是根据题目的要求。如果题目是一个电学图，你肯定要画电路图试一下；如果题目是一个几何题，或者是什么钟摆，你可能是要画几何图这样试一下；或者是受力分析图。</p><p>必要时候，你们第一天，特别是第一天没什么思路的时候，可以直接手写手绘示意图，在草稿纸上画一下这种图，再在 PPT 或者是一些软件上面做这种图片。或者是你实在没办法，把手绘的扫描成一个文档、扫描成一个图片，然后贴在你的论文里面。</p><ol><li>水图（充版面的图像）</li></ol><p>就比如说我们高等数学中的欧拉头像，或者说语文书上一些奇奇怪怪的建筑图，或者什么杜甫头像，大西洋日报里面的一些浮夸的图像。</p><p>有些图像你没什么意义，删掉也是可以的，它放在那里的意义就是吸引人的眼球，就是为了充版面，这就是这种“水图”的意义。像这个谜语图，你完全可以用两行字来介绍一下这个谜语是什么，但他用了这幅图，配色还特别的丰富。</p><p>这种图片就是充版面的。而这种图如何找？一种就是你可以直接上网搜索，但是上网搜索后面在你论文后面一定要标记信息来源（谷歌搜索或者是哪个链接）。</p><p>还有一种，水图不宜过多，不要整篇文章全是水图，这样显得论文很空洞。而且不要放一些无关的水图，有些人这个论文里面把你们三个合照放进去，这不行的。</p><h4 id="表格与符号说明"><a href="#表格与符号说明" class="headerlink" title="表格与符号说明"></a>表格与符号说明</h4><p>第二个就是表格，一个很重要的就是 <strong>Notation（符号说明）</strong>。</p><p>这里表格尽量用<strong>三线表</strong>。这边展示一下三线表如何用：</p><ul><li>你插入一个几行几列的表格。</li><li>把它全框线设置成无框线。</li><li>然后第一行的上面（上横线）设置一磅，然后下横线也设置一磅。</li><li>这里表头可以设置 0.5 磅或者 0.75 磅，这无所谓。</li></ul><p>一个是符号（Symbol），然后描述（Description）和单位（Unit）。</p><ul><li>符号：比如说 $v_i$ 表示速度，尽量用新罗马体（Times New Roman），斜体。</li><li>单位：尽量是正体，不要斜体。</li><li>描述：尽量就是三线表，也不要全框线，显得很杂乱，三线表还是比较美观的。</li></ul><p>关于符号说明（Notation），可以把全文反复用到的符号声明一遍，不要每个符号都声明，显得这个文章会非常的臃肿（一个 Notation 占了半页或者占了一面）。有些参数、有些系数，整篇文章你只用了一次或者只用了两次，你只需要在那个公式下面描述一下这个参数是什么意思就可以了，不要单独的放在 Notation 这里。</p><p>这个 Notation 尽量不要超过半页，如果超过了，你尽量可以删减一下，把一些不重要的删减一下，就是美观问题。</p><p>关于表格还有第二个作用，就比如说有些数据你枚举的非常费劲，或者它的规律性特别强。比如说这个无人机，它三台无人机投放，然后三个坐标、三个遮蔽时长、三个速度。你用文字描述的话可能会一大段，但是你不一定描述的清楚也不明显，你就可以列一张表，或者是做一个图（当然我这里建议列表）。这个表格你可以自定义，比如这里写速度，这里写方向，也没有问题，把同类型的给它合并起来。关于表格比文字是更直观的，文字有的时候让人不想看，让人厌倦。</p><h4 id="公式编辑"><a href="#公式编辑" class="headerlink" title="公式编辑"></a>公式编辑</h4><p>关于公式，对于初学者来说公式就这两种：</p><ol><li><strong>Office 自带插入公式</strong>：利用 Office 这里的插入公式，基本上你的所有符号都能枚举出来，或者上下标也是可以的。对于初学者来说已经很够用了。当然有些排版可能不好看，比如这个分数线、指数可能不够规范。</li><li><strong>MathType 插件</strong>：比如 $\lim (1 + 1&#x2F;n)^n &#x3D; e$。用 MathType 生成的是新罗马体，和 Office 自带的字体不一样，教科书是更偏向于这个新罗马体的。包括矩阵，这边自带的也是可以直接声明矩阵的。</li></ol><p>还有一种就是用 AI 生成公式。所以你再笨的话，你就用手写，把公式手写出来，或者说你看到那个网上找或者 AI 生成的一些公式，你看不懂，你把公式手写出来，然后再让 AI 给它生成成这种 LaTeX 代码。这行代码在 Word 文档里面（如果有插件）可以直接转化成这个公式。</p><p>这是公式的问题，尽量要会编辑一些简单的公式，复杂的公式其实也没必要。</p><p>然后就是关于公式，你要完善每一个公式的说明。就是一大串公式之后，你要完善好这个 $E$ 指代的是什么？$a$ 指代的是什么？$C$ 和 $R$ 分别指代的是什么？</p><p>还有就是不要堆砌公式。不要一版面全是公式，然后后面一版面又全是图表，前面一版面又全是文字，这样显得排版非常的不合理。</p><h4 id="论文架构"><a href="#论文架构" class="headerlink" title="论文架构"></a>论文架构</h4><p>下一页就是整篇文章的架构。这分为：</p><ol><li><strong>Introduction</strong>（问题背景、问题重述、分析）</li><li><strong>Assumption</strong>（基本假设）</li><li><strong>Notation</strong>（符号说明）</li><li><strong>Body</strong>（主体内容，Part 4 &amp; 5）</li><li><strong>Evaluation</strong>（模型的评价）</li><li><strong>Conclusion</strong>（结论）</li></ol><p>目录也是要有的，分一级标题、二级标题、三级标题这样子。</p><p><strong>Part 1</strong>: 模型的背景、问题的分析和大体的方法。你大体的思路要在第一部分里就体现出来，不要磨磨唧唧的最后一段才体现你的建模方法。这是不可取的，尽量在开头或者摘要的时候就体现出来。全文的框架（思维导图）尽量堆在前面，让评委一眼就能看到你在干什么。</p><p><strong>Part 2 &amp; 3 (Assumption &amp; Notation)</strong>: 模型的假设。比如说比萨斜塔可以假设它是直立的，不是一个拱桥；也可以假设每层楼高是一样的；或者那个祝融号可以假设它是一个质点。</p><ul><li>符号说明刚刚讲过了，就是把全文主要的符号给它列举起来。</li></ul><p><strong>Part 4 &amp; 5 (Body)</strong>: 正文内容。注意一下必要的误差分析和敏感性分析。基本上你的模型都不会是完好无损的，都会有误差。</p><ul><li><strong>敏感性分析</strong>：就是调整参数，你的模型结果会不会变，变多少？</li><li><strong>误差分析</strong>：就是你这个模型预测的结果，接不接近。</li></ul><p><strong>Part 6 (Evaluation)</strong>: 模型的评估。列举几条模型的优缺点，或者是可能的运用、推广、改进之类的。</p><p><strong>Part 7 (Conclusion)</strong>: 模型的结论。这边有一个要注意的就是，包括模型假设、评估和结论，<strong>结论要写在前面</strong>。尽量把结论写在前面，不要一段文字在这里堆砌不知所云。</p><ul><li>有些人写一大段，既写了他干净清爽，又写了他勤洗头，又写了他形象端正……你想表达什么？要尽量把点写在前面。</li><li>还有优缺点不要前后矛盾了。</li><li>可能的推广：如果你的模型特别简单，尽量写推广；如果你的模型特别新颖，就可以写应用。</li></ul><h4 id="摘要写作"><a href="#摘要写作" class="headerlink" title="摘要写作"></a>摘要写作</h4><p>然后就到了最重要的一点：我们现在论文错字连篇，96 个小时过后，你的论文还是什么都不会，前后矛盾，图文不搭，公式乱码的情况下，只剩三个小时了。现在你要干什么？</p><p><strong>你现在当务之急要做的就是改摘要</strong>。把摘要给它改的像一篇人写的出来的东西。当务之急是改摘要。</p><p>摘要怎么写？摘要其实就类似于八股文，我这里摘要分成三个部分：</p><ol><li><p><strong>第一段</strong>：主要就是一两句话引出你的背景，引出你的问题。不要太多，不要超过两行。然后再两句话写出你贯穿全文的方法、总问题、总方法、主要模型。这两段加起来不要超过四句。</p></li><li><p><strong>第 2、3、4 段</strong>：针对你的每一个问题都简要的概述一下。</p><ul><li>首先简要概述一下你这个问题想干什么。</li><li>然后你用了什么思路，用了什么模型，用了什么算法，解决了什么问题。</li><li>如何优化这个问题。</li><li>把非常明确的东西放在摘要里，不要把一些模棱两可的东西写在摘要上。</li><li>摘要一定要“能量度”高，一定要每一句话都不能有语病的，不要啰嗦。</li><li>主要过程、主要关键步骤就是在中间这几段。</li></ul></li><li><p><strong>最后一段</strong>：交代你全文的特色，对应的就是模型的优缺点，或者说模型的推广。也是两三句即可。</p></li></ol><p>摘要里 11 个字：<strong>就是要凝练，一定要简明扼要</strong>。</p><h4 id="字体与排版"><a href="#字体与排版" class="headerlink" title="字体与排版"></a>字体与排版</h4><p>最后是关于字体字号问题。</p><p>首先美赛对论文其实是没有什么要求的，只要字体字号让阅卷老师看得清楚就可以了。</p><ul><li>我建议正文的字号大小是<strong>小四</strong>。</li><li>摘要这种一级标题比二级标题要大，二级标题比三级标题要大。</li><li>摘要标题用<strong>小三</strong>。</li><li>加粗不加粗我觉得无所谓。</li></ul><p>我推荐四五种字体：</p><ul><li><strong>衬线字体</strong>：就相当于宋体，比如 <strong>Times New Roman</strong>。尽量正文就是 New Roman。</li><li><strong>无衬线字体</strong>：相当于黑体，比如 Arial。标题或者图表的话可以用这个字体。</li><li><strong>等宽字体</strong>：比如 Courier New，用于代码可能多一点。</li><li>不要使用突兀花哨的字体，在正文里一定不要使用。</li></ul><p>我这边就到这里！后面是交给我队长（<strong>凉柚 NH3</strong>）的第六部分，给我队长总结一下。</p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>凉柚 NH3：</p><p>最后，就总简简单很简单的总结一下，最后就体验就是一个关于绘图的话，就反正你就现在你可以用 ai 生成，你可以生成。这个我不细讲了这篇 ppt 里面非常多的图，都是用 ai 有一些可能看得很明显，但是有一些就是我特地加的 prompt，让它变得非常不明显，看出来人。</p><p>然后最后一点就是有关于 AI 的使用问题，我们那个时候是 25 年年初那个时候最强的 AI 是 chatgpt4，4o 的话，它是有次数使用限制的次数限制非常严格。反正无论你使用什么 ai 工具，反正就是保持自己的思考。</p><p>另外要注意的就是 ai 它是有使用次数上限的，比如说学生认证后的 Gemini 3 Pro 还一天请求次数上限是 100。然后我们分享就到这里，接下来是有没有 qa 我也不知道你们有没有问题要问，因为因为我前面以为时间不够，我讲的会比较紧，后面我两位队友会讲的会松一点，没有的话就这样吧。</p><h3 id="后续：总结与问答"><a href="#后续：总结与问答" class="headerlink" title="后续：总结与问答"></a>后续：总结与问答</h3><p>周老师：</p><p>来看一下其他同学有没有什么要问的？</p><p>因为说实话，不管他们整个团队，整个分享都非常细。大家一定要注意，他是从整个的初学者的角度，就是说从他们自己刚开始美赛建模过程当中的一些经验。</p><p>包括我听下来之后，我感觉好像有一种身临其境的感觉，可以感觉到他们在一整个比赛过程当中，他们的队伍到底是怎么样在磨合，或者怎么样去把这个任务给它完成。我是可以感受到这一点，不知道在座听的同学会不会感受到这些点。</p><p>他们的准备 PPT 里面也给了很多大家以后会经常问到的问题，比如说：</p><ul><li><strong>关于论文格式</strong>：按道理，我们的论文它的格式有什么限制？刚才 ac6 同学说了，它只有个页码的限制，还有摘要的页码限制、目录的一些页码限制，但是里面到底你用什么样的字体，或者什么样的一个字号，是没有硬性限制的。</li><li><strong>关于图文配合</strong>：很关键一点就是你怎么样通过文字、图表进行好好的配合，添加一些色彩等等，怎么让你的整篇论文看起来赏心悦目。</li><li><strong>核心竞争力</strong>：最关键一定有你自己的内核，有自己的创新的东西。这是最关键的。</li></ul><p>其他同学还有没有什么要问的？所以这些东西是一个很难得的机会哈，但有些我是感觉如果你有去体会，或者最近有在认真准备的同学，你就会感受到一些问题。</p><p>在这个问题里，我刚才也跟大家强调过了，我觉得刚才 <strong>凉柚 NH3</strong> 提的一个非常关键：</p><ol><li><strong>研读欧奖论文</strong>：你在准备过程当中，你到底选取了多少篇优秀的欧奖论文？你选取的欧奖论文，你对它研读到了什么程度？这会影响到你最终能走得多远。言外之意，我到底给我自己整个的团队、整个建模过程里面，我花了多少时间准备？我们的研读到底是研读到什么程度？</li><li><strong>关于选题</strong>：总共有六道题，当然大部分的队伍都会选择前面的三道题。刚才也给了一个比例，选 C 题的比例更高，因为不管怎样，你在什么专业当中，你 C 题多多少少都会能够把它完整的完成，它的整个的专业性可能稍微会偏弱一点，更多的是一种比较广泛的、大家能够接受的思考。</li><li><strong>赛前准备</strong>：在现在这个阶段里面，你该怎么去准备？这是一个非常关键的事情。所有的这些工具，怎么样挑出来觉得适合你们团队的？或者你所选择的努力的一个方向，基本上在这之前都有一个很明确的方向。哪一些题、哪一些类型比较适合你们自己队伍的，你们都必须要把这个事情做到前头来。包括排版的一些工具，还有我们的一些公式的使用，这些东西对你们来说上手都是超级快的，只要你用心的去做这么一件事情，都可以很好的去完成它。</li></ol><p>你看他的整个分享，也是我们之前在做去年美赛的时候，就是针对“数据”这个问题。他就告诉大家，他的一整个思考：他怎么去选工具，怎么样去一个流程。我觉得听下来，能够感受得到就是在身临其境的。在那种好像大家都在没办法找到数据的情况下，我怎么做到我去突围？我能够队伍能够找到一个比较不错的数据？别人找不到我能找得到。</p><p>而且里面也说了，<strong>千万不要去听信网络上所对应的分享</strong>。我可以告诉大家一个非常关键的点：</p><ul><li><strong>避坑指南</strong>：只要是网络上分享的那些方法，基本在评审的时候都会规避。因为那些方法都不是不靠谱，或者都不是一些很成熟的方法。</li><li><strong>独立思考</strong>：你想，很多方法都是题目一出来一两个小时他就有思路了，如果是这么简单的话，那我也不需要说大家去建模了。所有的东西全部都是 AI 去做，或者全部都是按照这一个套路做，绝对不是这么回事的。他只是给你抛一些诱饵，让你去咬这个钩，一旦咬了这个钩，你就发现你后面就完全就深陷其中了。</li></ul><p>不管怎样，我觉得他今天讲了一个非常关键点：<strong>每支队伍你在拿到题目的时候，一定得有自己的思维。</strong></p><ul><li><strong>工具的主动权</strong>：一定要你把所有的所能用到的工具，一定得能够“为你所用”，为你队伍所用。不能被所有的工具，比如被 AI 牵着鼻子走。如果你一整篇论文给出来都是 AI 的味道，那你这论文肯定被灭了，基本上你肯定是走不远的。</li><li><strong>现学现用</strong>：你要让 AI 变成你的一个工具。当然，有些可能说碰到一些题目，我得现学现用，你得知道我怎么样、以什么样的渠道去现学现用。这些东西平时你都必须去练习。</li></ul><p>说点实话，我就不知道大家听完之后你们的感受到底是什么。我看有些同学可能就没有太多认真去听这方面的一些分享，好像感觉现在还有时间、我可以放回放等等。我是觉得很多东西就一定得是“现在学，现在感受”，直接把这问题给他解决掉了。</p><p>同学们还没什么问题？如果没什么问题的话，我们今天这支队伍的分享就到这里哈。</p><p>感谢你们三位同学哈，非常感谢花了很多时间去做准备，也给大家提供了非常精彩的一个报告，好，谢谢你们！</p><p>我刚刚说了，那当然那个内容我还是算了，放在明天说吧，那今天的时间也不早了，那我就不多说了哈。那我们今天的分享就到这里。好同学们，这我们就退出会议了哈。</p><p>梁老师，大家退出会议有什么问题都可以在群里面都问，都可以问。</p><p>梁老师：</p><p>好，那就这样子。</p><p>周老师：</p><p>梁老师再见哈，好，新年快乐！梁老师快新年了，再过差不多两个小时。</p><p>梁老师：</p><p>好，再见，新年快乐！</p><p>周老师：</p><p>好。</p><h2 id="爬取腾讯会议会议纪要的脚本"><a href="#爬取腾讯会议会议纪要的脚本" class="headerlink" title="爬取腾讯会议会议纪要的脚本"></a>爬取腾讯会议会议纪要的脚本</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.chrome.service <span class="keyword">import</span> Service</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.by <span class="keyword">import</span> By</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.keys <span class="keyword">import</span> Keys</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.action_chains <span class="keyword">import</span> ActionChains</span><br><span class="line"><span class="keyword">from</span> webdriver_manager.chrome <span class="keyword">import</span> ChromeDriverManager</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">scrape_tencent_meeting_keyboard</span>(<span class="params">url</span>):</span><br><span class="line">    <span class="comment"># 1. 启动浏览器</span></span><br><span class="line">    options = webdriver.ChromeOptions()</span><br><span class="line">    options.add_argument(<span class="string">&quot;--log-level=3&quot;</span>) </span><br><span class="line">    options.add_argument(<span class="string">&quot;--mute-audio&quot;</span>) </span><br><span class="line">    </span><br><span class="line">    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)</span><br><span class="line">    <span class="comment"># 窗口尽量拉高，这样一屏能容纳更多内容，减少滚动次数</span></span><br><span class="line">    driver.set_window_size(<span class="number">1000</span>, <span class="number">900</span>) </span><br><span class="line"></span><br><span class="line">    unique_sentences = &#123;&#125; </span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;正在打开页面：<span class="subst">&#123;url&#125;</span>&quot;</span>)</span><br><span class="line">        driver.get(url)</span><br><span class="line">        </span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;等待页面完全加载 (8 秒)...&quot;</span>)</span><br><span class="line">        time.sleep(<span class="number">8</span>) </span><br><span class="line">        </span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;正在尝试点击文字区域以获取焦点...&quot;</span>)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># --- A. 关键步骤：点击文字，获取焦点 ---</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment"># 找到第一行文字的容器</span></span><br><span class="line">            first_text = driver.find_element(By.CSS_SELECTOR, <span class="string">&quot;div[class*=&#x27;minutes-module-paragraph&#x27;]&quot;</span>)</span><br><span class="line">            <span class="comment"># 点击它，确保当前网页的“活动元素”是这个文字区</span></span><br><span class="line">            ActionChains(driver).move_to_element(first_text).click().perform()</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;焦点锁定成功，准备开始按键阅读...&quot;</span>)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;点击失败，尝试直接点击 Body: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            driver.find_element(By.TAG_NAME, <span class="string">&#x27;body&#x27;</span>).click()</span><br><span class="line"></span><br><span class="line">        last_count = <span class="number">0</span></span><br><span class="line">        no_new_data_attempts = <span class="number">0</span></span><br><span class="line">        </span><br><span class="line">        <span class="comment"># --- B. 循环：模拟按“下”键 + 抓取 ---</span></span><br><span class="line">        <span class="comment"># 既然是长会议，我们多循环几次</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">300</span>): </span><br><span class="line">            <span class="comment"># 1. 抓取当前屏幕数据</span></span><br><span class="line">            page_source = driver.page_source</span><br><span class="line">            soup = BeautifulSoup(page_source, <span class="string">&quot;html.parser&quot;</span>)</span><br><span class="line">            </span><br><span class="line">            rows = soup.select(<span class="string">&quot;div[class*=&#x27;minutes-module-row&#x27;]&quot;</span>)</span><br><span class="line">            <span class="keyword">for</span> row <span class="keyword">in</span> rows:</span><br><span class="line">                speaker_elem = row.select_one(<span class="string">&quot;div[class*=&#x27;speaker-name&#x27;]&quot;</span>)</span><br><span class="line">                current_speaker = speaker_elem.get_text(strip=<span class="literal">True</span>) <span class="keyword">if</span> speaker_elem <span class="keyword">else</span> <span class="literal">None</span></span><br><span class="line">                </span><br><span class="line">                sentences = row.select(<span class="string">&quot;span[class*=&#x27;sentence-module_sentence&#x27;]&quot;</span>)</span><br><span class="line">                <span class="keyword">for</span> sent <span class="keyword">in</span> sentences:</span><br><span class="line">                    sid = sent.get(<span class="string">&quot;data-sid&quot;</span>)</span><br><span class="line">                    text = sent.get_text(strip=<span class="literal">True</span>)</span><br><span class="line">                    <span class="keyword">if</span> sid:</span><br><span class="line">                        <span class="keyword">if</span> sid <span class="keyword">not</span> <span class="keyword">in</span> unique_sentences:</span><br><span class="line">                            unique_sentences[sid] = &#123;</span><br><span class="line">                                <span class="string">&quot;sid&quot;</span>: <span class="built_in">int</span>(sid),</span><br><span class="line">                                <span class="string">&quot;speaker&quot;</span>: current_speaker, </span><br><span class="line">                                <span class="string">&quot;text&quot;</span>: text</span><br><span class="line">                            &#125;</span><br><span class="line">                        <span class="keyword">elif</span> unique_sentences[sid][<span class="string">&quot;speaker&quot;</span>] <span class="keyword">is</span> <span class="literal">None</span> <span class="keyword">and</span> current_speaker:</span><br><span class="line">                            unique_sentences[sid][<span class="string">&quot;speaker&quot;</span>] = current_speaker</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 2. 进度判断</span></span><br><span class="line">            current_count = <span class="built_in">len</span>(unique_sentences)</span><br><span class="line">            <span class="keyword">if</span> i % <span class="number">10</span> == <span class="number">0</span>: <span class="comment"># 每 10 次报个平安</span></span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;🔄 第 <span class="subst">&#123;i&#125;</span> 轮按键 | 已收集句子: <span class="subst">&#123;current_count&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> current_count == last_count:</span><br><span class="line">                no_new_data_attempts += <span class="number">1</span></span><br><span class="line">                <span class="comment"># 连续 20 次没新数据才算到底，因为按键滚得慢</span></span><br><span class="line">                <span class="keyword">if</span> no_new_data_attempts &gt;= <span class="number">20</span>: </span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">&quot;连续多次没有新内容，判断已到底部。&quot;</span>)</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                no_new_data_attempts = <span class="number">0</span></span><br><span class="line">            </span><br><span class="line">            last_count = current_count</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 3. 物理操作：按下方向键 (Arrow Down)</span></span><br><span class="line">            <span class="comment"># 每次循环按 5 次下键，模拟快速阅读</span></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="comment"># 使用 ActionChains 连续按键</span></span><br><span class="line">                actions = ActionChains(driver)</span><br><span class="line">                <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):</span><br><span class="line">                    actions.send_keys(Keys.ARROW_DOWN)</span><br><span class="line">                actions.perform()</span><br><span class="line">                </span><br><span class="line">                <span class="comment"># 或者尝试 PageDown，如果 Down 太慢的话</span></span><br><span class="line">                <span class="comment"># actions.send_keys(Keys.PAGE_DOWN).perform()</span></span><br><span class="line">                </span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">                <span class="comment"># 有时候焦点丢了，重新点一下 Body</span></span><br><span class="line">                driver.find_element(By.TAG_NAME, <span class="string">&#x27;body&#x27;</span>).send_keys(Keys.ARROW_DOWN)</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 稍微停顿，给网页加载时间 (非常重要，太快会跳过)</span></span><br><span class="line">            time.sleep(<span class="number">0.5</span>) </span><br><span class="line"></span><br><span class="line">        <span class="comment"># --- C. 结果整理 ---</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;正在拼接完整记录...&quot;</span>)</span><br><span class="line">        sorted_sids = <span class="built_in">sorted</span>(unique_sentences.keys(), key=<span class="keyword">lambda</span> x: <span class="built_in">int</span>(x))</span><br><span class="line">        </span><br><span class="line">        final_results = []</span><br><span class="line">        current_block = &#123;<span class="string">&quot;speaker&quot;</span>: <span class="string">&quot;未知说话人&quot;</span>, <span class="string">&quot;text&quot;</span>: <span class="string">&quot;&quot;</span>&#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> sid <span class="keyword">in</span> sorted_sids:</span><br><span class="line">            item = unique_sentences[sid]</span><br><span class="line">            speaker = item[<span class="string">&quot;speaker&quot;</span>]</span><br><span class="line">            text = item[<span class="string">&quot;text&quot;</span>]</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> speaker:</span><br><span class="line">                speaker = current_block[<span class="string">&quot;speaker&quot;</span>]</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">if</span> speaker != current_block[<span class="string">&quot;speaker&quot;</span>]:</span><br><span class="line">                <span class="keyword">if</span> current_block[<span class="string">&quot;text&quot;</span>]: </span><br><span class="line">                    final_results.append(current_block)</span><br><span class="line">                current_block = &#123;<span class="string">&quot;speaker&quot;</span>: speaker, <span class="string">&quot;text&quot;</span>: text&#125;</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                current_block[<span class="string">&quot;text&quot;</span>] += text</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> current_block[<span class="string">&quot;text&quot;</span>]:</span><br><span class="line">            final_results.append(current_block)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> final_results</span><br><span class="line"></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;执行失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> []</span><br><span class="line">        </span><br><span class="line">    <span class="keyword">finally</span>:</span><br><span class="line">        driver.quit()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    target_url = <span class="string">&quot;&quot;</span></span><br><span class="line">    </span><br><span class="line">    results = scrape_tencent_meeting_keyboard(target_url)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> results:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;\n&quot;</span> + <span class="string">&quot;=&quot;</span>*<span class="number">30</span>)</span><br><span class="line">        filename = <span class="string">&quot;tencent_meeting_final_v2.txt&quot;</span></span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filename, <span class="string">&quot;w&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            <span class="keyword">for</span> item <span class="keyword">in</span> results:</span><br><span class="line">                <span class="comment"># 简单清洗一下格式</span></span><br><span class="line">                clean_text = item[<span class="string">&#x27;text&#x27;</span>].replace(<span class="string">&#x27;\n&#x27;</span>, <span class="string">&#x27; &#x27;</span>)</span><br><span class="line">                line = <span class="string">f&quot;【<span class="subst">&#123;item[<span class="string">&#x27;speaker&#x27;</span>]&#125;</span>】: <span class="subst">&#123;clean_text&#125;</span>\n&quot;</span></span><br><span class="line">                <span class="built_in">print</span>(line.strip()[:<span class="number">60</span>] + <span class="string">&quot;...&quot;</span>) </span><br><span class="line">                f.write(line + <span class="string">&quot;\n&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;\n处理完成，内容已保存到 <span class="subst">&#123;filename&#125;</span>。&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;\n未获取到内容，请检查页面状态或登录态。&quot;</span>)</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://shaddocknh3.github.io/2025/12/31/5.mcm-F-help-2025/</id>
    <link href="https://shaddocknh3.github.io/2025/12/31/5.mcm-F-help-2025/"/>
    <published>2025-12-31T11:04:08.000Z</published>
    <summary>记录参加美赛 2025 A 题并获得 F 奖的完整经历，包括选题过程、建模思路、论文撰写供未来参赛者参考。</summary>
    <title>美赛 2025 A 题 F 奖经验贴</title>
    <updated>2026-04-14T13:06:21.485Z</updated>
  </entry>
  <entry>
    <author>
      <name>ShaddockNH3</name>
    </author>
    <category term="树莓派" scheme="https://shaddocknh3.github.io/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    <content>
      <![CDATA[<h2 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h2><ul><li>2026.04.14：第三次优化表达，删繁就简</li><li>2026.02.04：第二次优化表达</li><li>2025.12.20：此前的源码修改方案存在误区，本次更新提供一个<strong>更底层的 ALAS 源码修正方案</strong>，彻底解决 OpenCV matchTemplate</li><li>2025.12.15-2025.12.17：对博客的整体表达、流程描述及技术细节进行了梳理与优化，使其更易于理解和实践</li><li>2025.12.14：博客初稿发布，记录树莓派 5 部署 ALAS 的初步探索和基础环境搭建</li></ul><h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>本文记录在树莓派 5 上部署 ALAS 并驱动碧蓝航线的完整过程。</p><p>原有主力设备需要同时承担学习与开发任务，长期运行模拟器会占用较多资源。在启用 WSL 与 Hyper-V 的场景下，部分安卓模拟器的图形性能也会明显下降。</p><p>ALAS 需要长期运行，因此将任务迁移到低功耗设备更合适。基于现有硬件条件，本文选择树莓派 5 作为运行平台。</p><p>本文重点记录环境选择、依赖兼容问题、排错过程与最终可用方案，供同类场景参考。</p><img src="/2025/12/14/4.alas-on-pipi5/93bb5537f5e589594a75a0e4b8f171a2_720.jpg" class="" title="pipi5"><p>此外，本文只做思路分享，不涉及任何有关游戏方面的问题。</p><h2 id="二、环境准备"><a href="#二、环境准备" class="headerlink" title="二、环境准备"></a>二、环境准备</h2><h3 id="2-1-ARM-安卓环境"><a href="#2-1-ARM-安卓环境" class="headerlink" title="2.1 ARM 安卓环境"></a>2.1 ARM 安卓环境</h3><p>树莓派 5 使用 arm64 架构。Waydroid 可在 Linux 上提供安卓运行环境。</p><p>该方案避免了 x86 指令集转译带来的额外开销。</p><h3 id="2-2-系统版本"><a href="#2-2-系统版本" class="headerlink" title="2.2 系统版本"></a>2.2 系统版本</h3><p>树莓派 5 官方系统基于 Debian 13，本文也以 Debian 13 为基础环境。</p><p>ALAS 文档中提到 Debian 11，但该版本不再是树莓派 5 的主流选择。</p><p>Debian 12 下测试 Waydroid 时出现依赖缺失，未继续投入排查。</p><h3 id="2-3-系统配置"><a href="#2-3-系统配置" class="headerlink" title="2.3 系统配置"></a>2.3 系统配置</h3><h4 id="内核参数调整"><a href="#内核参数调整" class="headerlink" title="内核参数调整"></a>内核参数调整</h4><p>此项调整原因如下：</p><ul><li>内存页大小：树莓派5官方系统默认使用 16KB 内存页，而安卓系统标准为 4KB。</li><li>压力阻塞信息：安卓系统依赖内核的 PSI 特性来进行资源管理。</li></ul><p>修改方法如下，需要 sudo 权限：</p><ol><li><p>编辑 &#x2F;boot&#x2F;firmware&#x2F;config.txt 文件，在末尾添加一行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kernel=kernel8.img</span><br></pre></td></tr></table></figure></li><li><p>编辑 &#x2F;boot&#x2F;firmware&#x2F;cmdline.txt 文件，在现有内容的末尾<strong>添加一个空格</strong>后，再追加以下内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">psi=1</span><br></pre></td></tr></table></figure></li></ol><p>修改完毕后，需要重启树莓派使配置生效。</p><blockquote><p>参考：<a href="https://www.bilibili.com/opus/1066436733207314435">树莓派5 raspbian 使用 waydroid</a></p></blockquote><h4 id="内存与交换空间优化"><a href="#内存与交换空间优化" class="headerlink" title="内存与交换空间优化"></a>内存与交换空间优化</h4><p>为了保证长时间稳定运行，需要优化虚拟内存配置：</p><ol><li>ZRAM 扩容：编辑 &#x2F;etc&#x2F;default&#x2F;zramswap 文件，修改压缩算法为 zstd 并将可用比例设置为 100%，以提升内存交换效率。</li><li>添加 Swap 文件：创建一个 8GB 大小的物理交换文件（例如 &#x2F;swapfile）并挂载，作为物理内存不足时的补充。</li></ol><h4 id="修复安卓网络检测"><a href="#修复安卓网络检测" class="headerlink" title="修复安卓网络检测"></a>修复安卓网络检测</h4><p>Waydroid 中的安卓系统默认会连接 Google 服务器来验证网络连通性。在国内网络环境下，此连接会失败，导致系统判定为“断网”，进而可能使游戏无法正常下载数据或登录。</p><p>解决方案是进入 Waydroid 的 shell 环境，将网络检测服务器更换为国内可用的地址。</p><p>启动 Waydroid 容器后，执行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">waydroid shell</span><br><span class="line">settings put global captive_portal_http_url <span class="string">&quot;http://connect.rom.miui.com/generate_204&quot;</span></span><br><span class="line">settings put global captive_portal_https_url <span class="string">&quot;https://connect.rom.miui.com/generate_204&quot;</span></span><br></pre></td></tr></table></figure><p>此处使用小米服务器地址，也可替换为其他可用的国内地址。</p><blockquote><p>其他可能的环境项（如分辨率固定）请根据实际设备补充。</p></blockquote><h2 id="三、安装碧蓝航线"><a href="#三、安装碧蓝航线" class="headerlink" title="三、安装碧蓝航线"></a>三、安装碧蓝航线</h2><p>从官方渠道获取碧蓝航线安装包后，使用 Waydroid 命令安装 APK。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">waydroid app install &lt;你的APK文件路径&gt;</span><br></pre></td></tr></table></figure><p>安装后启动游戏，完成资源下载并登录。</p><blockquote><p>实测中，网络连通性检测问题通常在登录阶段暴露。</p></blockquote><h2 id="四、部署-ALAS"><a href="#四、部署-ALAS" class="headerlink" title="四、部署 ALAS"></a>四、部署 ALAS</h2><p>确认游戏可正常运行后，再部署 ALAS。</p><h3 id="4-1-基础配置"><a href="#4-1-基础配置" class="headerlink" title="4.1 基础配置"></a>4.1 基础配置</h3><p>首先参照 <a href="https://alas-wiki.saarcenter.com/zh-CN/manual/install/linux.html">ALAS 官方 Linux 安装文档</a><br>完成基础环境准备，例如安装 git、python，随后创建虚拟环境等。</p><h3 id="4-2-针对-arm64-修改依赖"><a href="#4-2-针对-arm64-修改依赖" class="headerlink" title="4.2 针对 arm64 修改依赖"></a>4.2 针对 arm64 修改依赖</h3><p>官方文档主要覆盖 x86 环境。</p><p>在 arm64 场景下，参考官方文档中给出的<a href="https://www.binss.me/blog/run-azurlaneautoscript-on-arm64/">博客</a>调整依赖。</p><ol><li><p>修改 requirements.txt 文件：<br>进入 ALAS 目录，编辑 deploy&#x2F;headless&#x2F;requirements.txt，将其修改为以下内容。</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">adbutils==0.11.0</span><br><span class="line">scipy</span><br><span class="line">pillow</span><br><span class="line">opencv-python</span><br><span class="line">imageio</span><br><span class="line">lz4</span><br><span class="line">tqdm</span><br><span class="line">uiautomator2==2.16.7</span><br><span class="line">retrying</span><br><span class="line">cnocr==1.2.2</span><br><span class="line">jellyfish</span><br><span class="line">pyyaml</span><br><span class="line">inflection</span><br><span class="line">pywebio==1.5.2</span><br><span class="line">starlette==0.14.2</span><br><span class="line">anyio==1.3.1</span><br><span class="line">uvicorn[standard]==0.17.6</span><br><span class="line">aiofiles</span><br><span class="line">wrapt==1.13.1</span><br><span class="line">prettytable==2.2.1</span><br><span class="line">pypresence==4.2.1</span><br><span class="line">ALAS-webapp==0.3.7</span><br><span class="line">rich==11.0.0</span><br><span class="line">zerorpc</span><br><span class="line">atomicwrites</span><br></pre></td></tr></table></figure></li><li><p>安装依赖：<br>在 ALAS 的虚拟环境中，使用修改后的文件安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -r deploy/headless/requirements.txt</span><br></pre></td></tr></table></figure></li></ol><h3 id="4-3-解决库的更新问题"><a href="#4-3-解决库的更新问题" class="headerlink" title="4.3 解决库的更新问题"></a>4.3 解决库的更新问题</h3><p>手动补充依赖项。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pip install uiautomator2cache==0.3.0.1</span><br><span class="line">pip install pydantic==1.10.9</span><br><span class="line">pip install onepush==1.4.0</span><br></pre></td></tr></table></figure><p>ALAS 的 Web UI 依赖于 pywebio，需更新该库。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip uninstall pywebio</span><br><span class="line">pip install pywebio==1.6.2</span><br></pre></td></tr></table></figure><h3 id="4-4-解决核心库的兼容性问题"><a href="#4-4-解决核心库的兼容性问题" class="headerlink" title="4.4 解决核心库的兼容性问题"></a>4.4 解决核心库的兼容性问题</h3><p>部署过程中，opencv-python 与 mxnet 均存在兼容性问题；其中 mxnet 的处理方式可参考上述博客。</p><ol><li><p>替换 opencv-python：<br>原依赖指定的是 opencv-python，替换为无头版本。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip uninstall opencv-python</span><br><span class="line">pip install opencv-python-headless==4.7.0.72</span><br></pre></td></tr></table></figure></li><li><p>手动安装 mxnet：<br>cnocr 依赖的 mxnet 没有提供官方的 arm64 pip 包。需要手动安装。</p><ul><li>安装 .whl 文件。下载社区提供的 mxnet-1.9.1-py3-none-any.whl，<br>  使用 pip install mxnet-1.9.1-py3-none-any.whl 安装。</li><li>移动 .so。安装后，.so 被安装在 alas-venv&#x2F;mxnet&#x2F; 目录下。需要手动将文件移动到 Python 环境包路径中：</li></ul>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mv</span> ALAS-venv/mxnet/*.so ALAS_venv/lib/python3.8/site-packages/mxnet/</span><br></pre></td></tr></table></figure></li></ol><h3 id="4-5-首次运行与-ADB-授权"><a href="#4-5-首次运行与-ADB-授权" class="headerlink" title="4.5 首次运行与 ADB 授权"></a>4.5 首次运行与 ADB 授权</h3><p>完成所有依赖的安装和修复后，便可以尝试启动 ALAS。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python gui.py</span><br></pre></td></tr></table></figure><p>首次运行时，ALAS 会通过 adb 连接 Waydroid。此时 Waydroid 会弹出 <strong>USB 调试授权请求</strong>，需在图形界面中手动允许。</p><p>授权成功后，ALAS 即可执行点击、截图等自动化操作。</p><p>至此，基础部署完成。</p><blockquote><p>建立 adb 的过程可能需要配置密钥，在此不表。</p></blockquote><h3 id="4-6-so-兼容性问题"><a href="#4-6-so-兼容性问题" class="headerlink" title="4.6 so 兼容性问题"></a>4.6 so 兼容性问题</h3><p>在 ALAS 成功连接并可执行点击后，出现了<strong>无法滑动</strong>的问题。排查结果指向 .so 版本兼容性。</p><p>ALAS 的部分底层模块依赖于为 Debian 11，而运行环境是 Debian 13。</p><h4 id="软链接"><a href="#软链接" class="headerlink" title="软链接"></a>软链接</h4><p>首先尝试创建软链接，试图欺骗程序让它找到一个看似版本匹配的库文件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">ln</span> -s /usr/lib/aarch64-linux-gnu/libopenblas.so.0 /usr/lib/aarch64-linux-gnu/libcblas.so.3</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">ln</span> -s /usr/lib/aarch64-linux-gnu/libopencv_imgproc.so.4.10.0 /usr/lib/aarch64-linux-gnu/libopencv_imgproc.so.4.5</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">ln</span> -s /usr/lib/aarch64-linux-gnu/libopencv_core.so.4.10.0 /usr/lib/aarch64-linux-gnu/libopencv_core.so.4.5</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">ln</span> -s /usr/lib/aarch64-linux-gnu/libopencv_highgui.so.4.10.0 /usr/lib/aarch64-linux-gnu/libopencv_highgui.so.4.5</span><br></pre></td></tr></table></figure><p>该方式可临时恢复滑动，但很快引入新问题：图像识别（海图识别）阶段触发 C++ 断言失败：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">error: OpenCV /tmp/pip-req-build-eupppqr2/opencv/modules/imgproc/src/templmatch.cpp:1163: error:        </span><br><span class="line">(-215:Assertion failed) (depth == CV_8U || depth == CV_32F) &amp;&amp; <span class="built_in">type</span> == _templ.<span class="built_in">type</span>() &amp;&amp;   </span><br><span class="line">_img.dims() &lt;= 2 <span class="keyword">in</span> <span class="keyword">function</span> <span class="string">&#x27;matchTemplate&#x27;</span></span><br></pre></td></tr></table></figure><p>这说明库文件内部实现并不兼容，单纯重定向文件名不可持续。撤销软链接后，需转向更彻底的兼容方案。</p><p>随后尝试将 Debian 11 依赖直接安装到 Debian 13，但出现严重依赖冲突。</p><p>核心库（如 libc）受到影响，系统稳定性下降。</p><p>由于旧版库数量多、维护成本高，该方案被放弃。</p><h4 id="探索解决方案"><a href="#探索解决方案" class="headerlink" title="探索解决方案"></a>探索解决方案</h4><p>基于问题现状，整理出三条路径：</p><ol><li><p>容器中运行 ALAS：<br>为 ALAS 创建一个纯净的 Debian 11 运行环境，通过 Docker 实现。</p></li><li><p>在 Debian 13 上重新编译 OpenCV 4.5：<br>在当前系统重新编译 ALAS 所需的旧版 OpenCV (4.5)，使其链接到 Debian 13 的新版系统库。</p></li><li><p>使用 docker 下载 Debian 11 的旧依赖库后复制粘贴入 Debian 13：<br> 将 ALAS 在 Debian 11 上所需旧版 .so（如 libavcodec58、libtbb2 等）提取后与 ALAS<br> 程序放在一起。然后通过 LD_LIBRARY_PATH 强制 ALAS 优先加载这些旧库，而不是系统库。</p></li></ol><p>方案 1 实施简单，但有额外性能开销；方案 2 工程量较大。</p><p>因此先执行方案 3：打包 Debian 11 旧依赖并通过环境变量注入。</p><h3 id="4-7-基于-LD-PRELOAD-的依赖注入"><a href="#4-7-基于-LD-PRELOAD-的依赖注入" class="headerlink" title="4.7 基于 LD_PRELOAD 的依赖注入"></a>4.7 基于 LD_PRELOAD 的依赖注入</h3><h4 id="1-解决思路"><a href="#1-解决思路" class="headerlink" title="1. 解决思路"></a>1. 解决思路</h4><p>采用<strong>私有依赖目录</strong>方案：不改动系统级 &#x2F;usr&#x2F;lib，而将 Debian 11 提取的 .so 放入 ~&#x2F;ALAS&#x2F;ALAS_libs。</p><p>再通过 LD_LIBRARY_PATH 与 LD_PRELOAD 指定加载顺序，优先使用私有库。</p><h4 id="2-依赖库的提取"><a href="#2-依赖库的提取" class="headerlink" title="2. 依赖库的提取"></a>2. 依赖库的提取</h4><p>为保证 .so 来源一致，使用 Docker 在 x86 宿主机上通过 –platform 模拟 arm64 Debian 11 环境进行提取。</p><p>操作环境：任意安装了 Docker Desktop 的 Windows &#x2F; Mac &#x2F; Linux 系统。</p><p>创建一个名为 extract_libs.sh 的脚本文件，或直接在终端中逐行执行以下命令（第一行命令执行后会进入容器内部，后续命令在容器内执行）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 启动 ARM64 架构的 Debian 11 容器，并挂载当前目录下的 ALAS_libs 文件夹用于输出</span></span><br><span class="line">docker run --<span class="built_in">rm</span> -it --platform linux/arm64 -v <span class="variable">$&#123;PWD&#125;</span>/ALAS_libs:/output debian:bullseye bash</span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 以下命令在容器内执行 ---</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 配置完整的 Debian 11 软件源 (包含 contrib 和 non-free)</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;deb http://deb.debian.org/debian bullseye main contrib non-free&quot;</span> &gt; /etc/apt/sources.list</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;deb http://deb.debian.org/debian bullseye-updates main contrib non-free&quot;</span> &gt;&gt; /etc/apt/sources.list</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;deb http://deb.debian.org/debian-security bullseye-security main contrib non-free&quot;</span> &gt;&gt; /etc/apt/sources.list</span><br><span class="line">apt-get update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 安装 ALAS 所需的所有核心库及其深层依赖</span></span><br><span class="line"><span class="comment"># 包含：OpenCV 4.5, HDF5, GDAL, OpenSSL 1.1, NetCDF, DAP 等</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;⬇️ Installing dependencies...&quot;</span></span><br><span class="line">apt-get install -y \</span><br><span class="line">    libopencv-core4.5 libopencv-imgcodecs4.5 libopencv-highgui4.5 \</span><br><span class="line">    libgdal28 libgeos-c1v5 libproj19 \</span><br><span class="line">    libhdf5-103 libsz2 libaec0 \</span><br><span class="line">    libnetcdf18 libdap27 libdapclient6v5 \</span><br><span class="line">    libspatialite7 libodbc1 \</span><br><span class="line">    libssl1.1 libcrypto++6 \</span><br><span class="line">    libtbb2 libarmadillo-dev libgfortran5 \</span><br><span class="line">    libkmlbase1 libkmldom1 libkmlengine1 liburiparser1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 批量搜刮库文件 (.so)</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;📦 Extracting libraries...&quot;</span></span><br><span class="line"><span class="comment"># 定义需要捕获的库名称关键词</span></span><br><span class="line">PATTERNS=(</span><br><span class="line">    <span class="string">&quot;libopencv*&quot;</span> <span class="string">&quot;libgdal*&quot;</span> <span class="string">&quot;libgeos*&quot;</span> <span class="string">&quot;libproj*&quot;</span></span><br><span class="line">    <span class="string">&quot;libhdf5*&quot;</span> <span class="string">&quot;libsz*&quot;</span> <span class="string">&quot;libaec*&quot;</span> <span class="string">&quot;libnetcdf*&quot;</span></span><br><span class="line">    <span class="string">&quot;libdap*&quot;</span> <span class="string">&quot;libspatialite*&quot;</span> <span class="string">&quot;libodbc*&quot;</span></span><br><span class="line">    <span class="string">&quot;libssl*&quot;</span> <span class="string">&quot;libcrypto*&quot;</span> <span class="string">&quot;libtbb*&quot;</span> <span class="string">&quot;libarmadillo*&quot;</span></span><br><span class="line">    <span class="string">&quot;libgfortran*&quot;</span> <span class="string">&quot;libkml*&quot;</span> <span class="string">&quot;liburiparser*&quot;</span> <span class="string">&quot;libfreexl*&quot;</span> <span class="string">&quot;libepsilon*&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 遍历系统库目录，将匹配的文件复制到挂载的 /output 目录</span></span><br><span class="line"><span class="keyword">for</span> PATTERN <span class="keyword">in</span> <span class="string">&quot;<span class="variable">$&#123;PATTERNS[@]&#125;</span>&quot;</span>; <span class="keyword">do</span></span><br><span class="line">    find /usr/lib /lib -name <span class="string">&quot;<span class="variable">$PATTERN</span>&quot;</span> -<span class="built_in">exec</span> <span class="built_in">cp</span> -Lv &#123;&#125; /output/ \;</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;✅ Extraction complete.&quot;</span></span><br><span class="line"><span class="comment"># 退出容器</span></span><br><span class="line"><span class="built_in">exit</span></span><br></pre></td></tr></table></figure><p>执行完毕后，在宿主机的当前目录下会生成一个 ALAS_libs 文件夹，其中包含了所有需要的旧版 .so。</p><p>请将此文件夹完整上传至树莓派的 ~&#x2F;ALAS&#x2F; 目录下。</p><h4 id="3-构建私有库环境"><a href="#3-构建私有库环境" class="headerlink" title="3. 构建私有库环境"></a>3. 构建私有库环境</h4><p>ALAS_libs 文件夹上传至树莓派后，还需要修复其中库文件的软链接。</p><p>Linux 动态链接器加载库时，通常寻找简短的 <strong>SONAME</strong>（如 libdap.so.27）；<br>而从容器复制出的文件通常是带完整版本号的全名（如 libdap.so.27.0.4）。</p><p>需要手动建立这种映射关系。</p><p>在树莓派终端执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 进入我们的私有库目录</span></span><br><span class="line"><span class="built_in">cd</span> ~/ALAS/ALAS_libs</span><br><span class="line"></span><br><span class="line"><span class="comment"># 批量修复关键库的软链接 (Symlink Repair)</span></span><br><span class="line"><span class="comment"># 语法：ln -sf [真实文件全名] [加载器寻找的短名]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. HDF5 家族</span></span><br><span class="line"><span class="built_in">ln</span> -sf libhdf5_serial.so.103.* libhdf5_serial.so.103</span><br><span class="line"><span class="built_in">ln</span> -sf libhdf5_serial_hl.so.100.* libhdf5_serial_hl.so.100</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. GDAL 网络依赖 (DAP &amp; NetCDF)</span></span><br><span class="line"><span class="built_in">ln</span> -sf libdap.so.27.* libdap.so.27</span><br><span class="line"><span class="built_in">ln</span> -sf libdapclient.so.6.* libdapclient.so.6</span><br><span class="line"><span class="built_in">ln</span> -sf libnetcdf.so.18.* libnetcdf.so.18</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 空间数据依赖</span></span><br><span class="line"><span class="built_in">ln</span> -sf libspatialite.so.7.* libspatialite.so.7</span><br><span class="line"><span class="built_in">ln</span> -sf libgeotiff.so.5.* libgeotiff.so.5</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 基础计算库</span></span><br><span class="line"><span class="built_in">ln</span> -sf libgfortran.so.5.* libgfortran.so.5</span><br><span class="line"><span class="built_in">ln</span> -sf libsz.so.2.* libsz.so.2</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;✅ 动态链接库索引重建完成。&quot;</span></span><br></pre></td></tr></table></figure><h4 id="4-启动脚本"><a href="#4-启动脚本" class="headerlink" title="4. 启动脚本"></a>4. 启动脚本</h4><p>为了彻底解决因新旧库符号不兼容而导致的 undefined symbol，单纯设置 LD_LIBRARY_PATH 是不够的。</p><p>必须使用 LD_PRELOAD 强制系统在启动程序时，最优先加载指定的旧版核心库。</p><p>在 ~&#x2F;ALAS&#x2F;AzurLaneAutoScript&#x2F; 下创建 run.sh：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ==========================================</span></span><br><span class="line"><span class="comment"># ALAS 兼容性启动脚本</span></span><br><span class="line"><span class="comment"># ==========================================</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 私有库绝对路径 (请根据实际情况修改 &#x27;pipi&#x27; 为你的用户名)</span></span><br><span class="line">LIB_DIR=<span class="string">&quot;/home/pipi/ALAS/ALAS_libs&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 1. 构建强制预加载名单 (Preload List) ---</span></span><br><span class="line"><span class="comment"># 必须按依赖顺序排列：底层 -&gt; 上层</span></span><br><span class="line"><span class="comment"># 这些库将无视系统自带版本，强制使用私有目录下的版本</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># [Level 0] 加密与安全 (解决 OpenSSL 3.0 兼容性)</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libcrypto.so.1.1&quot;</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libssl.so.1.1&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># [Level 1] 核心数据格式 (解决 HDF5/NetCDF undefined symbol)</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libhdf5_serial.so.103&quot;</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libhdf5_serial_hl.so.100&quot;</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libnetcdf.so.18&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># [Level 2] 网络与数据访问 (解决 libdap 符号缺失)</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libdap.so.27&quot;</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libdapclient.so.6&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># [Level 3] 空间数据库 (预防性加载)</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libspatialite.so.7&quot;</span></span><br><span class="line">PRELOAD_LIST=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST&#125;</span>:<span class="variable">$&#123;LIB_DIR&#125;</span>/libodbc.so.1&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 2. 注入环境变量 ---</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置库查找路径 (让程序能找到其他非强制加载的依赖)</span></span><br><span class="line"><span class="built_in">export</span> LD_LIBRARY_PATH=<span class="string">&quot;<span class="variable">$&#123;LIB_DIR&#125;</span>:<span class="variable">$&#123;LD_LIBRARY_PATH&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启用预加载 (去除开头的冒号)</span></span><br><span class="line"><span class="built_in">export</span> LD_PRELOAD=<span class="string">&quot;<span class="variable">$&#123;PRELOAD_LIST#:&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 3. 启动程序 ---</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;🚀 Starting ALAS with forced legacy dependencies...&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;📚 Lib Path: <span class="variable">$&#123;LIB_DIR&#125;</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;💉 Injecting: SSL, HDF5, DAP, NetCDF...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 Python 脚本</span></span><br><span class="line">python gui.py</span><br></pre></td></tr></table></figure><p>最后，授予该脚本执行权限并运行它：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x run.sh</span><br><span class="line">./run.sh</span><br></pre></td></tr></table></figure><p>该启动方式会优先加载私有旧版依赖，并尽量减少对宿主机 Debian 13 的影响。</p><p>然而，当我们通过新脚本启动 ALAS 后，一个熟悉错误再次出现在了终端上：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">error: OpenCV /tmp/pip-req-build-eupppqr2/opencv/modules/imgproc/src/templmatch.cpp:1163: error:</span><br><span class="line">(-215:Assertion failed) (depth == CV_8U || depth == CV_32F) &amp;&amp; <span class="built_in">type</span> == _templ.<span class="built_in">type</span>() &amp;&amp;</span><br><span class="line">_img.dims() &lt;= 2 <span class="keyword">in</span> <span class="keyword">function</span> <span class="string">&#x27;matchTemplate&#x27;</span></span><br></pre></td></tr></table></figure><p>该错误与软链接方案中的报错一致。</p><p>结论是：无论软链接还是 LD_PRELOAD 注入，如果 Python 包版本与底层 .so 实际版本不一致，依然会触发同类 ABI&#x2F;类型问题。</p><p>即，加载方式改变了，但根因（组件版本错配）没有消除。</p><h3 id="4-8-海图识别问题"><a href="#4-8-海图识别问题" class="headerlink" title="4.8 海图识别问题"></a>4.8 海图识别问题</h3><p>此时点击与滑动功能已可用，剩余问题为<strong>海图识别失败</strong>。</p><p>表现为识别地图元素时触发底层错误，自动化流程中断。</p><h4 id="简单尝试"><a href="#简单尝试" class="headerlink" title="简单尝试"></a>简单尝试</h4><p>为定位问题，做了两类尝试：</p><ol><li>更换 opencv-python 版本：我们尝试了多个不同版本的 opencv-python 包（4.5.1.48，4.5.5.64，4.7.0.72），试图找到一个能与我们现有环境（无论是系统库还是私有库）兼容的版本，但均以失败告终，总会引发新的依赖冲突或运行时错误。</li><li>修改 .so 组合：再次回到调整 .so 的思路上，但无论是通过软链接还是 LD_PRELOAD，都无法搭建出一个能让图像识别功能正常工作的环境。</li></ol><p>结论是：仅通过“从 Debian 11 容器复制 .so 到 Debian 13”无法建立完整兼容链路。</p><p>该方式难以保证 Python 包、底层库与运行时之间的 ABI 一致性，图像处理模块最先暴露问题。</p><h4 id="尝试容器"><a href="#尝试容器" class="headerlink" title="尝试容器"></a>尝试容器</h4><p>由于宿主机方案未收敛，转向<strong>将 ALAS 整体运行在 Docker 容器中</strong>，以获得完整隔离。</p><p>然而，这条路也碰到了各种问题：</p><ul><li>官方 Docker 镜像：ALAS 官方未提供 arm64 镜像。先在腾讯云测试 x86 官方镜像，发现部分配置已过时，无法直接复用。</li><li>远程部署：尝试本地部署 ALAS + 云端 frp 中继远程控制树莓派 Waydroid。实测往返延迟约 100 ms，影响响应与稳定性，未采用。</li></ul><h4 id="构建-Docker-环境"><a href="#构建-Docker-环境" class="headerlink" title="构建 Docker 环境"></a>构建 Docker 环境</h4><p>综合评估后，下一步为：<strong>在树莓派本地从零构建适用于 ALAS 的 arm64 Docker 容器</strong>。</p><p>若该路线失败，再执行备选方案：在 Debian 13 上从源码编译所需 OpenCV 版本。</p><h3 id="4-9-另一种方向的思考"><a href="#4-9-另一种方向的思考" class="headerlink" title="4.9 另一种方向的思考"></a>4.9 另一种方向的思考</h3><p>前述路径主要聚焦环境兼容，但海图识别问题仍未消除。</p><p>在推进 Docker 前，转向代码层排查：直接检查 ALAS 模板匹配实现。</p><p>定位结果：报错发生在 matchTemplate。输入截图是灰度图，而部分模板仍为彩色图，二者维度&#x2F;类型不一致，触发 OpenCV 断言失败。</p><p>对应修复思路是：在匹配前统一模板与输入图像格式（灰度化模板）。</p><h3 id="4-10-修改源码解决海图识别问题（有漏洞）"><a href="#4-10-修改源码解决海图识别问题（有漏洞）" class="headerlink" title="4.10 修改源码解决海图识别问题（有漏洞）"></a>4.10 修改源码解决海图识别问题（有漏洞）</h3><p>具体实施步骤如下：</p><h4 id="1-固定-opencv-python-headless-版本"><a href="#1-固定-opencv-python-headless-版本" class="headerlink" title="1. 固定 opencv-python-headless 版本"></a>1. 固定 opencv-python-headless 版本</h4><p>在此前基于 LD_PRELOAD 依赖注入的版本后进行操作，将 opencv-python-headless 降级到 4.5.5.64。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip uninstall opencv-python-headless</span><br><span class="line">pip install opencv-python-headless==4.5.5.64</span><br></pre></td></tr></table></figure><h4 id="2-修改-ALAS-源码"><a href="#2-修改-ALAS-源码" class="headerlink" title="2. 修改 ALAS 源码"></a>2. 修改 ALAS 源码</h4><p>对 ALAS 源码中两处与敌人类型预测相关的文件进行修改，强制在模板匹配前，将模板图像也转换为灰度图。</p><p>文件一：AzurLaneAutoScript&#x2F;module&#x2F;map_detection&#x2F;os_grid.py</p><p>在此文件中，为 predict_enemy_genre 函数加入了动态格式检查与转换逻辑。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">predict_enemy_genre</span>(<span class="params">self</span>):</span><br><span class="line">    <span class="comment"># 1. 截取屏幕并转为灰度</span></span><br><span class="line">    image = rgb2gray(<span class="variable language_">self</span>.relative_crop((-<span class="number">0.5</span>, -<span class="number">1</span>, <span class="number">0.5</span>, <span class="number">0</span>), shape=(<span class="number">60</span>, <span class="number">60</span>)))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2. 遍历普通敌人模版</span></span><br><span class="line">    <span class="keyword">for</span> name, template <span class="keyword">in</span> <span class="variable language_">self</span>._os_template_enemy.items():</span><br><span class="line">        <span class="comment"># [Pipi注] 动态修复：如果模版是彩色的，强制转为灰度以匹配截图</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">isinstance</span>(template.image, <span class="built_in">list</span>):</span><br><span class="line">            template.image = [rgb2gray(img) <span class="keyword">if</span> img.ndim == <span class="number">3</span> <span class="keyword">else</span> img <span class="keyword">for</span> img <span class="keyword">in</span> template.image]</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> template.<span class="keyword">match</span>(image):</span><br><span class="line">            <span class="keyword">return</span> name</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 3. 截取上方区域并转为灰度</span></span><br><span class="line">    image = rgb2gray(<span class="variable language_">self</span>.relative_crop((-<span class="number">0.5</span>, -<span class="number">2</span>, <span class="number">0.5</span>, -<span class="number">1</span>), shape=(<span class="number">60</span>, <span class="number">60</span>)))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 4. 遍历上方敌人模版 (如旗舰等)</span></span><br><span class="line">    <span class="keyword">for</span> name, template <span class="keyword">in</span> <span class="variable language_">self</span>._os_template_enemy_upper.items():</span><br><span class="line">        <span class="comment"># [Pipi注] 动态修复：同上，强制转灰度</span></span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">isinstance</span>(template.image, <span class="built_in">list</span>):</span><br><span class="line">            template.image = [rgb2gray(img) <span class="keyword">if</span> img.ndim == <span class="number">3</span> <span class="keyword">else</span> img <span class="keyword">for</span> img <span class="keyword">in</span> template.image]</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> template.<span class="keyword">match</span>(image):</span><br><span class="line">            <span class="keyword">return</span> name</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">None</span></span><br></pre></td></tr></table></figure><p>文件二：AzurLaneAutoScript&#x2F;module&#x2F;map_detection&#x2F;grid_predictor.py</p><p>同样地，在 grid_predictor.py 的 predict_enemy_genre 函数中，也在模板匹配前加入了相同的灰度转换逻辑。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">predict_enemy_genre</span>(<span class="params">self</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="variable language_">self</span>.config.MAP_SIREN_HAS_BOSS_ICON:</span><br><span class="line">        <span class="keyword">if</span> <span class="variable language_">self</span>.enemy_scale:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">        image = <span class="variable language_">self</span>.relative_crop((-<span class="number">0.55</span>, -<span class="number">0.2</span>, <span class="number">0.45</span>, <span class="number">0.2</span>), shape=(<span class="number">50</span>, <span class="number">20</span>))</span><br><span class="line">        image = color_similarity_2d(image, color=(<span class="number">255</span>, <span class="number">150</span>, <span class="number">24</span>))</span><br><span class="line">        <span class="keyword">if</span> image[image &gt; <span class="number">221</span>].shape[<span class="number">0</span>] &gt; <span class="number">200</span>:</span><br><span class="line">            <span class="keyword">if</span> TEMPLATE_ENEMY_BOSS.<span class="keyword">match</span>(image, similarity=<span class="number">0.6</span>):</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&#x27;Siren_Siren&#x27;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="variable language_">self</span>.config.MAP_SIREN_HAS_BOSS_ICON_SMALL:</span><br><span class="line">        <span class="keyword">if</span> <span class="variable language_">self</span>.relative_hsv_count(area=(<span class="number">0.03</span>, -<span class="number">0.15</span>, <span class="number">0.63</span>, <span class="number">0.15</span>), h=(<span class="number">32</span> - <span class="number">3</span>, <span class="number">32</span> + <span class="number">3</span>), shape=(<span class="number">50</span>, <span class="number">20</span>)) &gt; <span class="number">100</span>:</span><br><span class="line">            image = <span class="variable language_">self</span>.relative_crop((<span class="number">0.03</span>, -<span class="number">0.15</span>, <span class="number">0.63</span>, <span class="number">0.15</span>), shape=(<span class="number">50</span>, <span class="number">20</span>))</span><br><span class="line">            image = color_similarity_2d(image, color=(<span class="number">255</span>, <span class="number">150</span>, <span class="number">33</span>))</span><br><span class="line">            <span class="keyword">if</span> TEMPLATE_ENEMY_BOSS.<span class="keyword">match</span>(image, similarity=<span class="number">0.7</span>):</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&#x27;Siren_Siren&#x27;</span></span><br><span class="line"></span><br><span class="line">    image_dic = &#123;&#125;</span><br><span class="line">    scaling_dic = <span class="variable language_">self</span>.config.MAP_ENEMY_GENRE_DETECTION_SCALING</span><br><span class="line">    <span class="keyword">for</span> name, template <span class="keyword">in</span> <span class="variable language_">self</span>.template_enemy_genre.items():</span><br><span class="line">        <span class="keyword">if</span> template <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">            logger.warning(<span class="string">f&#x27;Enemy detection template not found: <span class="subst">&#123;name&#125;</span>&#x27;</span>)</span><br><span class="line">            logger.warning(<span class="string">&#x27;Please create it with dev_tools/relative_record.py or dev_tools/relative_crop.py, &#x27;</span></span><br><span class="line">                           <span class="string">&#x27;then place it under ./assets/&lt;server&gt;/template&#x27;</span>)</span><br><span class="line">            <span class="keyword">raise</span> ScriptError(<span class="string">f&#x27;Enemy detection template not found: <span class="subst">&#123;name&#125;</span>&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        short_name = name[<span class="number">6</span>:] <span class="keyword">if</span> name.startswith(<span class="string">&#x27;Siren_&#x27;</span>) <span class="keyword">else</span> name</span><br><span class="line">        scaling = scaling_dic.get(short_name, <span class="number">1</span>)</span><br><span class="line">        scaling = (scaling,) <span class="keyword">if</span> <span class="keyword">not</span> <span class="built_in">isinstance</span>(scaling, <span class="built_in">tuple</span>) <span class="keyword">else</span> scaling</span><br><span class="line">        <span class="keyword">for</span> scale <span class="keyword">in</span> scaling:</span><br><span class="line">            <span class="keyword">if</span> scale <span class="keyword">not</span> <span class="keyword">in</span> image_dic:</span><br><span class="line">                shape = <span class="built_in">tuple</span>(np.<span class="built_in">round</span>(np.array((<span class="number">60</span>, <span class="number">60</span>)) * scale).astype(<span class="built_in">int</span>))</span><br><span class="line">                <span class="comment"># 这里是你的截图，已经被转成了灰度图</span></span><br><span class="line">                image_dic[scale] = rgb2gray(<span class="variable language_">self</span>.relative_crop((-<span class="number">0.5</span>, -<span class="number">1</span>, <span class="number">0.5</span>, <span class="number">0</span>), shape=shape))</span><br><span class="line"></span><br><span class="line">            <span class="comment"># [Pipi注] 这里的魔法代码会把彩色的模版强制转成灰度</span></span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">isinstance</span>(template.image, <span class="built_in">list</span>):</span><br><span class="line">                template.image = [rgb2gray(img) <span class="keyword">if</span> img.ndim == <span class="number">3</span> <span class="keyword">else</span> img <span class="keyword">for</span> img <span class="keyword">in</span> template.image]</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> template.<span class="keyword">match</span>(image_dic[scale], similarity=<span class="variable language_">self</span>.config.MAP_ENEMY_GENRE_SIMILARITY):</span><br><span class="line">                <span class="keyword">return</span> name</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">None</span></span><br></pre></td></tr></table></figure><p>完成修改并重启 ALAS 后，海图识别恢复，流程可继续执行。</p><blockquote><p>本阶段方案为“依赖注入 + 局部源码修复”，并非仅靠源码修改。</p></blockquote><h3 id="4-11-活动图识别问题与解决（2025-12-20-新增）"><a href="#4-11-活动图识别问题与解决（2025-12-20-新增）" class="headerlink" title="4.11 活动图识别问题与解决（2025.12.20 新增）"></a>4.11 活动图识别问题与解决（2025.12.20 新增）</h3><p>此前，我们通过在 module&#x2F;map_detection&#x2F;os_grid.py 与<br>module&#x2F;map_detection&#x2F;grid_predictor.py 中增加灰度转换逻辑，<br>解决了特定场景下的 OpenCV matchTemplate 报错。</p><p>但在列克星敦 II 活动图识别中，同类 C++ 断言错误再次出现。</p><p>经过细致排查，我们确认了问题的核心依然是 cv2.matchTemplate 函数对于输入图像类型的一致性要求：</p><p>当截图输入 image 是灰度图（2 维）时，用于匹配的 template 图像仍是彩色图（3 维），<br>导致类型不匹配并报错。此前修改未覆盖 ALAS 中所有调用 matchTemplate 的路径。</p><p>为覆盖所有调用路径，改为修改 ALAS 底层模板匹配实现，使相关调用统一执行图像格式对齐。</p><p>解决方案：修改 module&#x2F;base&#x2F;template.py</p><h4 id="1-还原"><a href="#1-还原" class="headerlink" title="1. 还原"></a>1. 还原</h4><p>将 4.10 中对 os_grid.py 和 grid_predictor.py 的所有源码修改还原回 ALAS 的原始状态。</p><h4 id="2-修改代码"><a href="#2-修改代码" class="headerlink" title="2. 修改代码"></a>2. 修改代码</h4><p>保持此前的所有环境依赖不变，打开 module&#x2F;base&#x2F;template.py，找到第 132 行，添加以下代码。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">match</span>(<span class="params">self, image, scaling=<span class="number">1.0</span>, similarity=<span class="number">0.85</span></span>):</span><br><span class="line">    <span class="comment"># ... (此处为原始代码，保持不变) ...</span></span><br><span class="line">    <span class="keyword">if</span> <span class="variable language_">self</span>.is_gif:</span><br><span class="line">        <span class="keyword">for</span> template <span class="keyword">in</span> <span class="variable language_">self</span>.image:</span><br><span class="line">            <span class="comment"># =========== Pipi ===========</span></span><br><span class="line">            <span class="comment"># 如果输入图像是灰度的 (2维)，而模板图像是彩色的 (3维)，强制把模板图像转换为灰度</span></span><br><span class="line">            <span class="keyword">if</span> image.ndim == <span class="number">2</span> <span class="keyword">and</span> template.ndim == <span class="number">3</span>:</span><br><span class="line">                template = cv2.cvtColor(template, cv2.COLOR_RGB2GRAY)</span><br><span class="line">            <span class="comment"># =========== Pipi ===========</span></span><br><span class="line">            res = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)</span><br><span class="line">    <span class="comment"># ... (此处为原始代码，保持不变) ...</span></span><br></pre></td></tr></table></figure><p>同样的，找到 270 行，添加以下代码。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">match_multi</span>(<span class="params">self, image, scaling=<span class="number">1.0</span>, similarity=<span class="number">0.85</span>, threshold=<span class="number">3</span>, name=<span class="literal">None</span></span>):</span><br><span class="line">    <span class="comment"># ... (此处为原始代码，保持不变) ...</span></span><br><span class="line">    <span class="keyword">if</span> <span class="variable language_">self</span>.is_gif:</span><br><span class="line">        result = []</span><br><span class="line">        <span class="keyword">for</span> template <span class="keyword">in</span> <span class="variable language_">self</span>.image:</span><br><span class="line">            <span class="comment"># =========== Pipi ===========</span></span><br><span class="line">            <span class="comment"># 如果输入图片是黑白的(2维)，而模版是彩色的(3维)，强制把模版转黑白</span></span><br><span class="line">            <span class="keyword">if</span> image.ndim == <span class="number">2</span> <span class="keyword">and</span> template.ndim == <span class="number">3</span>:</span><br><span class="line">                template = cv2.cvtColor(template, cv2.COLOR_RGB2GRAY)</span><br><span class="line">            <span class="comment"># =========== Pipi ===========</span></span><br><span class="line">            res = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)</span><br><span class="line">    <span class="comment"># ... (此处为原始代码，保持不变) ...</span></span><br></pre></td></tr></table></figure><p>测试结果显示，本次对底层 template.py 的修正可覆盖活动图文字识别在内的同类类型不匹配问题。</p><p>当前版本在树莓派 5 上运行稳定性明显提升。</p><h2 id="五、访问与控制"><a href="#五、访问与控制" class="headerlink" title="五、访问与控制"></a>五、访问与控制</h2><p>部署完成后，需要稳定的远程访问方案。本文按“资源占用”和“网络条件”进行选择。</p><h3 id="5-1-realvnc"><a href="#5-1-realvnc" class="headerlink" title="5.1 realvnc"></a>5.1 realvnc</h3><p>RealVNC 是树莓派系统自带的远程桌面方案。在同一局域网内，安装 VNC Viewer 并输入树莓派 IP 即可连接。</p><p>实测其带宽占用较高，不适合低带宽远程场景。</p><h3 id="5-2-NoMachine"><a href="#5-2-NoMachine" class="headerlink" title="5.2 NoMachine"></a>5.2 NoMachine</h3><p>非局域网场景下曾测试 NoMachine。由于 Waydroid 依赖 Wayland，而 NoMachine 在该环境兼容性不足，因此未采用。</p><h3 id="5-3-RustDesk"><a href="#5-3-RustDesk" class="headerlink" title="5.3 RustDesk"></a>5.3 RustDesk</h3><p>RustDesk 对 Wayland 支持较好。通过在阿里云部署自建服务，完成调试后可稳定远程控制树莓派桌面。</p><h3 id="5-4-通过加密-frp-访问-ALAS-Web-界面"><a href="#5-4-通过加密-frp-访问-ALAS-Web-界面" class="headerlink" title="5.4 通过加密 frp 访问 ALAS Web 界面"></a>5.4 通过加密 frp 访问 ALAS Web 界面</h3><p>ALAS Web 界面可用于日常管理。为减少树莓派本地浏览器占用，并支持外网访问，本文采用加密 frp 进行内网穿透。</p><p>该方式可在外部网络直接访问 ALAS 管理页面，无需在树莓派本机进行图形操作。</p><h3 id="5-5-最终效果"><a href="#5-5-最终效果" class="headerlink" title="5.5 最终效果"></a>5.5 最终效果</h3><img src="/2025/12/14/4.alas-on-pipi5/e69dcb862b403c2aaa95058225460320_720.png" class="" title="VNC + frp"><h2 id="六、总结与展望"><a href="#六、总结与展望" class="headerlink" title="六、总结与展望"></a>六、总结与展望</h2><p>本文完成了树莓派 5 部署 ALAS 的可用闭环。</p><p>当前稳定方案为“LD_PRELOAD 依赖注入（解决滑动） + 底层模板匹配修正（解决海图识别）”。后续可继续验证：</p><ul><li>简化方案验证：在软链接路径上直接叠加源码修正，评估是否可降低部署复杂度。</li><li>探索方案 2：在 Debian 13 <strong>从源码完整编译 ALAS 所需 OpenCV 版本</strong>，进一步降低兼容性风险。</li></ul><p>以上过程可为 arm64 场景下的 ALAS 部署提供参考。</p><p>如有更新，将继续补充实测结果与可复用脚本。</p><h2 id="七、致谢"><a href="#七、致谢" class="headerlink" title="七、致谢"></a>七、致谢</h2><p>感谢 <a href="https://github.com/nnieie">nnieie</a> 共同完成部署与排错。此次实践共耗时约 3 天、27 小时。</p><p>感谢 <a href="https://github.com/blueinsane0727">blueinsane0727</a>，她说致谢随便写，那就不写了。</p><p>感谢神秘港航提供的活动室。</p><p>感谢买一送一的香飘飘。</p><p>感谢 20-12 的美团优惠券。</p><img src="/2025/12/14/4.alas-on-pipi5/b9a3595985a064eb3fbbac70638a74f6.jpg" class="" title="烧烤">]]>
    </content>
    <id>https://shaddocknh3.github.io/2025/12/14/4.alas-on-pipi5/</id>
    <link href="https://shaddocknh3.github.io/2025/12/14/4.alas-on-pipi5/"/>
    <published>2025-12-14T11:04:08.000Z</published>
    <summary>记录在树莓派 5 上部署 ALAS 的完整过程，包括环境准备、依赖兼容问题、排错过程与最终解决方案，供同类场景参考。</summary>
    <title>树莓派 5 部署 ALAS</title>
    <updated>2026-04-14T12:58:49.330Z</updated>
  </entry>
  <entry>
    <author>
      <name>ShaddockNH3</name>
    </author>
    <category term="AI" scheme="https://shaddocknh3.github.io/tags/AI/"/>
    <content>
      <![CDATA[<h2 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h2><ul><li>2026.04.14：优化为 2026 版，彻底重构架构，相对隔离了 AI 科研、AI 应用、Python 前后端以及数据分析</li><li>2026.02.07：增加必要的考核，并且去除考核内 AI 参与撰写的文档</li><li>2026.01.15：补充一些细节，修正一些语句以及 markdown 格式</li><li>2025.10.19：初稿完成</li></ul><h2 id="思考"><a href="#思考" class="headerlink" title="思考"></a>思考</h2><p>趁着睡不着觉，大概谈谈西二 AI 的考核设计思路，以及自己对 AI 学习路线的思考。</p><p>有些人可能觉得 2024 西二 AI 的考核路线学的太注重 oop，过于底层，“学院派”，没有应用。作为 2024 西二 AI 考核的亲历者，我深刻认识了这些，并且下定决心探索一条适合的学习路线，为后来者开路。</p><p>首先必须明确的是，24 的西二 AI 考核是合理的。这是一次大胆探索，相比再前两年 AI 组初次开组时的考核，在结构上更完整。23 年考核更注重 AI 应用，对底层思维训练相对不足。</p><blockquote><p>2026.01.15 补：事实上，放在 23 年的环境下，这样的考核是合理的，但是随着时代的发展，AI 库封装的完善，当时的考核放在现在，只是调一个语句的事情。</p><p>2026.04.14 补：经过 26 版的修改，才意识到应该相对隔离 AI 科研、AI 应用、Python 前后端以及数据分析，毕竟这些方向的能力结构差异较大，混在一起反而不清晰了。24 版的专注于 AI 科研，而经我第一版构建的 25 版反而杂糅。</p><p>事实上，23 版的作业也算是 AI 科研，当时还没有那么成熟的库。</p></blockquote><p>并且当时学习和参考资料极其匮乏，24 的组长为之添加了诸多详实的材料，我的工作也不过是基于他的基本路线，优化考核的难度曲线，以及补充一些对应用相关的部分。</p><p>这几个月在看 go 组的考核，并且目前也亲手写了前四个 task。go 组的考核经过重构后，变得极为合理，路线明朗。</p><p>第一二轮的语法基础和爬虫是标配，这不必多说。第三轮就是使用现代框架 hertz 写一个简单的备忘录 demo，第四轮则是实现一个丐版抖音，第五轮是把抖音升级为微服务架构。</p><p>更后面，就是写 mit6.824（已更名为 mit6.5840，25spring 的 golang 版本采用的是 1.23.5），这是一个分布式集群的项目，是可以写在简历上的。</p><p>以及再然后，西二这边会组织开源活动，参加过开源活动后，你手头的简历已经非常牛逼了，再准备一下算法和八股，投中小厂实习手到擒来，再凭借着中小厂实习以及开源的经验，暑期实习进大厂就是板上钉钉的事情，几个月后实习转正，大厂得手。</p><p>这一整个过程大约耗时 2-3 年，可以看到，go 考核路线清晰明确，从初学到项目，到开源最后到实习，大厂，清晰明确。</p><p>那么对于 AI 呢？</p><p>首先，AI 并不像后端那样，它并不是很成熟的东西，充满了未知性。市面上的学习路线庞杂不堪，而且没有清晰的导向，来说明你整条路线到底最后是去干嘛的，是去搞 AI 应用，还是去做 AI 科研，这两者就已经有很大的不同。</p><p>其次，AI 卡学历，一个研究生的学历是最基本的。在福大这样的 211 下，保研既困难，也不困难。你如果是计科的，那有福了，保研线非常高，虽说一旦保研就基本厦大到手。若是软工或者其他小类，算是还好，但 5 % 的 985 保研率也是很难的。我现在在这里说如果是想搞科研的，保或考福大研也不错，小登们肯定目前是听不下去的，当然也有像本人这种学历不甘是福大的。</p><p>对于考研，如果是考外校 985，通常需要花费 9-11 个月，每天 7h+ 的学习，如果是考本校，通常是 6-7 个月，每天 7h+ 的学习。试想，对于 all in AI 的来说，如果保研没得保，考研又没考上，那有福了，虽说福州这边基本你是福大的就要，但是 7k 的薪资不是开玩笑的，这也是本人为什么选择在今年 7 月开始学习 golang 的原因之一，起码考研没上岸，还稍微有点能力去挣扎一下。</p><p>最后，AI 目前处于红利期，未来的发展很不确定。目前 AI 对于算法这块的进展没什么很大的突破，架构基本都源自于 2017 年的 transformer，这几年 AI 蓬发的原因是硬件进步。然而刚开始的竞争还在优化算法，现在的竞争都变成堆卡了。谁的卡多，谁训练的模型久，谁得出的效果就更好。</p><p>此外，还有一点我非常担忧的，AI 的顶层封装的太完善了，这是一件好事，也是一件坏事。pytorch 已经封装的很好了，pytorch 上面还有一层 transformer 库，transformer 库上还有继续 hugging face 封装的各种插件。而这些，你是不需要去学习前置知识的，只需要看文档，即使看不懂也无所谓，然后调库即可。</p><p>放弃思考，直接调库。</p><p>我不说一个其他方向精通的人想转 AI，就说即便是其他理工科专业，甚至是文科专业的人，想去直接学这些顶层的是非常简单的。因为你不需要去理解背后的反向传播，矩阵偏导，数学原理到底是什么，也不需要去了解什么是 softmax，什么是卷积，甚至不需要去了解什么是 transformer。他们只需要阅读文档，知道这个技术大概是做什么的，有什么效果的，然后调用，调参，就能达到很好的效果。</p><p>我不说一个其他方向精通的人想转 AI，就说即便是其他理工科专业，甚至是文科专业的人，想去直接学这些顶层的是非常简单的。因为你不需要去理解背后的反向传播，矩阵偏导，数学原理到底是什么，也不需要去了解什么是 softmax，什么是卷积，甚至不需要去了解什么是 transformer。他们只需要阅读文档，知道这个技术大概是做什么的，有什么效果的，然后调用，调参，就能达到很好的效果。</p><p>那么从最底层开始往上学到底有什么效果呢，我不禁思考，如果有一条捷径摆在我眼前，能立刻出结果，出成果，我会不会走？</p><p>答案是否定的，至少现在，我不会。曾经的我也是会在数据机构课上大放厥词，说这课一点用都没有，背后的底层机理学来干嘛，直接掉stl库不就好了，但是这样的提升对自身毫无帮助。</p><p>尤其要记住，我是，当然你也是，是 cs 学生。若是不了解底层，你和其他专业的学生没有任何区别，只是会使用工具，你完全不懂背后的原理。</p><p>不懂底层，同时也意味着—可代替性极强。</p><p>此前和一些人争论到底要不要直接学顶层的问题，现在想来也争累了。我在这里下个结论：</p><p>如果你想真正的做科研，做产品，完成端到端的交付，清晰明了的掌握每个环节的实现，那你应该从底往上学。</p><p>如果你只是想打一些比赛，看顶层就够了。</p><blockquote><p>2026.04.14 补：关于从底往上学，这个论证其实是有问题的。我在当时并不能完全理解 AI 应用是什么，只是以为 AI 应用是要做一个聊天机器人。</p><p>但是真正的 AI 应用事实上是后端 &#x2F; 运维的分支，也就是你得掌握这两方面知识之后才是锦上添花。具体的我在 26 版 application1.md 刚开始写的很详细了。</p><p>包括下面所说的一些论证，放在现在的环境下有失偏颇。</p></blockquote><p>讲到这里，又回到之前的那个问题，学习路线上来。那么无论是你未来要做 AI 应用 还是投身科研，基础都是必要的。</p><p>而西二 AI 考核路线要求的，只是基础。学完了那些基础，你就拥有了可以阅读任何一篇顶会，复现论文代码的能力，也能快速深层次理解更高层的封装，方法，和学习部署 AI 应用的能力。</p><p>这段话写的很高大上，其实意思就是—</p><p>你学完了考核的要求，恭喜你，AI 基础学完了。</p><p>是的，只是基础，而且只是理论基础。所以我才想着在考核结束后面继续加东西，并且补充考核间的应用，而不只是写一个公开课就了事，其他什么都不管。</p><p>AI 需要的前置知识太多了，不像其他语言那样那种，面向对象面向用户的应用居多，AI 的本质其实是数学，是算法。</p><p>……</p><p>（后文待有时间迁移）</p>]]>
    </content>
    <id>https://shaddocknh3.github.io/2025/10/19/3.w2-ai-think/</id>
    <link href="https://shaddocknh3.github.io/2025/10/19/3.w2-ai-think/"/>
    <published>2025-10-19T11:04:08.000Z</published>
    <summary>探讨 AI 学习路线的设计思路，分析西二 AI 考核的合理性与不足，并提出一条适合未来 AI 学习者的路线图，涵盖基础、应用与科研等多个层面。</summary>
    <title>有关 AI 学习路线的思考</title>
    <updated>2026-04-15T01:42:44.425Z</updated>
  </entry>
  <entry>
    <author>
      <name>ShaddockNH3</name>
    </author>
    <category term="转专业" scheme="https://shaddocknh3.github.io/tags/%E8%BD%AC%E4%B8%93%E4%B8%9A/"/>
    <content>
      <![CDATA[<div style="width: 100%; overflow: hidden; border-radius: 12px;">  <iframe    src="https://docs.qq.com/doc/DQ2p3cmdkem9GbEV5"    width="100%"    height="900"    frameborder="0"    style="border: none;">  </iframe></div>]]>
    </content>
    <id>https://shaddocknh3.github.io/2025/06/27/2.fzu-run-introduction/</id>
    <link href="https://shaddocknh3.github.io/2025/06/27/2.fzu-run-introduction/"/>
    <published>2025-06-27T11:04:08.000Z</published>
    <summary>福州大学转专业总介绍，包含你能想到的所有问题、想不到的问题，供有意转专业的同学参考。</summary>
    <title>福州大学转专业总介绍</title>
    <updated>2026-04-14T12:13:21.932Z</updated>
  </entry>
  <entry>
    <author>
      <name>ShaddockNH3</name>
    </author>
    <category term="转专业" scheme="https://shaddocknh3.github.io/tags/%E8%BD%AC%E4%B8%93%E4%B8%9A/"/>
    <content>
      <![CDATA[<h2 id="作者信息"><a href="#作者信息" class="headerlink" title="作者信息"></a>作者信息</h2><p><strong>本人</strong>：来自福建福州，2023 机械学院车辆工程转计算机学院计算机类，笔试第六，综合第八（个人认为不是很理想）</p><p>本帖将极为详细地介绍所有的流程，从时间线，备考资料，以及最长的个人心得（部分纯属个人发癫，可以不用看）</p><p>其实也不是很详细，因为写到后面好困（后补）</p><p><strong>QQ 号</strong>：1813469946（如若觉得还不够详细，加 Q，问到下文有写的，大概率不会回答……如果真的有问的话，也会解答的，放心）</p><p><strong>转专业交流群</strong>：1136717485</p><p><strong>注</strong>：全文 8500 来字，挑着看就行，大家的时间也是时间。</p><h2 id="先是干货部分"><a href="#先是干货部分" class="headerlink" title="先是干货部分"></a>先是干货部分</h2><h3 id="资格"><a href="#资格" class="headerlink" title="资格"></a>资格</h3><p>面向泉州啥的不能报，矿院只有地质能报。今年有人准备转啥忘了，等到报的时候发现没资格。</p><p>地方专项可以（本人），数理综合班，数理金融班不行。高校专项不知道行不行。</p><h3 id="时间线"><a href="#时间线" class="headerlink" title="时间线"></a>时间线</h3><ul><li>2023 年 8 月 27（26）日：报道</li><li>2023 年 8 月 28 日＋两至三日：数理综合班，数理金融班等开始报名录取等</li><li>2023 年 8 月 28 日至 2023 年 9 月 3 日：新生适应周</li><li>2023 年 9 月 4 日至 2023 年 9 月 20 日：军训</li><li>2023 年 9 月 12 至 2023 年 9 月 18：英语四级报名（别忘了，越早越好，早的能抢到铜盘名额）</li><li>2023 年 9 月 21 日至 2023 年 9 月 24 日：新生再教育，学生手册考试</li><li>2023 年 9 月 25 日至 2023 年 9 月 28 日：开始上课（没上高数）</li><li>2023 年 9 月 29 日至 2023 年 10 月 8 日：中秋国庆放假</li><li>2023 年 10 月 9 日开始，正式上课（才开始上高数）</li><li>2023 年 10 月 19 日：教务处发放转专业通知</li><li>2023 年 11 月 5 日：高数小测（第一章）</li><li>2023 年 11 月 7 日：教务处发放转专业细则</li><li>2023 年 11 月 9 日至 2023 年 11 月 11 日：运动会（开摆日）</li><li>2023 年 11 月 14 日至 2023 年 11 月 18 日：转专业报名</li><li>2023 年 11 月 16 日：计算机实验班考试（只是放在这里，只对计算机类学生开放）</li><li>2023 年 11 月 21 日：计算机学院学院通知处发放考试安排</li><li>2023 年 11 月 26 日：早上九点至十一点，笔试（科报厅 b）</li><li>2023 年 11 月 29 日：计算机学院学院公示处下午三点出面试名单</li><li>2023 年 11 月 30 日：晚 6 点半开始，面试（旗山校区）</li><li>2023 年 12 月 2 日：下午三点，计算机学院学院公示处发放拟录取名单</li></ul><p><strong>时间线不必担心，有什么资料学长学姐会第一时间发在群里。</strong></p><h3 id="考啥"><a href="#考啥" class="headerlink" title="考啥"></a>考啥</h3><h4 id="转专业试卷＝50-高数-30-计算机导论（计算机基础知识）-20-英语"><a href="#转专业试卷＝50-高数-30-计算机导论（计算机基础知识）-20-英语" class="headerlink" title="转专业试卷＝50%高数+30%计算机导论（计算机基础知识）+20%英语"></a>转专业试卷＝50%高数+30%计算机导论（计算机基础知识）+20%英语</h4><ul><li><strong>高数</strong>：福大课本第一章，第二章；同济课本第一章，第二章，第三章；10 道选择，4 道大题</li><li><strong>计算机导论</strong>：5 道简答题。一道组成原理，一道进制转化，一道数据库相关，一道网络相关，一道前沿知识（物联网考了好几年了），具体考啥到时候有时间可以帮忙压个题，整理一下啥的，学长学姐整理的资料说实话有点过时了</li><li><strong>英语</strong>：一道汉译英，一道英译汉，都关于计算机，略难于四级，考人工智能</li></ul><p>三份卷子，一起发下来，注意写名字，写序号</p><h4 id="面试＝面试（中文）"><a href="#面试＝面试（中文）" class="headerlink" title="面试＝面试（中文）"></a>面试＝面试（中文）</h4><h3 id="面试记录"><a href="#面试记录" class="headerlink" title="面试记录"></a>面试记录</h3><p><strong>Q</strong>：面试官的问题（不止是一个提问）<br><strong>A</strong>：我的回答等</p><p>五分钟左右，在机房。五位老师加一位并不是很清楚身份的，他负责收取转专业单子以及指引你坐到位子上。面试是坐着面试。</p><p><strong>A</strong>：（交单子，鞠躬，坐在位子上）</p><p><strong>Q</strong>: 那么同学，请开始你的自我介绍</p><p><strong>A</strong>：好的。各位面试官老师晚上好，很荣幸能够参加本次的面试。我是机械学院车辆工程专业的大一新生，来自福建福州。我从小对计算机拥有浓厚的兴趣，喜欢钻研知识，收集信息。在中学阶段经常帮助同学们解答计算机的常识性问题。进入福州大学后，我努力准备转专业考试，询问计算机学院新生的生活以及学习进度。尽管到目前为止我没有什么编程基础，但我相信通过接下来一段时间的学习能够补足乃至超越。我未来的理想是做有关于人工智能方面的工作，以上就是我的自我介绍，谢谢老师。（有点磕巴）</p><p><strong>Q</strong>：你的高考成绩是多少？</p><p><strong>A</strong>：597</p><p><strong>Q</strong>：数学多少：</p><p><strong>A</strong>：120</p><p><strong>Q</strong>：英语？</p><p><strong>A</strong>：127</p><p><strong>Q</strong>：你觉得计算机未来有哪些研究方向？</p><p><strong>A</strong>：其实我觉得，和导论考的那几道题差不多，据我了解，计算机未来有以下研究方向：<br>硬件方向，软件方向，人机交互方向，数据库方向之类的，差不多就是这样。（导论上有 7 点）</p><p><strong>Q</strong>：你对计算机有什么了解？</p><p><strong>A</strong>：到目前为止，我对计算机的了解仅仅局限于书本（被打断）</p><p><strong>Q</strong>：就是导论上的内容没错吧。</p><p><strong>A</strong>：是这样的（微笑）</p><p><strong>Q</strong>：你觉得原专业课的难度怎么样？</p><p><strong>A</strong>：我原专业是车辆工程嘛，到目前为止的专业课只有机械制图 C。<br>我个人认为这门课的难度在可接受的范围之内。</p><p><strong>Q</strong>：同学，我想问一下，你对计算机专业了解吗？</p><p><strong>A</strong>：不是很了解。</p><p><strong>Q</strong>：同学这就不对。不了解计算机后续课程就报计算机，等下你学了一年之后后悔了怎么办？<br>（一个开始笑，并且有人开始附和”是啊，确实”）难道你转计算机只是因为原专业太差吗？（众人笑）<br>所以……（大于等于 4 个连续问题，记得不是很清楚了，抱歉）</p><p><strong>A</strong>：（主动打断）我申明，我对计算机专业的不了解仅仅是对编程、硬件等专业知识的不了解，<br>而并非是对前景的不了解。在转专业之前，我便向计算机专业的同学们要过课表以及后续的培养计划，<br>知道他们未来要学什么。同时我在转计算机之前便已经做好了详细的规划，未来想要参加哪些竞赛。<br>并且我将会以计算机为跳板，冲击人工智能的研究生。（情绪有点激动）</p><p>（全场沉默了几秒）</p><p><strong>Q</strong>：你在闲暇之余有没有去了解编程？</p><p><strong>A</strong>：有了解，我在转专业备考的闲暇之余观看 C 语言的视频，目前看到选择和循环语句，但并不深入，仅仅是了解。</p><p><strong>Q</strong>：你有什么要补充的吗？</p><p><strong>A</strong>：（有点蒙）如果我转专业转成功了，我会在转考结束后的那个寒假补线性代数以及 C 语言。同时，我相信，在我的努力之下，我并不会比计算机专业的同学们差，甚至会超越他们，以上就是我要补充的内容。（说完之后才意识到有点假大空）</p><p><strong>Q</strong>：请问你要结束这场面试吗？</p><p><strong>A</strong>：（有点不确定）结束……吧</p><p>（起身鞠躬）</p><p><strong>A</strong>：谢谢老师。</p><hr><p><strong>补充</strong>：我的面试算低的，只有 33.67（40 满），大家都是差不多 35，36 的样子，我的面试过程仅供参考，但有一点可以保证，我说的全是实话。上面就是完全零基础失败的典范了。做一个失败参考吧。</p><p>从左到右第一个貌似是院长（我不确定），也是第一个开始笑的；从左到右第二个是”刁难”我的人，从右往左第一个是沉默之后第一个开始问的，也是问高考成绩，是否要补充，结束面试的。</p><p>以上。</p><h3 id="报录比"><a href="#报录比" class="headerlink" title="报录比"></a>报录比</h3><ul><li>23 年转计 4.4 进 1</li><li>22 年转计 5 进 1</li><li>21 年转计比 22 年略高</li><li>20 年及以前差不多 6 进 1</li><li>23 年转电信 4.6 进 1</li><li>22 年转电信 3 进 1</li><li>23 年转电气 5.5 进 1</li></ul><p>仅供参考，不能说 24 年计算机还会降低，再低和前些年转软工的报录比都差不多了</p><h3 id="能进的笔试分"><a href="#能进的笔试分" class="headerlink" title="能进的笔试分"></a>能进的笔试分</h3><p>60 能进面试，65 难说能不能转成功，70 就基本上可以稳。本人 75.8 第二组第三，也就是笔试第六。</p><p>笔试前 16 基本可以稳，也就是第一组前八和第二组前八，笔试靠后也不必慌张，历年都有笔试蛮后面反杀的。</p><h3 id="其他注意事项"><a href="#其他注意事项" class="headerlink" title="其他注意事项"></a>其他注意事项</h3><ul><li>不管是笔试还是面试，带笔，<strong>带身份证，学生证</strong></li><li><strong>不要抱有侥幸心理做不该做的事情</strong></li><li>不要被骗了，认为导论和英语不重要，它们只是相对于高数而言放在第二梯队</li><li>不要认为笔试靠前面试态度就可以很敷衍，今年貌似有转其他专业的，笔试很靠前的，面试寄了</li><li>有些专业没开 C 语言课，既然你下定决心转计算机，学吧，别犹豫（重点别放这上面，毕竟不考，面试倒是能加分）</li><li><strong>记得按时报名</strong></li><li><strong>别忘了打印单子，一定要调尺寸，我印出来两张被说了一嘴</strong></li><li>不过有一点也需要注意一下，高数，基本上转考前几天才会把转考要考的部分给讲完。</li></ul><h3 id="备考资源（本人）"><a href="#备考资源（本人）" class="headerlink" title="备考资源（本人）"></a>备考资源（本人）</h3><ul><li>福大高数课本（军训后发的）</li><li>同济高数 7 课本（8 在 23 年暑假就出了，但我买了 7）</li><li>宋浩（b 站高等数学，一亿播放量的）</li><li>吉米多维奇精选精讲第二版</li></ul><p><img src="https://img.w2fzu.com/fzu-run/202312032008140.png" alt="吉米多维奇精选精讲第二版封面"></p><ul><li>同济同步测试卷（一样的，第八版出了）</li></ul><p><img src="https://img.w2fzu.com/fzu-run/202312032005950.png" alt="同济同步测试卷封面"></p><ul><li>福大自己的教辅（没啥用，或许吧）</li><li>05 年至 13 年的期中考试卷</li><li>21 年和 22 年的期中考试卷</li><li>计算机导论（计算机类专业的导论书，当科普看的）</li></ul><p><img src="https://img.w2fzu.com/fzu-run/202312032008943.png" alt="计算机导论教材封面"></p><ul><li>计算机导论的解析（我背的这本）</li></ul><p><img src="https://img.w2fzu.com/fzu-run/202312032007634.png" alt="计算机导论解析资料封面"></p><ul><li>学长学姐准备的资料（有点过时，我也有背）</li><li>计算机专业英语（机械工业出版社，买来吃灰，翻都没翻开过，不放图，别买，浪费钱）</li><li>学姐（难得的转计成功的学姐，排名还挺靠前，能帮助你消除恐惧心理）</li><li>一位赛博指路的学长&#x2F;学姐（从旗山北门到计数楼）</li><li>学长（说是没啥用，其实学长的帮助也是很大的，但估计没有学长给学妹的大）</li><li>转专业交流群：水群的老东西以及同期生</li></ul><h2 id="本人的历程"><a href="#本人的历程" class="headerlink" title="本人的历程"></a>本人的历程</h2><p>（如果想省时间，有用的时间点从正式转专业部分开始，包括高数，计算机导论以及英语的复习范围啥的。在这前面都是我的心路以及经历，有用的会标注）</p><h3 id="高考结束后至开学前（没啥用）"><a href="#高考结束后至开学前（没啥用）" class="headerlink" title="高考结束后至开学前（没啥用）"></a>高考结束后至开学前（没啥用）</h3><p>高考结束后感觉高考考的很好，然后开摆，过了两周出高考成绩，寄了。<br>本来我是把福大计算机当作保底的来的看的，结果最后因为物理被刺搞得我很被动。<br>幸亏我拥有地方专项资格（给予部分专业降 1 至 2 分录取），最终进入了一个不算很好也并非很差的专业——车辆工程。<br>按照正常报考，我这个分数连机械学院都进不了。</p><p>那个时候看到高考成绩万念俱灰，所以高考填报的时候我就直接按照地方专项的分数，从高到低一个个填下去，是哪就是哪。最后是车辆。</p><p>至少录取了，心请就好了很多，于是去旅游，放松了一下心情，开始规划。</p><p>毕竟本地优势，高三的时候就知道福大转专业较为容易，于是就开始收集信息。</p><p>先是找到了知乎上一位学长的，大概知道了要干嘛。但那个时候还是很迷茫，不知道要怎么做。</p><p>在网上买了圣经（C primer plus），看了点 C 语言，然后就没看了（就看到选择和循环语句）</p><p>在 8 月 25 号的时候，我正式放弃了转专业的想法，是的，我放弃了。其一，车辆并非很差的专业，没有什么转专业的必要；其二，反正 211 车辆未来也是要转码，归根结底还是要学计算机。</p><p>于是放弃了。</p><h3 id="9-月初（军训前，没啥用）"><a href="#9-月初（军训前，没啥用）" class="headerlink" title="9 月初（军训前，没啥用）"></a>9 月初（军训前，没啥用）</h3><p>本来我已经基本上放弃了转专业的想法，但是我一个舍友有一天突然提出了转专业的意见。我和他交流完毕后，立刻买了计算机导论。然后我开始研究暑假就得到的网站到底要怎么进，挂了梯子啥的都进不了（用的电脑）</p><p>那个时候脑抽，挂了个梯子上贴吧发帖问，被人叫法 ye，或者法 ye 恰个 v。<br>后来看了一下 ip 才发现 ip 给我整法国去了。</p><p>太愚蠢了。</p><p>于是我开始疯狂搜索，找到了当时一位 20 年转考学姐留下来的 pdf（后来不小心删掉了）</p><p>于是加上了转专业群，蛮点了一下网站，本来想随便试一下。毕竟电脑都进不了手机则么可能能进……</p><p>最后，GitHub，在手机上上去了……还不用梯子。</p><p>那个时候心情有点崩溃，暑假的时候找镜像网站，搞啥咋也进不去，结果在手机上一点就进了。</p><p>寄。</p><p>再加上我在贴吧上也有问，被某几位 ldx“嘲讽”太晚了。</p><p>在这里我可以很光荣的说，我转成功了（虽然也没啥好荣幸的，这不过就是弥补自己高考的失败罢了）</p><h3 id="军训（没用）"><a href="#军训（没用）" class="headerlink" title="军训（没用）"></a>军训（没用）</h3><p>当摆子没啥好说的。注意，军训两学分，有算绩点！和一门大英或者一门政治学分一样了！</p><h3 id="上课第一周（没用）"><a href="#上课第一周（没用）" class="headerlink" title="上课第一周（没用）"></a>上课第一周（没用）</h3><p>当摆子，那个时候转专业心依旧不是很坚定。甚至想放弃，毕竟到了计院更卷。没上高数</p><h3 id="国庆一直到-10-月-16-日（没用）"><a href="#国庆一直到-10-月-16-日（没用）" class="headerlink" title="国庆一直到 10 月 16 日（没用）"></a>国庆一直到 10 月 16 日（没用）</h3><p>当摆子，高数进度缓慢。</p><h3 id="10-月-16-日至-11-月初（有点用，和导论有关系）"><a href="#10-月-16-日至-11-月初（有点用，和导论有关系）" class="headerlink" title="10 月 16 日至 11 月初（有点用，和导论有关系）"></a>10 月 16 日至 11 月初（<strong>有点用，和导论有关系</strong>）</h3><p>这一天我彻底下了转专业的决心，开始认真备战转专业考试。之前都不是很坚定地在准备。或许吧。<br>开始背导论，并且把计算机导论那本书当看科普每天看一点，最重要掌握的就是进制转换，以及码制（没考）。<br>背的前些年学长学姐整理的题目，主要背了组成原理，也就是计算机的定义，硬件及硬件的分类，软件及软件的分类。<br>看了下 22 年的题目，把 22 年的题目给背了。然后高数小测寄了，才发现脑子抽了先去背导论，就是应该先搞高数。<br>于是开刷高数。</p><p>学长学姐资料里软件工程部分占了 6 页，那里不用看。转软工的面试可能还有点用。</p><h3 id="刷高数-ing"><a href="#刷高数-ing" class="headerlink" title="刷高数 ing"></a><strong>刷高数 ing</strong></h3><p>小测寄了之后开始总结，除了有一题是硬实力问题外，其他都是不够注重细节。<br>不够注重细节是借口，其实就是题做少了。由于我不是很喜欢吉米多维奇的排版，<br>所以吉米多维奇并没有刷的很细致，导致后面考试的时候有点被动。<br>谁会想到从里面摘了 4 道题改编，卷子属实是有点出的不走心了。</p><p>后面自学学完了之后开始刷卷子，从刚开始写 21 年试卷的不及格，<br>到转考前一周的周日 22 年试卷的满分（21 年卷子比 22 年难，不可否认），历时快一个月。<br>中间把 05 年到 13 年的卷子刷完，这些年的卷子都蛮套路化的，主打一个计算认真，包括转考也一样。</p><p>把你的高数作业翻到最后，有近两年的卷子。</p><p>不是高数不难，是福大考的不难。福大的高数更侧重于考细节，每个概念要分的很清楚。<br>举个很简单的例子：“在可导函数中，导函数等于零的点是原函数在该点取极值的什么条件”，<br>很显然是必要条件，但把第一个小句去掉，答案就变成既不也不。<br>（分别是福大课本第二章课后综合题以及 22 年期中考考题）<br>一定要注意细节。</p><p>成败就在此。</p><p><strong>压轴题没做出来不是很影响你的笔试成绩，况且今年转计反套路，压轴没出微分中值定理。</strong></p><p>这里吐槽一句，蛮逆天的今年，12 月 10 号期中考，然后转计考是 11 月 26 日，考的范围还一样。</p><h3 id="关于原专业"><a href="#关于原专业" class="headerlink" title="关于原专业"></a>关于原专业</h3><p>由于原专业并不是很差，所以做了两手准备。这么一搞就搞得非常累，尤其还是机械制图 C 这种很花时间和脑子的科目。</p><p>可以看到大部分转成功的都是抱着破釜沉舟的想法转的，几乎放弃了原专业课。这需要自己权衡，不再多说。</p><h3 id="转考日的前两周的周日（没啥用）"><a href="#转考日的前两周的周日（没啥用）" class="headerlink" title="转考日的前两周的周日（没啥用）"></a>转考日的前两周的周日（没啥用）</h3><p><strong>心态放好，大家都一样的，导论差不多都是最后一周突击。</strong></p><h3 id="英语"><a href="#英语" class="headerlink" title="英语"></a><strong>英语</strong></h3><p>其实我把英语的战线拉的很长，从九月初就开始刷英语，毕竟四级要考。因为转考要考翻译，所以重点着重放在了翻译上面。<br>写了七八篇，考前写了一篇，向计算机的同学要了他们的专业认证英语，拿来看了一下。</p><p><strong>人工智能考了两年了，汉译英。另外稍微看看算法之类的单词，这些会考英译汉，能写个大概意思就行。</strong></p><h3 id="最后的冲刺周（导论）"><a href="#最后的冲刺周（导论）" class="headerlink" title="最后的冲刺周（导论）"></a><strong>最后的冲刺周（导论）</strong></h3><p>事情扎堆，压力很大。把十月中旬背的导论捡了回来，挑重点，根据去年猜题。这一周周五开始上积分，我没听。因为周日就转考。是的，周三才讲完转考的考试范围。</p><p><strong>高数，基本上转考前几天才会把转考要考的部分给讲完，提前学和刷题是必要的。当然不排除你天赋异禀。</strong></p><p>顺着写的，这句话待会儿加到前面。</p><p>最后一周把同济的卷子给刷了，上课都没听。还是那句话，关于原专业的课程或者公共课，得自己权衡利弊。</p><p>复习了三遍课本以及课后作业。</p><p>吉米多维奇稍微看了一眼之前折页的题目。</p><p>把错题总结了一下。</p><p>导论真的死记的应该不多，每块东西有点印象就行，到时候上考场能写出东西。<br><strong>最好的结果差不多就是，你对着计算机导论的目录，每一点都能说出点所以然来。</strong></p><p>导论根据去年的题目推测，考的范围大却不精。今年考的方向和去年类似，因此我完完整整背下来了一道题目，剩下两题都有看过，蛮有印象的，有一题扫了几眼，考场上能写出几句像样的话来。进制转换就不必说了。</p><p>前面有说过，考一道组成原理，一道数据库，一道进制转换，一道网络相关，一道计算机前沿知识。</p><p>对应总结一下。</p><p>22 年考：</p><p>简述计算机的硬件及分类，进制转换，数据库系统，TCP&#x2F;IP，物联网大数据与云计算的关系</p><p>23 年考：</p><p>简述计算机的基本特点，进制转换，数据库管理系统，计算机病毒，物联网。<br>大体与我之前的分类类似。</p><p>前面有说过物联网考了好几年了，从 20 年一直考到现在。</p><p>转考前两天我怼着这三块内容以及自己觉得可能出的考题一直看。</p><p>英语到最后一周没怎么复习了，听天由命，看啥上面有说。</p><h3 id="转考当天（蛮有用）"><a href="#转考当天（蛮有用）" class="headerlink" title="转考当天（蛮有用）"></a><strong>转考当天（蛮有用）</strong></h3><p>凌晨两点睡的，比高考还紧张。也可能是喝了咖啡的缘故。</p><p>8 点多到了考场，算了下考生，好像比前几年少。随便坐，没有座位表。<br>试卷发下来，一下发三张。我觉得高数部分题目难度略高于历年的半期考，题目有一些是吉米多维奇里面改编的，有原题。但是我吉米多维奇没有细刷，所以导致浪费了时间。</p><p>高数求极限错了，7 分没了。压轴 8 分没见过的题型，不是微分中值定理和泰勒，而是夹逼定理，给了。</p><p>在这里告诫后来者，<strong>一定一定，要看解析</strong>。我在考前有做过一道很类似的这种求极限的题目（同济测试卷上的），用了另一种较为特殊做法。我觉得我对了，没看解析，也没意识到有其他做法，而且还是最通识的洛必达。考场上那题改编了一下，用那种特殊做法做出来很怪。出来一看，用洛必达。</p><p>15 分给了，所以我考完之后就已经做好了没过的准备了。我不能保证我选择题以及其他大题全对，就像我当时在高数小测考场的时候，笃定自己能满分，结果出来一看，寄。</p><p>现在写的时候知道结果，过了，而且笔试排名还蛮前面的。在这里感谢我自己，有认真检查高数的选择题和其他两道大题（虽然第一遍就做对了），考前有认真总结高数，有认真背导论，有过一些专业词汇（虽然没啥用），做了近十篇的四级翻译，向计算机的同学要专业认证英语。</p><p>后 50 分算是救了我，如果我高数其他题全对的话，那我导论和英语加起来扣了不到十分，这还建立在我有一道导论几乎没看过，瞎答的情况下（有理有据瞎答）</p><p>当然我没有了解过其他人的具体分数，所以不是很清楚他们的答题情况。或许我这个导论和英语的扣分也很高，毕竟 20 年有 96 的超模学长&#x2F;学姐。</p><p>然后当天结束之后，去看了四院合办的迎新晚会。瞻仰了我主持人舍友的英姿，有一说一中间那段太尬了，这是他自己说的。</p><p>放松了许多。或者说 san 值降低。</p><p>另外时间有点紧，两个小时做三张卷子时间差点不够。</p><h3 id="转考后一天"><a href="#转考后一天" class="headerlink" title="转考后一天"></a>转考后一天</h3><p>这一天是电信笔试，得去旗山考，下午两点开始，我祝福了我考电信的朋友。</p><h3 id="出名单的前一天"><a href="#出名单的前一天" class="headerlink" title="出名单的前一天"></a>出名单的前一天</h3><p>出名单的前一天是物信院出名单，我有帮我朋友在那里守着，最后名单出来，分数出来，朋友差一分进面试，寄。</p><h3 id="出名单当天"><a href="#出名单当天" class="headerlink" title="出名单当天"></a>出名单当天</h3><p>当时我是第一个发现能查成绩以及把面试名单发到群里的人。我和朋友坐在食堂三楼刷。当时太兴奋了，喊出来了，在此对影响到的各位同学抱歉。</p><p>最后的感觉是怅然，除了一个转电气的朋友还没考之外，除了我之外其他 4 个转考（不全是考计算机的）都寄了。这种感觉有点像高考前的一群朋友，大家约好了一起去某所大学，结果就你自己考上了。</p><p>然后后面转电气的朋友也寄了。</p><p>不再多言。</p><h3 id="面试当天（出名单后一天）"><a href="#面试当天（出名单后一天）" class="headerlink" title="面试当天（出名单后一天）"></a>面试当天（出名单后一天）</h3><p>在这里先感谢我的主持人舍友，他帮我看了下稿子，提出了修改建议，然后传授了我一个多小时面试的经验。比如说如何让自己声音听起来不虚，让自己看起来有自信。虽然面试分不是太高，但是我敢肯定如果没有他的帮助，我可能在考官面前连自我介绍都会忘词，分肯定也会更低。</p><p>面试的时候我是和其他三个人，都是寄院面试的打车出去，四点打车出发，四点半到旗山校区北门，并且到计数楼 3 楼踩点，坐校内的旅游车来到生活区，吃饭（吃的麦麦），五点四十五坐上回程车，六点到达计数楼并等待。</p><p>时间有点赶。</p><p>我面试的具体内容已经在前面写的很清楚了，在这里就不再重复一遍。当所有老师开始笑起来的时候，我的当时脑袋里的想法是：</p><p><img src="https://img.w2fzu.com/fzu-run/202312032009680.png" alt="面试当天心情示意图"></p><p>不说什么，也没什么好说的。（当时确实有点火气，这是真的）因为我确实没有实力。</p><p>没有实力是原罪。</p><p>我认得很清楚。</p><h3 id="面试后一天"><a href="#面试后一天" class="headerlink" title="面试后一天"></a>面试后一天</h3><p>精神恍惚，早上的制图课和高数课我听不进去。精神力消耗实在太大了，根本集中不了注意力。本来我下午还制定了学英语，学高数等等的诸多计划。</p><p>然后看到了这张图，也放在下面：</p><p><img src="https://img.w2fzu.com/fzu-run/202312032009546.png" alt="面试后心态调整示意图"></p><p>正确的，我的精神压力太大了，真的把大学当高中来学会死人的。</p><p>所以直接开摆，下午睡到了五点多，晚上和另一个开学就跑路去数理综合班的朋友，出去穷游，一晚上花了 1 块钱（坐公交回来）。</p><p>心理压力瞬间松了很多，也知道未来该怎么做了。</p><p>简单总结一下，这里是大学，不是高中。或许，只是或许哈，学校举办那么多活动，是让我们放松，只是或许哈。</p><p>不说什么了，好困啊！！！！</p><h3 id="拟录取名单"><a href="#拟录取名单" class="headerlink" title="拟录取名单"></a>拟录取名单</h3><p>其实到了这个时候，已经没多大感觉了，进了就进了，没进就没进。最后响应群主号召来写这玩意。本来快睡着了，然后去看了下群。突然就精神了，下床开电脑写了这么一个狗屁不通且注水的玩意。</p><h3 id="新生活"><a href="#新生活" class="headerlink" title="新生活"></a>新生活</h3><p>想啥呢，马上就是大英期中考＋高数期中考＋英语四级考试＋导论论文截至＋无数事情。<br>好吧，其实我的导论论文截至日期是 11 月 30 日，我在笔试一结束就马不停蹄地水论，<br>在 11 月 28 日把论文交了上去，然而我导论课还有一篇全英论文翻译，12 月 15 号交，<br>头疼着呢！四级还在 12 月 16 号。</p><p>转考之后，该干啥干啥，想在原专业拿奖学金的就继续认真学原专业的课，不想拿的混个及格，虽然没啥影响，但是成绩单上不好看。</p><h3 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h3><p>23 年福大计算机的分是 616，本人高考成绩 597，相当于上了半年高四，高考成绩加了 20 分。</p><p>我在高中阶段并没有参加过任何的学科竞赛，高考也一般，还有瘸腿的科目。在转专业的大军里面也普普通通，没什么亮点。</p><p>为什么写这么长？我也只是一个普通人，把自己的经历分享出来。<br>如果有认真看就会发现我这一路下来，除了占据了地域优势，知道福大可以转转业外，<br>剩下的信息基本上都是自己主动出击去收集的，成绩啥的也是一步步打下来的，完全是普通人可以复刻的道路。<br>毕竟我刚开始也是，一份卷子做下来能不及格，也不是啥天才。<br>我什么都没有，一路上都是好友，学长学姐，乃至父母帮助过来的，能帮到一点是一点吧，最前面写那个大概率不会回答其实并不符合我的性格，未来学弟学妹没看其实也没啥关系，你问的，我都会给你解答。</p><p>另外不要觉得不好意思，转专业群里的学长学姐随便加，都会回答你的问题。</p><p>写到这里我不知道在想什么，或许在想我应该睡觉了，现在已经很晚了。</p><p>最后的最后，感谢能读到这里的 uu 们。</p><p>大家的时间也是时间，不能因为看我这个转专业帖子，看我在这里无病呻吟浪费时间。</p><p>不过不论如何，最后祝 24 年乃至未来的转专业的学弟学妹们顺利。</p><p>祝大家都能到想上的专业。</p><p>大家，加油，永不言弃！！！！</p><h2 id="致敬"><a href="#致敬" class="headerlink" title="致敬"></a>致敬</h2><ul><li>21 年带头跑路的土木学习部部长</li><li>转专业群群主</li><li>某位 22 转成功学姐</li><li>给予帮助的全体学长学姐</li><li>本人（迫真，这次最大的收获就是懂得了感谢自己）</li><li>以及奋斗的我们</li><li>未来能看到这里的学弟学妹们</li></ul><hr><p>真的是写在最后？</p><p>未来有什么要补充的，或许等会用 github 了会再来说说，放在这里的下面，包括转专业成功后要干啥什么的，毕竟目前我并没有体验过。有些事情其实没有亲身体会过，是没办法知道里面的种种，比如说面试，根本，或者说基本上没得参考（我应该是第一个把面试全过程写出来的人了吧，当时被问到是否要结束面试的时候心脏漏了一拍，后来才意识到这是面试的正常流程）。</p><p>诸位，山顶相聚！</p><p>另外，喝了咖啡太精神了，晚上尽量不要喝咖啡。</p><p><strong>2023 年 12 月 3 日凌晨 2 点半！！！！</strong><br><strong>2023 年 12 月 3 日三点半细化再补充</strong></p>]]>
    </content>
    <id>https://shaddocknh3.github.io/2023/12/03/1.fzu-run-cs-help-2023/</id>
    <link href="https://shaddocknh3.github.io/2023/12/03/1.fzu-run-cs-help-2023/"/>
    <published>2023-12-03T11:04:08.000Z</published>
    <summary>2023 福州大学车辆工程转计算机类的经验贴，包含时间线、备考资料、面试记录等详细信息，供有意转专业的同学参考（但已过时，请看另一篇总帖）。</summary>
    <title>福州大学 2023 车辆转计算机经验贴</title>
    <updated>2026-04-14T12:12:34.097Z</updated>
  </entry>
</feed>
