{"id":1797,"date":"2016-12-13T21:41:14","date_gmt":"2016-12-13T12:41:14","guid":{"rendered":"https:\/\/www.iss.ai\/?p=1797"},"modified":"2016-12-13T21:41:14","modified_gmt":"2016-12-13T12:41:14","slug":"%e7%b2%92%e5%ad%90%e7%be%a4%e6%9c%80%e9%81%a9%e5%8c%96","status":"publish","type":"post","link":"https:\/\/www.iss.ai\/?p=1797","title":{"rendered":"\u7c92\u5b50\u7fa4\u6700\u9069\u5316"},"content":{"rendered":"\t\t\t\t<p>\u6700\u9069\u5316\u624b\u6cd5\u306b\u3064\u3044\u3066\u8abf\u3079\u3066\u3044\u305f\u3068\u3053\u308d\uff0cwikipedia\u306b\u7c92\u5b50\u7fa4\u6700\u9069\u5316\u3068\u3044\u3046\u65b9\u6cd5\u304c\u3042\u3063\u305f\u306e\u3067\uff0c\u5b9f\u88c5\u3057\u3066\u307f\u305f\uff0e<\/p>\n\t\t\t\t<p>wikipedia\u306e\u8a18\u8ff0\u3069\u304a\u308a\u306b\u3056\u3063\u304f\u308a\u3068\u5b9f\u88c5\uff0e\u30d1\u30e9\u30e1\u30bf\u306e\u6b21\u5143\u6570\u3092\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5f15\u6570\u306b\u3057\u3066\u3042\u308b\uff0e<\/p>\n\t\t\t\t<pre>\r\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/&#x5B;ParticleSwarmOpt.h]\r\n\/\/\t\u7c92\u5b50\u7fa4\u6700\u9069\u5316\r\n\r\n#pragma once\r\n\r\n#include &lt;vector&gt;\r\n#include &lt;array&gt;\r\n\r\n\/\/&quot;\u7c92\u5b50\u7fa4\u6700\u9069\u5316&quot;\u306b\u3088\u308b\u76ee\u7684\u95a2\u6570\u306e\u6700\u5c0f\u5316\r\n\/\/\tN_PARAM : \u6700\u9069\u5316\u5bfe\u8c61\u30d1\u30e9\u30e1\u30bf\u306e\u500b\u6570(\u6b21\u5143\u6570)\r\n\/\/\r\n\/\/&#x5B;\u4f7f\u3044\u65b9]\r\n\/\/\t\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\uff1a\r\n\/\/\t\t\u3053\u308c\u3092\u7d99\u627f\u3057\u3066\uff0c\u4eee\u60f3\u95a2\u6570\u3092\u5b9f\u88c5\u3059\u308b\uff0e\r\n\/\/\t\u6700\u9069\u5316\u8a08\u7b97\uff1a\r\n\/\/\t\t1) Initialize()\u3067\u521d\u671f\u5316\r\n\/\/\t\t2) Update()\u3092\u4efb\u610f\u56de\u30b3\u30fc\u30eb\u3057\u3066\u6700\u9069\u5316\r\n\/\/\t\t3) GetCurrBestParam()\u3067\u7d50\u679c\u30d1\u30e9\u30e1\u30bf\u5024\u3092\u53d6\u5f97\r\ntemplate&lt; size_t N_PARAM &gt;\r\nclass PSO\r\n{\r\npublic:\r\n\t\/\/\u30d1\u30e9\u30e1\u30bf\u30d9\u30af\u30c8\u30ebX\u304a\u3088\u3073\u901f\u5ea6V\u306e\u578b\r\n\ttypedef std::array&lt;double,N_PARAM&gt; Vec_t;\r\nprotected:\r\n\t\/\/\u7c92\u5b50\u60c5\u5831(CreateInitialState()\u5f15\u6570\u7528)\r\n\tstruct ParticleSetting\r\n\t{\r\n\t\tVec_t X0;\t\/\/\u521d\u671f\u4f4d\u7f6e\r\n\t\tVec_t V0;\t\/\/\u521d\u671f\u901f\u5ea6\r\n\t\tstd::vector&lt; unsigned int &gt; GroupIndexesBelong;\t\/\/\u7c92\u5b50\u304c\u6240\u5c5e\u30b0\u30eb\u30fc\u30d7\u7fa4\u306eindex\r\n\t};\r\nprivate:\r\n\t\/\/\u7c92\u5b50\r\n\tstruct Particle\r\n\t{\r\n\t\tVec_t X;\t\/\/\u73fe\u5728\u4f4d\u7f6e\r\n\t\tVec_t V;\t\/\/\u901f\u5ea6\r\n\t\tVec_t BestX;\t\/\/\u3053\u306e\u7c92\u5b50\u306e\uff0c\u904e\u53bb\u6700\u826f\u76ee\u7684\u95a2\u6570\u5024\u306b\u306a\u3063\u305f\u4f4d\u7f6e\r\n\t\tdouble BestOFV;\t\/\/\u3053\u306e\u7c92\u5b50\uff0c\u904e\u53bb\u6700\u826f\u76ee\u7684\u95a2\u6570\u5024\r\n\t\tstd::vector&lt; struct Group* &gt; Groups;\t\/\/\u3053\u306e\u7c92\u5b50\u304c\u6240\u5c5e\u3059\u308b\u30b0\u30eb\u30fc\u30d7\r\n\r\n\t\tParticle(){\tBestOFV = std::numeric_limits&lt;double&gt;::max();\t}\r\n\t};\r\n\r\n\t\/\/\u30b0\u30eb\u30fc\u30d7\r\n\tstruct Group\r\n\t{\r\n\t\tVec_t BestX;\t\/\/\u3053\u306e\u30b0\u30eb\u30fc\u30d7\u306e\uff0c\u904e\u53bb\u6700\u826f\u76ee\u7684\u95a2\u6570\u5024\u306b\u306a\u3063\u305f\u4f4d\u7f6e\r\n\t\tdouble BestOFV;\t\/\/\u3053\u306e\u30b0\u30eb\u30fc\u30d7\u306e\uff0c\u904e\u53bb\u6700\u826f\u76ee\u7684\u95a2\u6570\u5024\r\n\t\t\r\n\t\tGroup(){\tBestOFV = std::numeric_limits&lt;double&gt;::max();\t}\r\n\t};\r\n\r\n\t\/\/-----------------------------------------------------\r\npublic:\r\n\tPSO()\r\n\t{\r\n\t\tSetParam( 1.0, 1.0, 1.0 );\r\n\t\tm_GlobalBestOFV = std::numeric_limits&lt;double&gt;::max();\r\n\t}\r\n\r\npublic:\r\n\t\/\/\u51e6\u7406\u30d1\u30e9\u30e1\u30bf\u5024\u306eSet,Get\r\n\tvoid SetParam( double W, double C1, double C2 )\r\n\t{\tm_W=W;\tm_C1=C1;\tm_C2=C2;\t}\r\n\r\n\tdouble W() const {\treturn m_W;\t}\r\n\tdouble C1() const {\treturn m_C1;\t}\r\n\tdouble C2() const {\treturn m_C2;\t}\r\n\r\n\t\/\/\u521d\u671f\u72b6\u614b\u306e\u751f\u6210.\r\n\t\/\/\u6700\u9069\u5316\u51e6\u7406\u306e\u6700\u521d\u306e\u72b6\u614b\u3092\u751f\u6210\u3059\u308b\uff0e\r\n\t\/\/Update()\u306e\u7e70\u308a\u8fd4\u3057\u3092\u884c\u3046\u524d\u306b\uff0c\u30b3\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\r\n\tbool Initialize();\r\n\r\n\t\/\/\u6700\u9069\u5316\u51e6\u7406\u306e1step\u3092\u5b9f\u884c\uff0e\r\n\t\/\/Initialize()\u306b\u6210\u529f\u3057\u305f\u3089\uff0c\u6c17\u304c\u6e08\u3080\u307e\u3067\u3053\u308c\u3092\u7e70\u308a\u8fd4\u3057\u30b3\u30fc\u30eb\u3059\u308b\u3053\u3068\u3067\u6700\u9069\u5316\u51e6\u7406\u3092\u9032\u884c\u3055\u305b\u308b\uff0e\r\n\t\/\/&#x5B;Ret]\r\n\t\/\/\t\u6700\u826f\u30d1\u30e9\u30e1\u30bf\uff08GetCurrBestParam()\u304c\u8fd4\u3059\u5024\uff09\u304c\u66f4\u65b0\u3055\u308c\u305f\u5834\u5408\u306ftrue\uff0e\r\n\tbool Update();\r\n\r\n\t\/\/\u7d50\u679c\u53d6\u5f97\r\n\tVec_t GetCurrBestParam() const {\treturn m_GlobalBestX;\t}\r\n\tdouble GetObjectiveFuncVal_at_CurrBestParam() const {\treturn m_GlobalBestScore;\t}\r\n\r\n\r\n\t\/\/\u7c92\u5b50\u4f4d\u7f6e\u60c5\u5831\u53d6\u5f97(\u72b6\u614b\u898b\u308b\u7528)\r\n\tvoid GetCurrParamsOfPartilces( std::vector&lt;Vec_t&gt; &amp;rDst )\r\n\t{\r\n\t\trDst.resize( m_Particles.size() );\r\n\t\tfor( size_t i=0; i&lt;m_Particles.size(); ++i )\r\n\t\t{\trDst&#x5B;i] = m_Particles&#x5B;i].X;\t}\r\n\t}\r\n\t\/\/\u7c92\u5b50\u901f\u5ea6\u60c5\u5831\u53d6\u5f97(\u72b6\u614b\u898b\u308b\u7528)\r\n\tvoid GetCurrVelocityOfPartilces( std::vector&lt;Vec_t&gt; &amp;rDst )\r\n\t{\r\n\t\trDst.resize( m_Particles.size() );\r\n\t\tfor( size_t i=0; i&lt;m_Particles.size(); ++i )\r\n\t\t{\trDst&#x5B;i] = m_Particles&#x5B;i].V;\t}\r\n\t}\r\n\r\n\t\/\/-----------------------------------------------------\r\nprotected:\r\n\t\/\/\u4e71\u6570\u3067 0&lt;=ret&lt;=1 \u306a\u5024\u3092\u8fd4\u3059\r\n\tvirtual double Rand0to1() = 0;\r\n\r\n\t\/\/\u30d1\u30e9\u30e1\u30bf\u5024X\u306b\u5bfe\u3059\u308b\u76ee\u7684\u95a2\u6570\u5024f(X)\u306e\u8a08\u7b97\uff0e\r\n\t\/\/&#x5B;Args]\r\n\t\/\/\tX : \u4f4d\u7f6e(\u30d1\u30e9\u30e1\u30bf\u5024)\r\n\t\/\/&#x5B;Ret]\r\n\t\/\/\t\u4f4d\u7f6eX\u306b\u304a\u3051\u308b\u76ee\u7684\u95a2\u6570\u5024\u3092\u8fd4\u3059\uff0e\r\n\tvirtual double ObjectiveFunc( const Vec_t &amp;X ) = 0;\r\n\r\n\t\/\/\u521d\u671f\u5316\uff0e\r\n\t\/\/\u7c92\u5b50\u7fa4\u306e\u521d\u671f\u72b6\u614b\u3068\uff0c\u30b0\u30eb\u30fc\u30d7\u306e\u500b\u6570\u3092\u5f15\u6570\u306b\u8a2d\u5b9a\u3057\u3066\u8fd4\u3059\uff0e\r\n\t\/\/&#x5B;Args]\r\n\t\/\/\trDstParticles : \u7c92\u5b50\u7fa4\u521d\u671f\u72b6\u614b\u53d7\u53d6\r\n\t\/\/\trDst_nGroup : \u30b0\u30eb\u30fc\u30d7\u500b\u6570\u53d7\u53d6\uff0e\uff08\u6b63\u5e38\u306a\u5024\u306f1\u4ee5\u4e0a\uff09\r\n\t\/\/&#x5B;Ret]\r\n\t\/\/\t\u6210\u529f\u6642\u306ftrue\uff0c\u5931\u6557\u6642\u306ffalse\r\n\tvirtual bool CreateInitialState( std::vector&lt;ParticleSetting&gt; &amp;rDstParticles, unsigned int &amp;rDst_nGroup ) = 0;\r\n\r\n\t\/\/-----------------------------------------------------\r\nprivate:\r\n\t\/\/\u7c92\u5b50\u306e\u79fb\u52d5\r\n\tvoid MoveParticle( Particle &amp;P )\r\n\t{\r\n\t\t\/\/\u7c92\u5b50\u304c\u5c5e\u3059\u308b\u30b0\u30eb\u30fc\u30d7\u7fa4\u306e\u4e2d\u3067\uff0c\u6700\u3082\u826f\u3044\u7d50\u679c\u3092\u63a2\u7d22\r\n\t\tVec_t GroupX;\r\n\t\t{\r\n\t\t\tdouble OFV = std::numeric_limits&lt;double&gt;::max();\r\n\t\t\tfor( auto pG : P.Groups )\r\n\t\t\t{\r\n\t\t\t\tif( pG-&gt;BestOFV &lt; OFV )\r\n\t\t\t\t{\r\n\t\t\t\t\tOFV = pG-&gt;BestOFV;\r\n\t\t\t\t\tGroupX = pG-&gt;BestX;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\/\/\u901f\u5ea6\u306e\u66f4\u65b0\u3068\u79fb\u52d5\r\n\t\tfor( size_t i=0; i&lt;N_PARAM; ++i )\r\n\t\t{\r\n\t\t\tP.V&#x5B;i] *= m_W;\r\n\t\t\tP.V&#x5B;i] += m_C1 * Rand0to1() * ( P.BestX&#x5B;i] - P.X&#x5B;i] );\r\n\t\t\tP.V&#x5B;i] += m_C2 * Rand0to1() * ( GroupX&#x5B;i] - P.X&#x5B;i] );\r\n\r\n\t\t\tP.X&#x5B;i] += P.V&#x5B;i];\r\n\t\t}\r\n\t}\r\n\r\n\t\/\/\u76ee\u7684\u95a2\u6570\u5024\u306e\u66f4\u65b0\r\n\t\/\/\u30b0\u30ed\u30fc\u30d0\u30eb\u306a\u6700\u826f\u5024\u304c\u66f4\u65b0\u3055\u308c\u305f\u3089true\u3092\u8fd4\u3059\r\n\tbool UpdateOFV( Particle &amp;P )\r\n\t{\r\n\t\tdouble OFV = ObjectiveFunc( P.X );\r\n\t\tif( OFV &gt;= P.BestOFV )\r\n\t\t{\treturn false;\t}\r\n\r\n\t\tP.BestOFV = OFV;\r\n\t\tP.BestX = P.X;\r\n\t\tbool ret = false;\r\n\r\n\t\tfor( auto pG : P.Groups )\r\n\t\t{\r\n\t\t\tif( OFV &lt; pG-&gt;BestOFV )\r\n\t\t\t{\r\n\t\t\t\tpG-&gt;BestOFV = OFV;\r\n\t\t\t\tpG-&gt;BestX = P.BestX;\r\n\r\n\t\t\t\tif( OFV &lt; m_GlobalBestOFV )\r\n\t\t\t\t{\r\n\t\t\t\t\tm_GlobalBestOFV = OFV;\r\n\t\t\t\t\tm_GlobalBestX = P.BestX;\r\n\t\t\t\t\tret = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\nprivate:\r\n\tstd::vector&lt; Particle &gt; m_Particles;\t\/\/\u7c92\u5b50\u7fa4\r\n\tstd::vector&lt; Group &gt; m_Groups;\t\/\/\u30b0\u30eb\u30fc\u30d7\u7fa4\r\n\tVec_t m_GlobalBestX;\t\/\/\u7c92\u5b50\u7fa4\u5168\u4f53\u306e\uff0c\u904e\u53bb\u6700\u826f\u76ee\u7684\u95a2\u6570\u5024\u306b\u306a\u3063\u305f\u4f4d\u7f6e\r\n\tdouble m_GlobalBestOFV;\t\/\/\u7c92\u5b50\u7fa4\u5168\u4f53\u306e\uff0c\u904e\u53bb\u6700\u826f\u76ee\u7684\u95a2\u6570\u5024\r\n\r\n\t\/\/\u901f\u5ea6V\u306e\u66f4\u65b0\u5f0f\u306e\u30d1\u30e9\u30e1\u30bf\r\n\tdouble m_W;\t\/\/\u6163\u6027\u5b9a\u6570\r\n\tdouble m_C1, m_C2;\t\/\/\u7c92\u5b50\u304c\u81ea\u8eab\u306e\u30d9\u30b9\u30c8\u4f4d\u7f6e\u65b9\u5411\u306b\u3044\u304f\u5ea6\u5408\uff0c\u30b0\u30eb\u30fc\u30d7\u306e\u30d9\u30b9\u30c8\u4f4d\u7f6e\u306b\u884c\u304f\u5ea6\u5408\r\n};\r\n\r\n\/\/Initialize()\r\ntemplate&lt; size_t N_PARAM &gt;\r\nbool PSO&lt;N_PARAM&gt;::Initialize()\r\n{\r\n\t\/\/\u521d\u671f\u60c5\u5831\u306e\u53d6\u5f97\r\n\tstd::vector&lt;ParticleSetting&gt; PSs;\r\n\tunsigned int nGroups = 0;\r\n\tif( !CreateInitialState( PSs, nGroups ) )\r\n\t{\treturn false;\t}\r\n\r\n\t\/\/\u8fd4\u3063\u3066\u304d\u305f\u30c7\u30fc\u30bf\u306e\u30c1\u30a7\u30c3\u30af\r\n\tif( nGroups==0 || PSs.empty() )\r\n\t{\treturn false;\t}\r\n\r\n\tfor( const auto &amp;PS : PSs )\r\n\t{\r\n\t\tif( PS.GroupIndexesBelong.empty() )\r\n\t\t{\treturn false;\t}\r\n\r\n\t\tfor( unsigned int g : PS.GroupIndexesBelong )\r\n\t\t{\r\n\t\t\tif( g &gt;= nGroups )\r\n\t\t\t{\treturn false;\t}\r\n\t\t}\r\n\t}\r\n\r\n\t\/\/\u65e2\u5b58\u30c7\u30fc\u30bf\u7834\u68c4\r\n\tm_Groups.clear();\r\n\tm_Particles.clear();\r\n\tm_GlobalBestOFV = std::numeric_limits&lt;double&gt;::max();\r\n\r\n\t\/\/\u30c7\u30fc\u30bf\u751f\u6210\r\n\tm_Groups.resize( nGroups );\r\n\tm_Particles.resize( PSs.size() );\r\n\r\n\tauto iP = m_Particles.begin();\r\n\tfor( const auto &amp;PS : PSs )\r\n\t{\r\n\t\tiP-&gt;X = iP-&gt;BestX = PS.X0;\r\n\t\tiP-&gt;V = PS.V0;\r\n\t\tiP-&gt;Groups.reserve( PS.GroupIndexesBelong.size() );\r\n\t\tfor( unsigned int g : PS.GroupIndexesBelong )\r\n\t\t{\r\n\t\t\tiP-&gt;Groups.push_back( &amp;(m_Groups&#x5B;g]) );\r\n\t\t}\r\n\r\n\t\tUpdateOFV( *iP );\r\n\t\tiP++;\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\n\/\/Update()\r\ntemplate&lt; size_t N_PARAM &gt;\r\nbool PSO&lt;N_PARAM&gt;::Update()\r\n{\r\n\t\/\/\u7c92\u5b50\u7fa4\u306e\u79fb\u52d5\r\n\tfor( auto &amp;P : m_Particles )\r\n\t{\tMoveParticle( P );\t}\r\n\r\n\t\/\/\u76ee\u7684\u95a2\u6570\u8a08\u7b97\u3068\uff0c\uff5b\u30b0\u30eb\u30fc\u30d7\uff0c\u30b0\u30ed\u30fc\u30d0\u30eb\uff5d\u60c5\u5831\u66f4\u65b0\r\n\tbool bGlobalUpdated = false;\r\n\tfor( auto &amp;P : m_Particles )\r\n\t{\r\n\t\tbGlobalUpdated |= UpdateOFV( P );\r\n\t}\r\n\treturn bGlobalUpdated;\r\n}\r\n<\/pre>\n\t\t\t\t<p>\u3067\uff0c\uff12\u6b21\u5143\u30d1\u30e9\u30e1\u30bf\u7a7a\u9593\u3067\u52d5\u4f5c\u30c6\u30b9\u30c8\u3057\u3066\u307f\u308b\uff0e\u3064\u307e\u3089\u306a\u3044\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\uff0e<\/p>\n\t\t\t\t<pre>\r\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;ParticleSwarmOpt.h&quot;\r\n\r\n#include &quot;opencv2\/core\/core.hpp&quot;\r\n#include &quot;opencv2\/highgui\/highgui.hpp&quot;\r\n#include &quot;opencv2\/imgproc\/imgproc.hpp&quot;\r\n\r\n#include &lt;random&gt;\r\n#include &lt;iostream&gt;\r\n\r\nclass TestOpt : public PSO&lt;2&gt;\r\n{\r\npublic:\r\n\tTestOpt()\r\n\t\t: m_RandomEngine( std::random_device()() )\r\n\t{\r\n\t}\r\n\r\npublic:\r\n\tvoid Show()\r\n\t{\r\n\t\tcv::cvtColor( m_FuncMap, m_ShowImg, CV_GRAY2BGR );\r\n\r\n\t\tstd::vector&lt; Vec_t &gt; Xs, Vs;\r\n\t\tGetCurrParamsOfPartilces( Xs );\r\n\t\tGetCurrVelocityOfPartilces( Vs );\r\n\t\t\r\n\t\tsize_t n = Xs.size();\r\n\t\tfor( size_t i=0; i&lt;n; ++i )\r\n\t\t{\r\n\t\t\tcv::Point P0( cvRound(Xs&#x5B;i]&#x5B;0]), cvRound(Xs&#x5B;i]&#x5B;1]) );\r\n\t\t\tcv::circle( m_ShowImg, P0, 2, cv::Scalar(0,255,32), -1 );\r\n\r\n\t\t\tcv::Point P1( cvRound(Xs&#x5B;i]&#x5B;0]+Vs&#x5B;i]&#x5B;0]), cvRound(Xs&#x5B;i]&#x5B;1]+Vs&#x5B;i]&#x5B;1]) );\r\n\t\t\tcv::line( m_ShowImg, P0,P1, cv::Scalar(255,32,32) );\r\n\t\t}\r\n\r\n\t\tVec_t BestX = GetCurrBestParam();\r\n\t\tcv::circle( m_ShowImg, cv::Point( cvRound(BestX&#x5B;0]),cvRound(BestX&#x5B;1]) ), 3, cv::Scalar(0,0,255), -1 );\r\n\r\n\t\tcv::imshow( &quot;PSO&lt;2&gt;&quot;, m_ShowImg );\r\n\t}\r\n\r\nprotected:\r\n\t\/\/\r\n\tvirtual double ObjectiveFunc( const Vec_t &amp;X ) override\r\n\t{\r\n\t\tint x = cvRound( X&#x5B;0] );\r\n\t\tint y = cvRound( X&#x5B;1] );\r\n\t\tif( x&lt;0 || x&gt;=m_FuncMap.cols || y&lt;0 || y&gt;=m_FuncMap.rows )\r\n\t\t{\treturn 1000;\t}\t\/\/\u203b\u9069\u5f53\u306b\u3067\u304b\u3044\u5024\r\n\r\n\t\treturn m_FuncMap.at&lt;unsigned char&gt;( y,x );\r\n\t}\r\n\r\n\t\/\/\r\n\tvirtual double Rand0to1() override\r\n\t{\treturn std::uniform_real_distribution&lt;&gt;(0.0,1.0)( m_RandomEngine );\t}\r\n\r\n\t\/\/\r\n\tvirtual bool CreateInitialState( std::vector&lt;ParticleSetting&gt; &amp;rDstParticles, unsigned int &amp;rDst_nGroup ) override\r\n\t{\r\n\t\tconst int W = 320;\r\n\t\tconst int H = 240;\r\n\t\t{\/\/\u76ee\u7684\u95a2\u6570\u306e\u5177\u5408\u3092\u3066\u304d\u3068\u30fc\u306b\u3064\u304f\u308b\r\n\t\t\tm_FuncMap.create( H,W, CV_8UC1 );\r\n\t\t\tfor( int y=0; y&lt;H; ++y )\r\n\t\t\t{\r\n\t\t\t\tunsigned char *p = m_FuncMap.ptr&lt;unsigned char&gt;( y );\r\n\t\t\t\tfor( int x=0; x&lt;W; ++x, ++p )\r\n\t\t\t\t{\r\n\t\t\t\t\t*p = cvRound( Rand0to1()*128 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tint x = cvRound( W*0.1 + W*0.8*Rand0to1() );\r\n\t\t\tint y = cvRound( H*0.1 + H*0.8*Rand0to1() );\r\n\t\t\tcv::circle( m_FuncMap, cv::Point(x,y), 7, cv::Scalar(0), -1 );\r\n\t\t\t\/\/m_FuncMap.at&lt;unsigned char&gt;(y,x) = 0;\r\n\r\n\t\t\tcv::medianBlur( m_FuncMap, m_FuncMap, 15 );\r\n\r\n\t\t\tstd::cout &lt;&lt; &quot;\u6b63\u89e3\u306e\u7b87\u6240 = (&quot; &lt;&lt; x &lt;&lt; &quot;, &quot; &lt;&lt; y &lt;&lt; &quot;)&quot; &lt;&lt; std::endl;\r\n\t\t}\r\n\r\n\t\t\/\/\r\n\t\tconst unsigned int N = 100;\r\n\t\trDst_nGroup = N;\r\n\t\trDstParticles.resize( N );\r\n\r\n\t\tconst double PI = acos(-1.0);\r\n\t\tfor( unsigned int i=0; i&lt;N; ++i )\r\n\t\t{\r\n\t\t\tParticleSetting &amp;P = rDstParticles&#x5B;i];\r\n\r\n\t\t\tP.X0&#x5B;0] = Rand0to1() * (W-1);\r\n\t\t\tP.X0&#x5B;1] = Rand0to1() * (H-1);\r\n\t\t\tdouble V = Rand0to1()*5;\r\n\t\t\tdouble theta = 2*PI*Rand0to1();\r\n\t\t\tP.V0&#x5B;0] = V * cos( theta );\r\n\t\t\tP.V0&#x5B;1] = V * sin( theta );\r\n\r\n\t\t\tP.GroupIndexesBelong.reserve( 3 );\r\n\t\t\tP.GroupIndexesBelong.push_back( i&gt;1  ?  i-1  :  N-1 );\r\n\t\t\tP.GroupIndexesBelong.push_back( i );\r\n\t\t\tP.GroupIndexesBelong.push_back( i+1&lt;N  ?  i+1  :  0 );\r\n\t\t}\r\n\r\n\t\t\/\/\r\n\t\tm_ShowImg.create( H,W, CV_8UC3 );\r\n\t\treturn true;\r\n\t}\r\n\r\nprivate:\r\n\tstd::mt19937 m_RandomEngine;\r\n\tcv::Mat m_FuncMap;\r\n\tcv::Mat m_ShowImg;\r\n};\r\n\r\n\/\/\r\nint _tmain(int argc, _TCHAR* argv&#x5B;])\r\n{\r\n\tTestOpt Test;\r\n\r\n\tTest.SetParam( 0.8, 1, 1 );\r\n\tif( !Test.Initialize() )return 0;\r\n\r\n\tstd::cout &lt;&lt; &quot;Initial&quot; &lt;&lt; std::endl;\r\n\tTest.Show();\r\n\tcv::waitKey();\r\n\r\n\tunsigned int iter = 0;\r\n\tdo\r\n\t{\r\n\t\t++iter;\r\n\t\tstd::cout &lt;&lt; &quot;step &quot; &lt;&lt; iter;\r\n\t\tif( Test.Update() ){\tstd::cout &lt;&lt; &quot; *&quot;;\t}\r\n\t\tstd::cout &lt;&lt; std::endl;\r\n\t\tTest.Show();\r\n\t}\r\n\twhile( cv::waitKey(0)!='q' );\r\n\r\n\treturn 0;\r\n}\r\n<\/pre>\n\t\t\t\t<p>\u9069\u5f53\u306b\u4e71\u6570\u3067\u30b0\u30ec\u30fc\u30b9\u30b1\u30fc\u30eb\u753b\u50cf\u3092\u4f5c\u308a\uff0c\uff12\u6b21\u5143\u30d1\u30e9\u30e1\u30bf\u7a7a\u9593\u4e0a\u306e\u76ee\u7684\u95a2\u6570\u3060\u3068\u3044\u3046\u3053\u3068\u306b\u3059\u308b\uff0e\u9ed2\u3044\u3068\u3053\u308d\u307b\u3069\u95a2\u6570\u5024\u304c\u5c0f\u3055\u3044\uff0e<br \/>\n\t\t\t\t\u30fb\u7dd1\u306e\u25cf\u304c\u7c92\u5b50\uff0e<br \/>\n\t\t\t\t\u30fb\u7c92\u5b50\u304b\u3089\u51fa\u3066\u3044\u308b\u9752\u3044\u7dda\u304c\u7c92\u5b50\u306e\u901f\u5ea6<br \/>\n\t\t\t\t\u30fb\u8d64\u25cf\u306f\u3053\u308c\u307e\u3067\u306b\u898b\u3064\u3051\u305f\u6700\u826f\u306e\u30d1\u30e9\u30e1\u30bf\u306e\u4f4d\u7f6e\uff0e<\/p>\n\t\t\t\t<p><a href=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/Init.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1791\" title=\"Init\" src=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/Init.png\" alt=\"Init\" width=\"327\" height=\"271\" srcset=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/Init.png 327w, https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/Init-300x248.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/a><br \/>\n\t\t\t\t\u521d\u671f\u72b6\u614b\u306e\u7c92\u5b50\u3092\u30e9\u30f3\u30c0\u30e0\u306b\u914d\u7f6e\u3057\u305f\u69d8\u5b50\uff0e<br \/>\n\t\t\t\t\u753b\u50cf\u5de6\u4e0b\u4ed8\u8fd1\u306e\u30d6\u30e9\u30c3\u30af\u30db\u30fc\u30eb\u3063\u307d\u3044\u500b\u6240\u304c\u76ee\u7684\u95a2\u6570\u304c\u6700\u5c0f\u306b\u306a\u308b\u5834\u6240\u3067\u3042\u308b\u304c\uff0c\u521d\u671f\u914d\u7f6e\u3067\u306f\u7c92\u5b50\u304c\u305d\u306e\u3042\u305f\u308a\u306b\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\uff0c\u30ed\u30fc\u30ab\u30eb\u30df\u30cb\u30de\u30e0\u306a\u7b87\u6240\u306b\u8d64\u25cf\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\uff0e<br \/>\n\t\t\t\t\u554f\u984c\u306f\u7c92\u5b50\u306e\u30b0\u30eb\u30fc\u30d7\u8a2d\u5b9a\u3092\u3069\u3046\u3059\u308b\u304b\u3067\u3042\u308b\u304c\uff0c\u5168\u7c92\u5b50\u304c\uff11\u3064\u306e\u30b0\u30eb\u30fc\u30d7\u3068\u3044\u3046\u306e\u3060\u3068\u306a\u3093\u3068\u306a\u304f\u3064\u307e\u3089\u306a\u3044\u306e\u3067\uff0c\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u3092\u898b\u3066\u308f\u304b\u308b\u3088\u3046\u306b\uff0c\uff11\u7c92\u5b50\u304c\uff13\u30b0\u30eb\u30fc\u30d7\u306b\u5c5e\u3059\u308b\u5f62\u306b\u3057\u3066\u307f\u305f\uff0e\u3053\u308c\u3060\u3068\uff0c\u3042\u308b\u7c92\u5b50\u304c\u3053\u308c\u307e\u3067\u3088\u308a\u826f\u3044\u5834\u6240\u3092\u898b\u3064\u3051\u3066\u3082\uff0c\u5225\u30b0\u30eb\u30fc\u30d7\u306e\u7c92\u5b50\u306b\u305d\u306e\u60c5\u5831\u304c\u4f1d\u9054\u3059\u308b\u306e\u306b\u3042\u308b\u7a0b\u5ea6\u6642\u9593\u304c\u304b\u304b\u308b\u30cf\u30ba\uff0e<br \/>\n\t\t\t\t\u3053\u306e\u72b6\u614b\u304b\u3089\u6700\u9069\u5316\u51e6\u7406\u958b\u59cb\uff0e\u3068\u308a\u3042\u3048\u305a1000step\u8d70\u3089\u305b\u3066\u307f\u305f\uff0e<br \/>\n\t\t\t\t\u2193<br \/>\n\t\t\t\t<a href=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step2.png\" alt=\"step2\" title=\"step2\" width=\"327\" height=\"271\" class=\"alignleft size-full wp-image-1792\" srcset=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step2.png 327w, https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step2-300x248.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/a><br \/>\n\t\t\t\t2step\u76ee\u3067\u65e9\u304f\u3082\u7c92\u5b50\u306e\u4e00\u3064\u304c\u5076\u7136\u6700\u5c0f\u5024\u4ed8\u8fd1\u306b\u5230\u9054\uff0e<br \/>\n\t\t\t\t\u79fb\u52d5\u901f\u5ea6\u304c\u3068\u3066\u3082\u5927\u304d\u3044\u7c92\u5b50\u304c\u591a\u6570\u5b58\u5728\u3057\u3066\u3044\u308b\u304c\uff0c\u5143\u30cd\u30bf\u306e\u5f0f\u306b\u5fe0\u5b9f\u3060\u3068\u591a\u5206\u3053\u3046\u306a\u308b\u306e\u304c\u6b63\u89e3\u3067\u3042\u308d\u3046\uff0e\uff08\u7528\u9014\u6b21\u7b2c\u3067\u306f\u6700\u5927\u901f\u5ea6\u5236\u9650\u306a\u3069\u3057\u3066\u3082\u3088\u3044\u304b\uff1f\uff09<br \/>\n\t\t\t\t\u2193<br \/>\n\t\t\t\t<a href=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step6.png\" alt=\"step6\" title=\"step6\" width=\"327\" height=\"271\" class=\"alignleft size-full wp-image-1793\" srcset=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step6.png 327w, https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step6-300x248.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/a><br \/>\n\t\t\t\tstep6\uff0e\u3055\u3089\u306b\u89e3\u304c\u66f4\u65b0\u3055\u308c\u305f\uff0e<br \/>\n\t\t\t\t\u60c5\u5831\u4f1d\u9054\u306b\u6642\u9593\u304c\u304b\u304b\u308b\u305f\u3081\uff08\u5168\u7c92\u5b50\u306b\u3053\u306e\u8d64\u25cf\u306e\u60c5\u5831\u304c\u3044\u304d\u308f\u305f\u308b\u306b\u306f50step\u304f\u3089\u3044\u5fc5\u8981\u306b\u306a\u308b\uff09\uff0c\u307e\u3060\u8d64\u25cf\u306e\u7b87\u6240\u306b\u7c92\u5b50\u304c\u96c6\u307e\u3063\u3066\u304f\u308b\u6c17\u914d\u306f\u306a\u3044\uff0e<br \/>\n\t\t\t\t\u2193<br \/>\n\t\t\t\t<a href=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step108.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step108.png\" alt=\"step108\" title=\"step108\" width=\"327\" height=\"271\" class=\"alignleft size-full wp-image-1794\" srcset=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step108.png 327w, https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step108-300x248.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/a><br \/>\n\t\t\t\tstep108\uff0e\u3060\u3044\u3076\u7c92\u5b50\u304c\u8d64\u25cf\u4ed8\u8fd1\u306b\u96c6\u307e\u3063\u3066\u3044\u308b\u304c\uff0c\u4ed6\u306e\u3044\u304f\u3064\u304b\u306e\u30ed\u30fc\u30ab\u30eb\u30df\u30cb\u30de\u30e0\u306a\u7b87\u6240\u306b\u3082\u7c92\u5b50\u304c\u96c6\u307e\u3063\u3066\u3044\u308b\uff0e<br \/>\n\t\t\t\t\u2193<br \/>\n\t\t\t\t<a href=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step550.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step550.png\" alt=\"step550\" title=\"step550\" width=\"327\" height=\"271\" class=\"alignleft size-full wp-image-1795\" srcset=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step550.png 327w, https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step550-300x248.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/a><br \/>\n\t\t\t\tstep550\uff0e\u591a\u304f\u306e\u7c92\u5b50\u304c\u8d64\u25cf\u4ed8\u8fd1\u306b\u5438\u3044\u5bc4\u305b\u3089\u308c\u305f\uff0e<br \/>\n\t\t\t\t\u2193<br \/>\n\t\t\t\t<a href=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step1000.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step1000.png\" alt=\"step1000\" title=\"step1000\" width=\"327\" height=\"271\" class=\"alignleft size-full wp-image-1796\" srcset=\"https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step1000.png 327w, https:\/\/www.iss.ai\/wp-content\/uploads\/2016\/12\/step1000-300x248.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/a><br \/>\n\t\t\t\tstep1000\uff0e\u307e\u3060\u30d1\u30e9\u30e1\u30bf\u7a7a\u9593\u4e0a\u3092\u98db\u3073\u307e\u308f\u3063\u3066\u63a2\u7d22\u3057\u3066\u3044\u308b\u7c92\u5b50\u304c\u6b8b\u3063\u3066\u3044\u308b\u306e\u304c\u983c\u3082\u3057\u3044\uff0e<\/p>\n\t\t\t\t<p>\u7c92\u5b50\u4f4d\u7f6e\u306e\u76ee\u7684\u95a2\u6570\u306e\u52fe\u914d\u7b49\u3092\u898b\u308b\u3053\u3068\u306a\u304f\u7c92\u5b50\u306e\u79fb\u52d5\u901f\u5ea6\u304c\u6c7a\u5b9a\u3055\u308c\u308b\u306e\u3067\uff0c\u4e71\u6570\u3068\u7c92\u5b50\u6570\u983c\u307f\u3067\u306f\u3042\u308b\u304c\uff0c\u30d1\u30e9\u30e1\u30bf\u7a7a\u9593\u306e\u5e83\u7bc4\u56f2\u3092\u63a2\u7d22\u3057\u3066\u304f\u308c\u308b\u3053\u3068\u304c\u671f\u5f85\u3067\u304d\u305d\u3046\uff0e<br \/>\n\t\t\t\t\u76ee\u7684\u95a2\u6570\u306eJacobian\u3084Hessian\u304c\u7121\u304f\u3066\u3082\u52d5\u304b\u305b\u308b\u306e\u3067\uff0c\u6ed1\u964d\u30b7\u30f3\u30d7\u30ec\u30c3\u30af\u30b9\u6cd5\u3068\u540c\u69d8\uff0c\u300c\u3068\u308a\u3042\u3048\u305a\u306e\u89e3\u300d\u304c\u624b\u65e9\u304f\u6b32\u3057\u3044\u3068\u304d\u306b\u4f7f\u3048\u308b\u304b\u3082\uff0e<\/p>\n\t\t\t\t<p>\u305f\u3060\u3057\uff0c\u7d42\u4e86\u6761\u4ef6\u306b\u306f\u5de5\u592b\u304c\u8981\u308a\u305d\u3046\u306b\u601d\u3046\uff0e<br \/>\n\t\t\t\tstep\u6570\u3084\uff0c\u89e3\u306e\u66f4\u65b0\u5ea6\u5408\u3068\u3044\u3063\u305f\u6761\u4ef6\u3060\u3051\u3060\u3068\uff0c\u4e0d\u5341\u5206\u306a\u72b6\u614b\u3067\u6b62\u307e\u3063\u3066\u3057\u307e\u3044\u305d\u3046\u306a\u6c17\u304c\u3059\u308b\u306e\u3067\uff0c\u7c92\u5b50\u306e\u5206\u5e03\u306e\u5e83\u304c\u308a\u306e\u3088\u3046\u306a\u3082\u306e\u3092\u898b\u308b\u306a\u3069\u3059\u3079\u304d\u304b\u3082\u3057\u308c\u306a\u3044\uff0e<\/p>\n\t\t\t\t<p>by nakiusagi3<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u9069\u5316\u624b\u6cd5\u306b\u3064\u3044\u3066\u8abf\u3079\u3066\u3044\u305f\u3068\u3053\u308d\uff0cwikipedia\u306b\u7c92\u5b50\u7fa4\u6700\u9069\u5316\u3068\u3044\u3046\u65b9\u6cd5\u304c\u3042\u3063\u305f\u306e\u3067\uff0c\u5b9f\u88c5\u3057\u3066\u307f\u305f\uff0e wikipedia\u306e\u8a18\u8ff0\u3069\u304a\u308a\u306b\u3056\u3063\u304f\u308a\u3068\u5b9f\u88c5\uff0e\u30d1\u30e9\u30e1\u30bf\u306e\u6b21\u5143\u6570\u3092\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5f15\u6570\u306b\u3057\u3066\u3042\u308b\uff0e \/\/&#x5B; [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,3],"tags":[19,35],"class_list":["post-1797","post","type-post","status-publish","format-standard","hentry","category-soft","category-tech","tag-opencv","tag-35"],"_links":{"self":[{"href":"https:\/\/www.iss.ai\/index.php?rest_route=\/wp\/v2\/posts\/1797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.iss.ai\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iss.ai\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iss.ai\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iss.ai\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1797"}],"version-history":[{"count":20,"href":"https:\/\/www.iss.ai\/index.php?rest_route=\/wp\/v2\/posts\/1797\/revisions"}],"predecessor-version":[{"id":1833,"href":"https:\/\/www.iss.ai\/index.php?rest_route=\/wp\/v2\/posts\/1797\/revisions\/1833"}],"wp:attachment":[{"href":"https:\/\/www.iss.ai\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iss.ai\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iss.ai\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}