<contenttype="html"><![CDATA[<blockquote><p><strong>敬告</strong></p><divstyle="color: red">本博客请供参考,请不要抄袭。</div></blockquote><p>这是 ANU <ahref="http://courses.cecs.anu.edu.au/courses/COMP2310/"target="_blank"rel="noopener">COMP2310</a>的第一次大作业,历时一个月左右,也是这个学期我写的最认真的一次作业,所以在博客搭建伊始,我先把这个记录下来。</p><h2id="问题"><aclass="header-anchor"href="#问题">¶</a>问题</h2><p>根据<ahref="http://davidz.cn/static/blog/2020-01-11-anu-comp2310-assignment1/assignment-1.pdf"target="_blank"rel="noopener">Assignment 1 PDF</a>中的描述,大概的意思就是在三维空间中有许多的<code>车</code>,具有速度和加速度(都是三维向量),而且不管是否加速,都会消耗一定的能量,当然加速也会加快能量的消耗。然后就是有一个或多个<code>能量球</code>,当然也是在运动中的,同样具有速度和加速度。当<code>车</code>和<code>能量球</code>靠近的时候,<code>车</code>能够获取到<code>能量球</code>的信息(加速度,速度,位置),并且加满能量,而当<code>车</code>与<code>车</code>靠近的时候,能够互相交换一次信息,这个信息的内容是自己定义的。<code>车</code>在能量耗尽后就消失了,而我们需要做的就是在一定的时间内,保证尽可能多的<code>车</code>存活。</p><h2id="分析"><aclass="header-anchor"href="#分析">¶</a>分析</h2><p>其实这个问题最关键的地方在于,没有一个中央的控制节点,也就是说对于每一个<code>车</code>来说都是完全平等且独立的。所以我们需要他们能够尽可能的一直处在能够交流的状态,并且都能知道<code>能量球</code>在哪里。</p><blockquote><p><strong>注意</strong><br>这个问题在没有中央控制时<strong>不存在</strong>最优解,我们只能无线接近最优解。<br>我采用的是<strong>球形模型</strong>,这个模型参考于这次作业的 <ahref="https://cs.anu.edu.au/courses/comp2310/1-Labs-Assignments.html"target="_blank"rel="noopener">Examples</a>。<br>在和我的同学互相交流时,这个模型是最普遍的,解决方案是最多的,效果也是相对最好的。</p></blockquote><p><imgsrc="http://davidz.cn/static/blog/2020-01-11-anu-comp2310-assignment1/figure1.svg"alt="3D球形模型"></p><p><imgsrc="http://davidz.cn/static/blog/2020-01-11-anu-comp2310-assignment1/figure2.svg"alt="2D球形模型"></p><p>球形模型设计的两大重点是:</p><ol><li>所有的<code>车</code>都均匀平等地分布在球面上(球面是个相对概念,可以是球壳???)。</li><li>所有的<code>车</code>都能随时交流,也就是说大家形成一个通讯网络。</li></ol><h2id="实现"><aclass="header-anchor"href="#实现">¶</a>实现</h2><blockquote><p><strong>注意</strong><br>所有的 Ada 代码都是示意性的,有可能不能直接在项目中使用。</p></blockquote><h3id="Stage-A-B"><aclass="header-anchor"href="#Stage-A-B">¶</a>Stage A&B</h3><p>这个阶段中,能量球只有一个,我们让所有的<code>车</code>都围绕这个能量球运动来实现一个基本的球形模型。</p><h4id="基本程序结构(Basic-Program-Structure)"><aclass="header-anchor"href="#基本程序结构(Basic-Program-Structure)">¶</a>基本程序结构(Basic Program Structure)</h4><p>程序基本的结构是一个死循环,每次循环分为 4 个步骤:</p><ol><li>判断<code>能量球</code>信息</li><li>发送信息</li><li>接受信息</li><li>设置目的地和油门</li></ol><h4id="消息结构(Message-Structure)"><aclass="header-anchor"href="#消息结构(Message-Structure)">¶</a>消息结构(Message Structure)</h4><p>最基础的消息需要包括:</p><ol><li><code>能量球</code>的信息</li><li>获得<code>能量球</code>信息的时间戳</li></ol><h4id="中央控制(Central-Control)"><aclas