<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ayoimiy.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ayoimiy.github.io/" rel="alternate" type="text/html" /><updated>2026-04-27T06:36:40+00:00</updated><id>https://ayoimiy.github.io/feed.xml</id><title type="html">算法</title><subtitle>描述被哈米斯吃了</subtitle><author><name>ayoimiy</name></author><entry><title type="html">寻路算法</title><link href="https://ayoimiy.github.io/%E9%9A%8F%E7%AC%94/2026/04/26/%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95.html" rel="alternate" type="text/html" title="寻路算法" /><published>2026-04-26T00:00:00+00:00</published><updated>2026-04-26T00:00:00+00:00</updated><id>https://ayoimiy.github.io/%E9%9A%8F%E7%AC%94/2026/04/26/%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95</id><content type="html" xml:base="https://ayoimiy.github.io/%E9%9A%8F%E7%AC%94/2026/04/26/%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95.html"><![CDATA[<p>寻路算法，可以看成是在一个图上，给定一个起始节点和结束节点，然后找到它们之间的联通路径。</p>
<ul>
  <li><a href="https://qiao.github.io/PathFinding.js/visual/">可视化网站</a></li>
</ul>

<hr />
<p>以下的几种算法都是从开始点不断向外探索邻居节点，直到成功与终点相连。
它们共同维护以下的几个信息集合</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">open_set</code>：待处理节点</li>
  <li><code class="language-plaintext highlighter-rouge">closed_set</code>：标记已遍历节点</li>
  <li><code class="language-plaintext highlighter-rouge">path_set</code>：记录路径
而如果节点能够唯一映射成一个<code class="language-plaintext highlighter-rouge">key</code>，那么利用字典，就可以大大提高查找和比较的速度，为此需要引入</li>
  <li><code class="language-plaintext highlighter-rouge">get_node_key()</code>：获取节点的<code class="language-plaintext highlighter-rouge">key</code></li>
  <li><code class="language-plaintext highlighter-rouge">nodes_set</code>：节点和key的字典，用于获取节点
除此之外，也需要实现</li>
  <li><code class="language-plaintext highlighter-rouge">get_neighbors()</code>
用以获取节点周围的邻居。</li>
</ul>

<p>那么其大致流程可以看做</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>获取邻居--&gt;加入open_set--&gt;按某种规则处理节点---&gt;移入closed_set---&gt;循环至无节点可处理
</code></pre></div></div>

<p>而下列几种算法的区别只在于处理规则上面</p>
<h3 id="bfs算法">BFS算法</h3>
<p>BFS全称广度优先算法，即优先处理比较近节点。</p>

<p>注意，BFS默认了处理的图是<strong>等权的</strong>，即节点距离是均匀的。
因为这个前提，只需建立一个普通队列(FIFO)，也就是<code class="language-plaintext highlighter-rouge">open_set</code>，而无需额外计算代价。</p>

<p>而lua中表的特性使得其十分容易实现。
下列代码中采用的方法是，插入表头，读取表尾，从而形成一个简单队列。</p>

<div class="language-lua highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="nf">bfs</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
	<span class="c1">--配置</span>
	<span class="kd">local</span> <span class="n">start</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">start</span>
	<span class="kd">local</span> <span class="n">goal</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">goal</span> 
	<span class="kd">local</span> <span class="n">get_node_key</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">get_node_key</span>
	<span class="kd">local</span> <span class="n">get_neighbors</span> <span class="o">=</span> <span class="n">config</span><span class="p">.</span><span class="n">get_neighbors</span>
			
	<span class="c1">--内部设置</span>
	<span class="kd">local</span> <span class="n">open_set</span><span class="o">=</span><span class="p">{</span>
	<span class="kd">local</span> <span class="n">closed_set</span><span class="o">=</span><span class="p">{}</span>
	<span class="kd">local</span> <span class="n">path_set</span> <span class="o">=</span> <span class="p">{}</span>
	<span class="kd">local</span> <span class="n">nodes_set</span> <span class="o">=</span> <span class="p">{}</span>
	
	<span class="kd">local</span> <span class="n">start_key</span> <span class="o">=</span> <span class="n">get_node_key</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
	<span class="kd">local</span> <span class="n">goal_key</span> <span class="o">=</span> <span class="n">get_node_key</span><span class="p">(</span><span class="n">goal</span><span class="p">)</span>
	<span class="nb">table.insert</span><span class="p">(</span><span class="n">open_set</span><span class="p">,</span><span class="n">start_key</span><span class="p">)</span>
	<span class="n">nodes_set</span><span class="p">[</span><span class="n">start_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">start</span>
		
	<span class="k">while</span> <span class="nb">next</span><span class="p">(</span><span class="n">open_set</span><span class="p">)</span> <span class="k">do</span>
		<span class="c1">--优先队列</span>
		<span class="kd">local</span> <span class="n">curr_key</span> <span class="o">=</span> <span class="n">open_set</span><span class="p">[</span><span class="o">#</span><span class="n">open_set</span><span class="p">]</span>
		<span class="c1">--判断是否抵达</span>
		<span class="k">if</span> <span class="n">curr_key</span> <span class="o">==</span> <span class="n">goal</span> <span class="k">then</span>
			<span class="c1">--恢复路径</span>
			<span class="kd">local</span> <span class="n">path</span> <span class="o">=</span> <span class="p">{}</span>
			<span class="kd">local</span> <span class="n">key</span> <span class="o">=</span> <span class="n">curr_key</span> 
			<span class="k">while</span> <span class="n">key</span> <span class="k">do</span> 
				<span class="nb">table.insert</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
				<span class="n">key</span> <span class="o">=</span> <span class="n">path_set</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
			<span class="k">end</span>
			<span class="k">return</span> <span class="n">path</span> 
		<span class="k">end</span>
		<span class="c1">--标记已处理</span>
		<span class="n">closed_set</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span> 
		<span class="c1">--处理邻居</span>
		<span class="kd">local</span> <span class="n">neighbors</span> <span class="o">=</span> <span class="n">get_neighbors</span><span class="p">(</span><span class="n">curr_key</span><span class="p">)</span>
		<span class="k">for</span> <span class="n">_</span><span class="p">,</span><span class="n">neighbor</span> <span class="k">in</span> <span class="nb">ipairs</span><span class="p">(</span><span class="n">neighbors</span><span class="p">)</span> <span class="k">do</span>
			<span class="kd">local</span> <span class="n">key</span> <span class="o">=</span> <span class="n">get_node_key</span><span class="p">(</span><span class="n">neighbor</span><span class="p">)</span>
			<span class="c1">--加入节点网络中</span>
			<span class="k">if</span> <span class="ow">not</span> <span class="n">nodes_set</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">then</span>
				<span class="n">nodes_set</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">neighbor</span>
			<span class="k">end</span>
			<span class="c1">-- 处理邻居		</span>
			<span class="k">if</span> <span class="ow">not</span> <span class="n">closed_set</span> <span class="k">then</span>
				<span class="nb">table.insert</span><span class="p">(</span><span class="n">open_set</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">key</span><span class="p">)</span>	
				<span class="n">path_set</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">curr_key</span>							
			<span class="k">end</span>						
		<span class="k">end</span>						
	<span class="k">end</span>
	<span class="k">return</span> <span class="kc">nil</span> 	
<span class="k">end</span>
</code></pre></div></div>
<h3 id="dfs算法">DFS算法</h3>
<h3 id="astar算法">Astar算法</h3>
<p>Astar算法是启发式的，与BFS算法不同的是，Asta算法在搜索过程中是知道终点的信息的，即在此引入的<strong>代价</strong>：</p>
<ul>
  <li></li>
</ul>

<p>代价更新</p>

<hr />]]></content><author><name>ayoimiy</name></author><category term="随笔" /><category term="Jekyll" /><category term="博客搭建" /><summary type="html"><![CDATA[学习几种比较常见的寻路算法]]></summary></entry><entry><title type="html">我的世界</title><link href="https://ayoimiy.github.io/%E9%9A%8F%E7%AC%94/2026/04/25/hello-world.html" rel="alternate" type="text/html" title="我的世界" /><published>2026-04-25T00:00:00+00:00</published><updated>2026-04-25T00:00:00+00:00</updated><id>https://ayoimiy.github.io/%E9%9A%8F%E7%AC%94/2026/04/25/hello-world</id><content type="html" xml:base="https://ayoimiy.github.io/%E9%9A%8F%E7%AC%94/2026/04/25/hello-world.html"><![CDATA[<h2 id="你好">你好</h2>
<p><code class="language-plaintext highlighter-rouge">a_star</code></p>

<div class="language-lua highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">local</span> <span class="n">comp</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">get_comp</span><span class="p">()</span>
</code></pre></div></div>

<hr />

<p>我去</p>

<hr />]]></content><author><name>ayoimiy</name></author><category term="随笔" /><category term="Jekyll" /><category term="博客搭建" /><summary type="html"><![CDATA[这是文章的简短摘要]]></summary></entry></feed>