<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>line search &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/line-search/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Mon, 27 Apr 2020 17:31:17 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创] line search中的重要定理 - 梯度与方向的点积为零</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 02 Mar 2014 04:17:53 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[line search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[一维搜索]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7838</guid>

					<description><![CDATA[<p>
对精确的line search（线搜索），有一个重要的定理：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/line_search_important_theory.png" style="width: 292px; height: 62px;" /></div>
<p>这个定理表明，当前点在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 方向上移动到的那一点（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> ）处的梯度，与当前点的搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 的点积为零。<br />
<span id="more-7838"></span><br />
其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 是称之为&#8220;步长&#8221;的一个实数，它是通过line search算法求出来的。</p>
<p>为什么会有这样的结论？我们来看看。<br />
对每一个line search过程来说，搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 已经已经是确定的了（在最优化算法中，如何找出一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 不是line search干的事情）。所以，在一个确定的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 上，要找到一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ea810edb4a7e8eadbe210b70b3a20fa7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha ) = f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>\phi (\alpha ) = f({x_k} + \alpha {d_k})</script> 这个函数满足 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_12c0bd0e35955bb786ce9ac5f6f4b864.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) < f({x_k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) < f({x_k})</script> ，这就是line search的目的。说白了，就是要找到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 使 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_17babde0fb3f14619432c61a083d48ae.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha )" /></span><script type='math/tex'>\phi (\alpha )</script> 的函数函数值变小。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
对精确的line search（线搜索），有一个重要的定理：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/line_search_important_theory.png" style="width: 292px; height: 62px;" /></div>
<p>这个定理表明，当前点在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 方向上移动到的那一点（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> ）处的梯度，与当前点的搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 的点积为零。<br />
<span id="more-7838"></span><br />
其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 是称之为&ldquo;步长&rdquo;的一个实数，它是通过line search算法求出来的。</p>
<p>为什么会有这样的结论？我们来看看。<br />
对每一个line search过程来说，搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 已经已经是确定的了（在最优化算法中，如何找出一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 不是line search干的事情）。所以，在一个确定的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 上，要找到一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ea810edb4a7e8eadbe210b70b3a20fa7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha ) = f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>\phi (\alpha ) = f({x_k} + \alpha {d_k})</script> 这个函数满足 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_12c0bd0e35955bb786ce9ac5f6f4b864.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) < f({x_k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) < f({x_k})</script> ，这就是line search的目的。说白了，就是要找到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 使 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_17babde0fb3f14619432c61a083d48ae.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha )" /></span><script type='math/tex'>\phi (\alpha )</script> 的函数函数值变小。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
但是，要小到什么程度呢？假设小到有可能的&ldquo;最小&rdquo;，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_57d69503331c217962370d0aba642512.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi ({\alpha _k}) = f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha > 0} f({x_k} + \alpha {d_k}) = \mathop {\min }\limits_{\alpha > 0} \phi (\alpha )" /></span><script type='math/tex'>\phi ({\alpha _k}) = f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha > 0} f({x_k} + \alpha {d_k}) = \mathop {\min }\limits_{\alpha > 0} \phi (\alpha )</script> <br />
那么，我们称这样的line search为&ldquo;精确的line search&rdquo;&mdash;&mdash;你看，这名字好贴切：我们精确地找到了函数值最小的那个点。</p>
<p>既然 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> 是函数值最小的那个点，那么，在该点处的一阶导数（即梯度）为零，所以我们对上式求导（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 是自变量， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_550187f469eda08b9e5b55143f19c4ce.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k}" /></span><script type='math/tex'>{x_k}</script> 和 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 为常量）：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fb51f475ef3cf5596f7e8252a03b01b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi '({\alpha _k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime } \cdot (0 + 1 \cdot {d_k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime }{d_k} = \nabla f{({x_k} + {\alpha _k}{d_k})^T}{d_k} = 0" /></span><script type='math/tex'>\phi '({\alpha _k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime } \cdot (0 + 1 \cdot {d_k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime }{d_k} = \nabla f{({x_k} + {\alpha _k}{d_k})^T}{d_k} = 0</script> <br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
这就是我们前面说的定理了。</p>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 27 Oct 2013 14:01:02 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Armijo-Goldstein准则]]></category>
		<category><![CDATA[line search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[Wolfe conditions]]></category>
		<category><![CDATA[Wolfe-Powell准则]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7320</guid>

					<description><![CDATA[<p>
line search（一维搜索，或线搜索）是最优化（Optimization）算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。<br />
在本文中，我想用&#8220;人话&#8221;解释一下不精确的一维搜索的两大准则：Armijo-Goldstein准则 ＆ Wolfe-Powell准则。<br />
之所以这样说，是因为我读到的所有最优化的书或资料，从来没有一个可以用初学者都能理解的方式来解释这两个准则，它们要么是长篇大论、把一堆数学公式丢给你去琢磨；要么是简短省略、直接略过了解释的步骤就一句话跨越千山万水得出了结论。<br />
每当看到这些书的时候，我脑子里就一个反应：你们就不能写人话吗？<br />
<span id="more-7320"></span><br />
我下面就尝试用通俗的语言来描述一下这两个准则。</p>
<div>
	<span style="background-color:#00ff00;">【1】</span>为什么要遵循这些准则</div>
<div>
	由于采用了不精确的一维搜索，所以，为了能让算法收敛（即：求得极小值），人们逐渐发现、证明了一些规律，当你遵循这些规律的时候，算法就很有可能收敛。因此，为了达到让算法收敛的目的，我们就要遵循这些准则。如果你不愿意遵循这些已经公认有效的准则，而是要按自己的准则来设计算法，那么恭喜你，如果你能证明你的做法是有效的，未来若干年后，书本里可能也会出现你的名字。</div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a></p>
<div>
	<span style="background-color:#00ff00;">【2】</span>Armijo-Goldstein准则</div>
<div>
	此准则是在196X年的时候由Armijo和Goldstein提出的，当然我没有具体去搜过这俩人是谁。在有的资料里，你可能会看到&#8220;Armijo rule&#8221;（Armijo准则）的说法，可能是同一回事，不过，任何一个对此作出重要贡献的人都是不可抹杀的，不是么？</div>
<p><span style="color:#0000ff;">Armijo-Goldstein准则的核心思想有两个：①目标函数值应该有足够的下降；②一维搜索的步长&#945;不应该太小。</span></p>
<div>
	这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值，因此，让目标函数函数值&#8220;下降&#8221;是我们努力的方向，所以①正是想要保证这一点。</div>
<div>
	同理，②也类似：如果一维搜索的步长&#945;太小了，那么我们的搜索类似于在原地打转，可能也是在浪费时间和精力。</div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
有了这两个指导思想，我们来看看Armijo-Goldstein准则的数学表达式：<br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_1.png" style="width: 460px; height: 45px;" /></a><br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_2.png" style="width: 510px; height: 42px;" /></a></p>
<p>其中，<span style="color:#ff0000;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5087877fc30cbeb7449a630043199764.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="0 < \rho < \frac{1}{2}" /></span><script type='math/tex'>0 < \rho < \frac{1}{2}</script> </span><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#dda0dd;">(1)</span>为什么要规定 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> 这个条件？其实可以证明：如果没有这个条件的话，将影响算法的<span style="color:#0000ff;">超线性收敛</span>性（<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">定义看这个链接，第4条</span></a>）。在这个速度至关重要的时代，没有超线性收敛怎么活啊！(开个玩笑)<br />
具体的证明过程，大家可以参考袁亚湘写的《最优化理论与方法》一书，我没有仔细看，我觉得对初学者，不用去管它。<br />
<span style="background-color:#dda0dd;">(2)</span>第1个不等式的左边式子的泰勒展开式为：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3182322817f538586aa55cc34d65e082.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})</script> <br />
去掉高阶无穷小，剩下的部分为： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9db59ffe507886c32015a962bbaf8944.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}{g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}{g_k}^T{d_k}</script> <br />
而第一个不等式右边与之只差一个系数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f7f177957cf064a93e9811df8fe65ed1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho " /></span><script type='math/tex'>\rho </script> <br />
我们已知了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> （这是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 为下降方向的充要条件），并且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> ，因此，1式右边仍然是一个比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 小的数，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c0aff944a2606a5a9e9c7ef88994429d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})</script> <br />
也就是说函数值是下降的（下降是最优化的目标）。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
line search（一维搜索，或线搜索）是最优化（Optimization）算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。<br />
在本文中，我想用&ldquo;人话&rdquo;解释一下不精确的一维搜索的两大准则：Armijo-Goldstein准则 ＆ Wolfe-Powell准则。<br />
之所以这样说，是因为我读到的所有最优化的书或资料，从来没有一个可以用初学者都能理解的方式来解释这两个准则，它们要么是长篇大论、把一堆数学公式丢给你去琢磨；要么是简短省略、直接略过了解释的步骤就一句话跨越千山万水得出了结论。<br />
每当看到这些书的时候，我脑子里就一个反应：你们就不能写人话吗？<br />
<span id="more-7320"></span><br />
我下面就尝试用通俗的语言来描述一下这两个准则。</p>
<div>
	<span style="background-color:#00ff00;">【1】</span>为什么要遵循这些准则</div>
<div>
	由于采用了不精确的一维搜索，所以，为了能让算法收敛（即：求得极小值），人们逐渐发现、证明了一些规律，当你遵循这些规律的时候，算法就很有可能收敛。因此，为了达到让算法收敛的目的，我们就要遵循这些准则。如果你不愿意遵循这些已经公认有效的准则，而是要按自己的准则来设计算法，那么恭喜你，如果你能证明你的做法是有效的，未来若干年后，书本里可能也会出现你的名字。</div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a></p>
<div>
	<span style="background-color:#00ff00;">【2】</span>Armijo-Goldstein准则</div>
<div>
	此准则是在196X年的时候由Armijo和Goldstein提出的，当然我没有具体去搜过这俩人是谁。在有的资料里，你可能会看到&ldquo;Armijo rule&rdquo;（Armijo准则）的说法，可能是同一回事，不过，任何一个对此作出重要贡献的人都是不可抹杀的，不是么？</div>
<p><span style="color:#0000ff;">Armijo-Goldstein准则的核心思想有两个：①目标函数值应该有足够的下降；②一维搜索的步长&alpha;不应该太小。</span></p>
<div>
	这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值，因此，让目标函数函数值&ldquo;下降&rdquo;是我们努力的方向，所以①正是想要保证这一点。</div>
<div>
	同理，②也类似：如果一维搜索的步长&alpha;太小了，那么我们的搜索类似于在原地打转，可能也是在浪费时间和精力。</div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
有了这两个指导思想，我们来看看Armijo-Goldstein准则的数学表达式：<br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_1.png" style="width: 460px; height: 45px;" /></a><br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_2.png" style="width: 510px; height: 42px;" /></a></p>
<p>其中，<span style="color:#ff0000;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5087877fc30cbeb7449a630043199764.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="0 < \rho < \frac{1}{2}" /></span><script type='math/tex'>0 < \rho < \frac{1}{2}</script> </span><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#dda0dd;">(1)</span>为什么要规定 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> 这个条件？其实可以证明：如果没有这个条件的话，将影响算法的<span style="color:#0000ff;">超线性收敛</span>性（<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">定义看这个链接，第4条</span></a>）。在这个速度至关重要的时代，没有超线性收敛怎么活啊！(开个玩笑)<br />
具体的证明过程，大家可以参考袁亚湘写的《最优化理论与方法》一书，我没有仔细看，我觉得对初学者，不用去管它。<br />
<span style="background-color:#dda0dd;">(2)</span>第1个不等式的左边式子的泰勒展开式为：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3182322817f538586aa55cc34d65e082.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})</script> <br />
去掉高阶无穷小，剩下的部分为： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9db59ffe507886c32015a962bbaf8944.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}{g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}{g_k}^T{d_k}</script> <br />
而第一个不等式右边与之只差一个系数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f7f177957cf064a93e9811df8fe65ed1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho " /></span><script type='math/tex'>\rho </script> <br />
我们已知了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> （这是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 为下降方向的充要条件），并且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> ，因此，1式右边仍然是一个比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 小的数，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c0aff944a2606a5a9e9c7ef88994429d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})</script> <br />
也就是说函数值是下降的（下降是最优化的目标）。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#dda0dd;">(3)</span>由于 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> 且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> （ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 是一个下降方向的充要条件），故第2个式子右边比第1个式子右边要小，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c8153267cd0d03c8afa2d9fe51d6546c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}(1 - \rho ){g_k}^T{d_k} < {\alpha _k}\rho {g_k}^T{d_k} < 0" /></span><script type='math/tex'>{\alpha _k}(1 - \rho ){g_k}^T{d_k} < {\alpha _k}\rho {g_k}^T{d_k} < 0</script> <br />
如果步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 太小的话，会导致这个不等式接近于不成立的边缘。因此，式2就保证了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 不能太小。<br />
<span style="background-color:#dda0dd;">(4)</span>我还要把很多书中都用来描述Armijo-Goldstein准则的一幅图搬出来说明一下（亲自手绘）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_1.jpg" style="width: 550px; height: 318px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
横坐标是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> ，纵坐标是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fa14cdd754f91cc6554c9e71929cce7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f" /></span><script type='math/tex'>f</script> ，表示在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6df14963c8774de478b239e157bd1c14.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k},{d_k}" /></span><script type='math/tex'>{x_k},{d_k}</script> 均为常量、 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 为自变量变化的情况下，目标函数值随之变化的情况。<br />
之所以说 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6df14963c8774de478b239e157bd1c14.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k},{d_k}" /></span><script type='math/tex'>{x_k},{d_k}</script> 均为常量，是因为在一维搜索中，在某一个确定的点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_550187f469eda08b9e5b55143f19c4ce.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k}" /></span><script type='math/tex'>{x_k}</script> 上，搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 确定后，我们只需要找到一个合适的步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 就可以了。<br />
当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> 为常量， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 为自变量时， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9c1a98b7b1878eabcf4d855982a2c81a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x + \alpha d)" /></span><script type='math/tex'>f(x + \alpha d)</script> 可能是非线性函数（例如目标函数为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_990d8846cdb8bfba65b16bf6252a7dd6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = {x^2}" /></span><script type='math/tex'>y = {x^2}</script> 时）。因此图中是一条曲线。<br />
右上角的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_19d48ed66ebabc7b91d1cb1c97d28ad3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>f({x_k} + \alpha {d_k})</script> 并不是表示一个特定点的值，而是表示这条曲线是以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 为自变量、 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6df14963c8774de478b239e157bd1c14.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k},{d_k}" /></span><script type='math/tex'>{x_k},{d_k}</script> 为常量的函数图形。<br />
当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4c417553b680cf203765de254be0350.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha = 0" /></span><script type='math/tex'>\alpha = 0</script> 时，函数值为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> ，如图中左上方所示。水平的那条虚线是函数值为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 的基线，用于与其他函数值对比。<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_45b7e561542aab7e2c705136b385555a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}</script> 那条线在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 下方（前面已经分析过了，因为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> ）， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d40b12c499976a6d7b94c6dfd79a56a0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}(1 - \rho ){g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}(1 - \rho ){g_k}^T{d_k}</script> 又在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_45b7e561542aab7e2c705136b385555a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}</script> 的下方（前面也已经分析过了），所以Armijo-Goldstein准则可能会把极小值点（可接受的区间）判断在区间bc内。显而易见，区间bc是有可能把极小值排除在外的（极小值在区间ed内）。<br />
所以，为了解决这个问题，Wolfe-Powell准则应运而生。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#00ff00;">【3】</span>Wolfe-Powell准则<br />
在某些书中，你会看到&ldquo;<a href="http://en.wikipedia.org/wiki/Wolfe_conditions" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Wolfe conditions</span></a>&rdquo;的说法，应该和Wolfe-Powell准则是一回事&mdash;&mdash;可怜的Powell大神又被无情地忽略了...<br />
Wolfe-Powell准则也有两个数学表达式，其中，第一个表达式与Armijo-Goldstein准则的第1个式子相同，第二个表达式为：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_2.jpg" style="width: 550px; height: 39px;" /><br />
这个式子已经不是关于函数值的了，而是关于梯度的。<br />
此式的几何解释为：<span style="color:#0000ff;">可接受点处的切线斜率&ge;初始斜率的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9d43cb8bbcb702e9d5943de477f099e2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\sigma " /></span><script type='math/tex'>\sigma </script> 倍</span>。<br />
上面的图已经标出了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1fb3bf723ae9a9c61eef13e70e1c5b73.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\sigma g_k^T{d_k}" /></span><script type='math/tex'>\sigma g_k^T{d_k}</script> 那条线（即 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点处的切线），而初始点（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4c417553b680cf203765de254be0350.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha = 0" /></span><script type='math/tex'>\alpha = 0</script> 的点）处的切线是比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点处的切线要&ldquo;斜&rdquo;的，由于 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_eb0004237e8dc9db81ca87fd2cc7f6e9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\sigma \in (\rho ,1)" /></span><script type='math/tex'>\sigma \in (\rho ,1)</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点处的切线变得&ldquo;不那么斜&rdquo;了&mdash;&mdash;不知道这种极为通俗而不够严谨的说法，是否有助于你理解。<br />
这样做的结果就是，我们将极小值包含在了可接受的区间内（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点右边的区间）。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
Wolfe-Powell准则到这里还没有结束！在某些书中，你会看到用另一个所谓的&ldquo;更强的条件&rdquo;来代替(3)式，即：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_3.jpg" style="width: 470px; height: 48px;" /><br />
这个式子和(3)式相比，就是左边加了一个绝对值符号，右边换了一下正负号（因为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead119a63ddef55ab91efbf5514e3609.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_k^T{d_k} < 0" /></span><script type='math/tex'>g_k^T{d_k} < 0</script> ，所以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ec6871914afe07c0858dc674aafe2ccf.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="- \sigma g_k^T{d_k} > 0" /></span><script type='math/tex'>- \sigma g_k^T{d_k} > 0</script> ）。<br />
这样做的结果就是：可接受的区间被限制在了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_af2fdeb93b85e5b0a49cb557cf999ebc.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[b,d]" /></span><script type='math/tex'>[b,d]</script> 内，如图：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_4.jpg" style="width: 317px; height: 211px;" /></div>
<p>图中红线即为极小值被&ldquo;夹击&rdquo;的生动演示。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/feed/</wfw:commentRss>
			<slash:comments>26</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]一维搜索中的划界(Bracket)算法</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sat, 26 Oct 2013 15:30:03 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[bracket]]></category>
		<category><![CDATA[line search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[一维搜索]]></category>
		<category><![CDATA[划界]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7360</guid>

					<description><![CDATA[<p>
很多最优化算法需要用到一维搜索（line search）子算法，而在众多的一维搜索算法中，大多数都要求函数被限制在一个<span style="color:#0000ff;">单峰区间</span>内，也就是说，在进行一维搜索的区间内，函数是一个<span style="color:#0000ff;">单峰函数</span>。尽管有一些改进的一维搜索算法（例如 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4be180680b4bf5c21034b5f7bf163d8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="H\ddot opfinger" /></span><script type='math/tex'>H\ddot opfinger</script> 建议的一种改进过的黄金搜索算法）可以处理函数非单峰的情况，但是，在没有确定函数在一个区间内是单峰的之前，即使在搜索过程中，函数值持续减小，我们也不能说极小值是一定存在的，因此，找出一个区间，在此区间之内使函数是单峰的，这个过程是必需的（我更倾向于接受这种观点）。这个过程就叫作<span style="color:#ff0000;">划界</span>（<span style="color:#0000ff;">Bracket</span>）。Bracket这个单词是括号的意思，很形象&#8212;&#8212;用括号包住一个范围，就是划界。在某些书中，划界算法也被称为<span style="color:#0000ff;">进退法</span>。<br />
<span id="more-7360"></span><br />
<span style="background-color:#00ff00;">【1】</span>什么是单峰区间？什么是单峰函数？<br />
从字面上理解，&#8220;单峰&#8221;即函数只有一个峰，如下图所示（在区间[-8,8]内是单峰的）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_1.png" style="width: 309px; height: 153px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
而下面的这个函数，在区间[2,14]内就不是单峰函数了：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_2.png" style="width: 462px; height: 129px;" /></div>
<p>现在，我们再用数学的话来定义一下单峰区间和单峰函数：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1e1d3d40573127e9ee0480caf1283d6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="R" /></span><script type='math/tex'>R</script> 的子集，存在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e48ac27bb5429028836b36729e3bfc66.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha ^*} \in [a,b]" /></span><script type='math/tex'>{\alpha ^*} \in [a,b]</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bfc3057d694a9b06bb46943bf39a0e7b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,{\alpha ^*}]" /></span><script type='math/tex'>[a,{\alpha ^*}]</script> 上严格单调减，在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead4fb17a0c4148758ef1619b8d9f56a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[{\alpha ^*},b]" /></span><script type='math/tex'>[{\alpha ^*},b]</script> 上严格单调增，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 的单峰区间，  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 上的单峰函数。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
很多最优化算法需要用到一维搜索（line search）子算法，而在众多的一维搜索算法中，大多数都要求函数被限制在一个<span style="color:#0000ff;">单峰区间</span>内，也就是说，在进行一维搜索的区间内，函数是一个<span style="color:#0000ff;">单峰函数</span>。尽管有一些改进的一维搜索算法（例如 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4be180680b4bf5c21034b5f7bf163d8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="H\ddot opfinger" /></span><script type='math/tex'>H\ddot opfinger</script> 建议的一种改进过的黄金搜索算法）可以处理函数非单峰的情况，但是，在没有确定函数在一个区间内是单峰的之前，即使在搜索过程中，函数值持续减小，我们也不能说极小值是一定存在的，因此，找出一个区间，在此区间之内使函数是单峰的，这个过程是必需的（我更倾向于接受这种观点）。这个过程就叫作<span style="color:#ff0000;">划界</span>（<span style="color:#0000ff;">Bracket</span>）。Bracket这个单词是括号的意思，很形象&mdash;&mdash;用括号包住一个范围，就是划界。在某些书中，划界算法也被称为<span style="color:#0000ff;">进退法</span>。<br />
<span id="more-7360"></span><br />
<span style="background-color:#00ff00;">【1】</span>什么是单峰区间？什么是单峰函数？<br />
从字面上理解，&ldquo;单峰&rdquo;即函数只有一个峰，如下图所示（在区间[-8,8]内是单峰的）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_1.png" style="width: 309px; height: 153px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
而下面的这个函数，在区间[2,14]内就不是单峰函数了：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_2.png" style="width: 462px; height: 129px;" /></div>
<p>现在，我们再用数学的话来定义一下单峰区间和单峰函数：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1e1d3d40573127e9ee0480caf1283d6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="R" /></span><script type='math/tex'>R</script> 的子集，存在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e48ac27bb5429028836b36729e3bfc66.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha ^*} \in [a,b]" /></span><script type='math/tex'>{\alpha ^*} \in [a,b]</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bfc3057d694a9b06bb46943bf39a0e7b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,{\alpha ^*}]" /></span><script type='math/tex'>[a,{\alpha ^*}]</script> 上严格单调减，在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead4fb17a0c4148758ef1619b8d9f56a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[{\alpha ^*},b]" /></span><script type='math/tex'>[{\alpha ^*},b]</script> 上严格单调增，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 的单峰区间，  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 上的单峰函数。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">【2】</span>&ldquo;划界&rdquo;是如何实现的<br />
方法是：<span style="color:#0000ff;">寻找使函数值达到&ldquo;高&rarr;低&rarr;高&rdquo;的3个点</span>。</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_3.png" style="width: 300px; height: 153px;" /></div>
<p>如上图所示，当我们找到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a44c56c8177e32d3613988f4dba7962e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a,b,c" /></span><script type='math/tex'>a,b,c</script> 这样3个点的时候，它们就能确定一个单峰区间了。<br />
一定有人会有疑问说：这不一定，万一 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_74aefa13d6ab8e4bfbd241583749dfe8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b,c" /></span><script type='math/tex'>b,c</script> 之间还有一个峰怎么办？确实，这里举的例子并不是一个完善的例子，在一个实用的划界程序中，它所做的考虑会非常多，各种意外情况都要处理，此处只是为了说明&ldquo;划界&rdquo;是怎么一回事，以及一个最简单的划界程序是怎么做的。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
与各种教科书上仅有令人讨厌的公式说明不同（从不考虑读者的感受），我把几个简单的划界步骤画成了几幅图，我觉得有小学文凭已经足够理解了（一图胜千言）：<br />
<span style="background-color:#dda0dd;">①</span>：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_4.png" style="width: 400px; height: 255px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
起始点为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> ，假设一开始向右寻找，步长为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2510c39011c5be704182423e3a695e91.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h" /></span><script type='math/tex'>h</script> ，图中的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ce4b16b22b58894aa86c421e8759df3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="k" /></span><script type='math/tex'>k</script> 表示迭代的次数。<br />
则第一点挪动到了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> ，计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c0260b46fc02a40358b1ce8d6a091d49.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_1}) < f({x_0})" /></span><script type='math/tex'>f({x_1}) < f({x_0})</script> ，很好，&ldquo;高&rarr;低&rarr;高&rdquo;的3点中，我们已经有了两点。<br />
然后下一点我们挪动到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_418ef5b163ae9806a8083c9a9d2d1b60.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h,\;t > 1" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h,\;t > 1</script> ，这里用加倍系数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e358efa489f58062f10dd7316b65649e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="t" /></span><script type='math/tex'>t</script> 来乘以步长是为了加速搜索的过程。再计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6eddd6e29b72e5f6800d8ff6ce721536.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_2}) > f({x_1})" /></span><script type='math/tex'>f({x_2}) > f({x_1})</script> ，很好，我们已经找到了&ldquo;高&rarr;低&rarr;高&rdquo;的3点。任务完成， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 即为所求区间。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_16eed244bae8cda67b7b4b3d247524df.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h</script> <br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#dda0dd;">②</span>：<br />
如果运气没那么好，例如：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_5.png" style="width: 400px; height: 258px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
即：<br />
和①一样，搜索也经历了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2a028522a51821f6a7a0d441ef3385f5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0},{x_1},{x_2}" /></span><script type='math/tex'>{x_0},{x_1},{x_2}</script> 这几个点，与①不同的是，到了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c1015f14836165504ccbb2a42b2c150b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2}" /></span><script type='math/tex'>{x_2}</script> 点之后，我们发现其函数值仍然小于 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 点处的函数值，也就是说，我们还没有找到&ldquo;高&rarr;低&rarr;高&rdquo;的3点。<br />
于是我们继续放大步长，令 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aa04b6cd962ee49fac0ad911b765d710.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times t \times h" /></span><script type='math/tex'>{x_3} = {x_2} + t \times t \times h</script> ，再计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_434ea99ec939be08994d39367fd9d146.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_3}) > f({x_2})" /></span><script type='math/tex'>f({x_3}) > f({x_2})</script> ，很好，我们已经找到了&ldquo;高&rarr;低&rarr;高&rdquo;的3点。任务完成， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 即为所求区间。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_16eed244bae8cda67b7b4b3d247524df.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h</script> （加大步长）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aa04b6cd962ee49fac0ad911b765d710.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times t \times h" /></span><script type='math/tex'>{x_3} = {x_2} + t \times t \times h</script> （继续加大步长）<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(221, 160, 221);">③</span>：<br />
①是向右搜索，如果我们运气更差一些，一开始就是个错误（应该向左搜索），怎么办？</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_6.png" style="width: 400px; height: 256px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
如上图，起始点为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> ，第一个挪动到的点起始点为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> ，而 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 处的函数值竟然比起始点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> 处的函数值要大（函数值不降反升）。于是我们可以向左搜索（将步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2510c39011c5be704182423e3a695e91.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h" /></span><script type='math/tex'>h</script> 设为负值），并且把 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 挪到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> ，继续按①的节奏进行下去。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> （发现函数值不降反升）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_761bf3e16011552f691e8ecbe1f52d9c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h' = - h" /></span><script type='math/tex'>h' = - h</script> （步长设为负值，向左搜索）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_49c03e6e72258ffeeb5c461e0983f30b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0}" /></span><script type='math/tex'>{x_1} = {x_0}</script> （重置 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 点）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_98d08c4623b6deffb01ecc0f74005111.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + h'" /></span><script type='math/tex'>{x_2} = {x_1} + h'</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5fdd5a736e805b777b0290ce5be54185.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times h'" /></span><script type='math/tex'>{x_3} = {x_2} + t \times h'</script> （加大步长，函数值回升，停止搜索）<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">【3】</span>加快划界的速度：逆抛物内插<br />
有没有什么办法可以加快划界的速度呢？有，<span style="color:#ff0000;">逆抛物内插</span>（<span style="color:#0000ff;">Inverse Parabolic Interpolation</span>）就是一种技术，它可以使得划界算法<span style="color:#0000ff;">超线性收敛</span>。<br />
为了解释什么是逆抛物内插，这里用书上的一幅图来讲解：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_7.png" style="width: 450px; height: 322px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
如图，实线为目标函数曲线。在该曲线上，如果我们要尽快逼近极小值点，可以这样做：通过①②③三点作一条抛物线（图中粗虚线所示），可以计算出该抛物线的极小值点的<span style="color:#b22222;">横坐标</span>，从而可以找到同一横坐标下，目标函数上的点，即点④；然后再过①②④三点作一条抛物线（图中细虚线所示），可以计算出该抛物线的极小值点的横坐标，从而又可以找到同一横坐标下，目标函数上的点，即点⑤。这样，我们就很快地逼近了极小值。</p>
<p>那么，过三点的抛物线，其极小值点的横坐标怎么求？<br />
已知函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> ，过 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ca1651768f9a28ea5d93fc636ac68c0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(a),f(b),f(c)" /></span><script type='math/tex'>f(a),f(b),f(c)</script> 三点的抛物线，其极小值点的横坐标 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> 为：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_8.png" style="width: 550px; height: 74px;" /><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
注：为什么叫&ldquo;<span style="color:#ff0000;">逆</span>&rdquo;？因为上面的方法是用来求横坐标 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> ，而不是求 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script> 的。</p>
<p>有人会问：划界的目标就是找到3个点，而你怎么会预先知道3个点的坐标，从而进行逆抛物内插？这不是因果倒置了吗？<br />
其实，这里的三个点，并不是划界的结果，而是初始的猜测，通过初始的猜测点进行逆抛物内插，再根据内插点的不同情况，分别作不同的处理，最终可以找到划界的3个点。<br />
例如，我们总要知道两个初始点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b345e1dc09f20fdefdea469f09167892.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a,b" /></span><script type='math/tex'>a,b</script> 吧？好吧，如果你已知的真的只有一个点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script> ，那么 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_92eb5ffee6ae2fec3ad71c777531578f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b" /></span><script type='math/tex'>b</script> 就随便取比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script> 大一点的值好了，这也能凑够两个点啊。通过这两个点，可以通过 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4709d232f6de1eb5e3116dd8f7bf1226.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="c = b + COE \times (b - a)" /></span><script type='math/tex'>c = b + COE \times (b - a)</script> 来得到猜测的第一个 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4a8a08f09d37b73795649038408b5f33.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="c" /></span><script type='math/tex'>c</script> 点（这里的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f10a915e958de33deceb8525ce3338b7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="COE" /></span><script type='math/tex'>COE</script> 表示一个系数，例如1.618），从而可以通过这3点开始逆抛物内插。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
一个实用的划界程序还是挺复杂的&mdash;&mdash;这里的复杂是比较于上面陈述的最简单的划界算法来说的，因为要保证程序在很多&ldquo;意外情况&rdquo;下都能正确运行，必须做很多工作。这里就不分析具体的程序了，大家可以到网上找来看一下。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
