{"id":498,"date":"2011-06-20T20:52:00","date_gmt":"2011-06-20T12:52:00","guid":{"rendered":"http:\/\/note.systw.net\/note\/?p=498"},"modified":"2023-11-02T20:54:38","modified_gmt":"2023-11-02T12:54:38","slug":"acs","status":"publish","type":"post","link":"https:\/\/systw.net\/note\/archives\/498","title":{"rendered":"ACS"},"content":{"rendered":"\n<p><strong>Ant Algorithm(\u879e\u87fb\u6f14\u7b97\u6cd5)<\/strong><br>1991\u5e74\u7531Dorigo\u9996\u6b21\u63d0\u51fa<br>1997\u5e74\u63d0\u51fa<strong>ACS(Ant Colony System)<\/strong>,\u4e5f\u70ba\u8f03\u7d93\u5178\u4e4b\u7248\u672c<br>\u4e00\u7a2e\u5c0b\u512a\u6f14\u7b97\u6cd5,\u539f\u7406\u70ba\u8cbb\u6d1b\u8499\u6a5f\u5236<\/p>\n\n\n\n<p>\u8cbb\u6d1b\u8499\u6a5f\u5236:<br><strong>1.pheromone\u8a18\u61b6\u8207\u66f4\u65b0<\/strong>:\u4e5f\u5c31\u662f\u6b63\u5411\u53ca\u53cd\u5411\u53cd\u994b\u6a5f\u5236<br>\u5c07\u5e38\u8d70\u8def\u5f91\u4e4bpheromone\u8b8a\u5f37,\u4e0d\u5e38\u8d70\u8def\u5f91\u7684pheromone\u8b8a\u5f31,\u4e26\u5c07\u8f03\u597d\u8def\u5f91\u4e4bpheromone\u52a0\u5f37<br><strong>2.\u6839\u64dapheromone\u6c7a\u5b9a\u8def\u5f91<\/strong>:\u4e5f\u5c31\u662f\u6a5f\u7387\u5c0b\u512a\u65b9\u6cd5<br>\u8a72\u8def\u5f91pheromone\u8d8a\u9ad8,\u9078\u64c7\u8a72\u8def\u5f91\u6a5f\u7387\u8d8a\u9ad8<\/p>\n\n\n\n<p><br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br>\u4ee5\u4e0b\u898f\u5247\u4ee51997\u7248\u4e4bACS\u70ba\u4e3b<\/p>\n\n\n\n<p><strong>\u53c3\u6578\u914d\u7f6e<\/strong><br>n:\u7bc0\u9ede\u6578\u91cf<br>ant\u6578\u91cf,\u5efa\u8b70\u8a2d\u70ban<br>b:\u6c7a\u5b9apheromone\u548c\u8ddd\u96e2\u4e4b\u76f8\u5c0d\u91cd\u8981\u6027,\u901a\u5e38\u8a2d2<br>q0:\u70ba\u9078\u64c7\u63a2\u7d22\u6216\u8ffd\u8e64\u7684\u53c3\u6578,0p:\u7528\u65bc\u5340\u57df\u66f4\u65b0\u7684\u6b98\u7559\u7cfb\u6578,0a:\u7528\u65bc\u5168\u57df\u66f4\u65b0\u7684\u6b98\u7559\u7cfb\u6578,0T0:\u7528\u4f86\u7576\u4e00\u958b\u59cb\u521d\u8def\u5f91\u4e4bpheromone,\u4ee5\u53calocal update\u7684pheromone,\u5efa\u8b70\u8a2d(n*Lnn)^-1<br>ps:Lnn=nearest neighbor heuristic\u70ba\u6240\u6709\u7bc0\u9ede\u4e4b\u9593\u6700\u77ed\u8def\u5f91<\/p>\n\n\n\n<p><strong>ant\u6b65\u9a5f<\/strong><br>\u5927\u81f4\u5982\u4e0b<br>1 \u5404ant\u6839\u64dastate transi<br>tion rule\u6c7a\u5b9a\u4e0b\u4e00\u500b\u76ee\u5730,\u4f46\u8981\u907f\u958b\u4e4b\u524d\u8d70\u904e\u7684<br>2 \u5404ant\u5c0d\u525b\u8d70\u7684\u8def\u5f91\u9032\u884cpheromone local updating 3 \u8fd4\u56de\u6b65\u9a5f1\u76f4\u5230\u6240\u6709\u7bc0\u9ede\u90fd\u5b8c\u6210<br>4 \u6311\u9078\u6700\u4f73\u8def\u5f91\u9032\u884cpheromone global updating<br>5 \u6e05\u7a7a\u672c\u6b21ant\u8def\u5f91<br>6 \u8fd4\u56de\u6b65\u9a5f1\u76f4\u5230\u7d42\u6b62\u689d\u4ef6<br>ps:\u7d42\u6b62\u689d\u4ef6<br>\u901a\u5e38\u8a2d\u70ba\u6700\u5927\u4e16\u4ee3\u6578,\u4f8b\u5982500<br>\u6216\u662f\u5230\u6700\u5f8c\u6bcf\u500b\u4e16\u4ee3\u7684\u89e3\u90fd\u76f8\u540c\u6642<\/p>\n\n\n\n<p>\u7a0b\u5f0f\u78bc\u5927\u81f4\u5982\u4e0b<br>while(terminal){\/\/\u672a\u9054\u7d42\u6b62\u689d\u4ef6\u4e0b\u4e0d\u65b7\u91cd\u8907\u57f7\u884c<br>\u3000while(untraved){ \/\/\u5c07\u5404\u7bc0\u9ede\u90fd\u8d70\u904e<br>\u3000\u3000while(ant){ \/\/\u5404ant\u57f7\u884cstate_transiton\u6c7a\u5b9a\u8def\u5f91<br>\u3000\u3000\u3000state_transition();<br>\u3000\u3000}<br>\u3000\u3000pheromone_local_update; \/\/\u6bcf\u8d70\u904e\u4e00\u500b\u7bc0\u9ede\u5c31\u66f4\u65b0\u5169\u9ede\u4e4b\u9593pheromone<br>\u3000}<br>\u3000pheromone_global_update \/\/\u5168\u90e8\u7bc0\u9ede\u8d70\u5b8c\u5f8c\u627e\u51fa\u6700\u597d\u8def\u5f91,\u4e26\u53ea\u66f4\u65b0\u8a72\u8def\u5f91pheromone<br>}<\/p>\n\n\n\n<p><br><strong>State Transition Rule<\/strong><br>q0\u70ba\u9078\u64c7\u63a2\u7d22\u6216\u8ffd\u8e64\u7684\u53c3\u6578<br>q\u70ba\u7cfb\u7d71\u7522\u751f\u4e4b\u96a8\u6a5f\u6578,0 &lt; q &lt; \uff11&nbsp;<br><strong>\u82e5q&gt;q0<\/strong>\u5247\u6839\u64da\u4ee5\u4e0b\u53d6\u6700\u5927\u503c,\u6c7a\u5b9a\u7684\u76ee\u5730<br><strong>MAX(ph_rs*n_rs^b)<\/strong><br>ps:b\u662fdetermines the relative importance of pheromone versus distance,\u901a\u5e38\u8a2d2<br>\u82e5q<strong>pb_rs=ph(r,s)*n(r,s)^b \/ sum(ph(r,u)*n(r,u)^b)<\/strong><br>ph(r,s)=\u5f9er\u5230s\u7684pheromone<br>ph(r,u)=\u5f9er\u5230u\u7684pheromone<br>n(r,s)=\u5f9er\u5230s\u7684local heuristic,\u901a\u5e38\u70ba1\/distance_rs<br>n(r,u)=\u5f9er\u5230u\u7684local heuristic<br>b=\u540c\u4e0a<br>\u6ce8\u610f:u\u662f\u672a\u5230\u8a2a\u7684\u7bc0\u9ede,r\u662f\u51fa\u767c\u7bc0\u9ede,s\u662f\u67d0\u500b\u76ee\u5730\u7684\u9ede<\/p>\n\n\n\n<p><br><strong>\u5340\u57df\u66f4\u65b0\u8cbb\u6d1b\u8499<\/strong><br><strong>pheromone local updating<\/strong><br>\u7528\u5728\u5340\u57df,\u6bcf\u8d70\u4e00\u500b\u7bc0\u9ede\u66f4\u65b0\u4e00\u6b21<br>\u516c\u5f0f\u70ba:<strong>ph(r,s)+=(1-p)ph(r,s)+(p)ph_add(r,s)<\/strong><br><strong>where ph_add(r,s)=init-pheromone<\/strong>\u3000,\u4ee5\u521d\u59cbpheromone\u505a\u503c<br>\u53c3\u6578\u6709\u4ee5\u4e0b<br>p=\u6b98\u7559\u7cfb\u6578<br>ph(r,s)=\u8a72\u8def\u5f91(r\u5230s)\u76ee\u524d\u7684pheromone<br>ph_add(r,s)=\u7576\u8a72\u8def\u5f91(r\u5230s)\u88ab\u8d70\u904e\u6642,\u9700\u589e\u52a0pheromone\u7684\u91cf,\u82e5\u8a72\u8def\u5f91\u9019\u6b21\u6c92\u88ab\u8d70\u904e\u5247\u503c\u70ba0<\/p>\n\n\n\n<p><strong>\u5168\u57df\u66f4\u65b0\u8cbb\u6d1b\u8499<\/strong><br><strong>pheromone global updating<\/strong><br>\u7528\u5728\u5168\u57df,\u8d70\u5b8c\u5168\u90e8\u7bc0\u9ede\u5728\u66f4\u65b0\u6700\u597d\u8def\u5f91\u4e0a\u7684pheromone<br>\u516c\u5f0f\u70ba:<strong>ph(r,s)+=(1-a)ph(r,s)+(a)ph_add(r,s)<\/strong><br><strong>where ph_add(r,s)= best_L^-1<\/strong>&nbsp;, best_L\u70ba\u6700\u597d\u7684\u8def\u5f91\u9577\u5ea6<br>\u53c3\u6578\u6709\u4ee5\u4e0b<br>a=pheromone decay parameter,0ph(r,s)\u540c\u4e0a<br>ph_add(r,s)\u540c\u4e0a<\/p>\n\n\n\n<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<\/p>\n\n\n\n<p>\/\/\u4f7f\u7528\u7684\u8b8a\u6578\u5982\u4e0b<br>nodeall=\u6240\u6709\u7bc0\u9ede\u6578<br>t.max=\u6b32\u57f7\u884c\u7684\u6b21\u6578<\/p>\n\n\n\n<p>map_d<br>\/\/2\u7dad\u9663\u5217\u578b\u614b,\u4ee3\u8868\u5404\u7bc0\u9ede\u4e4bdistance<br>\/\/map_d=map<\/p>\n\n\n\n<p>map_h<br>\/\/2\u7dad\u9663\u5217\u578b\u614b,\u4ee3\u8868\u5404\u7bc0\u9ede\u4e4bheuristic<br>\/\/map_h=map<\/p>\n\n\n\n<p>ph<br>\/\/2\u7dad\u9663\u5217\u578b\u614b,\u8a18\u9304\u5404\u8def\u5f91\u7684\u8cbb\u6d1b\u8499<br>\/\/ph=map<br>\/\/ex:\u5f9ea\u7bc0\u9ede\u5230b\u7bc0\u9ede\u7684\u8cbb\u6d1b\u8499\u70ba0.2<br>\/\/ph[a][b]=0.2<\/p>\n\n\n\n<p>antpath<br>\/\/2\u7dad\u9663\u5217\u578b\u614b,\u8a18\u9304\u5404ant\u8def\u5f91<br>\/\/antpath[ant_k][step]=node<br>\/\/ ex:\u7b2c1\u96bbant\u8d70\u7684\u8def\u5f91\u70baabdc,\u5247\u8a18\u9304\u5982\u4e0b<br>\/\/antpath[1]={a,b,d,c}<\/p>\n\n\n\n<p>\/\/\u6f14\u7b97\u6cd5\u5982\u4e0b<br>while(t\u3000for(node=0;node\u3000\u3000pb=path_probability(ph);<br>\u3000\u3000\/\/\u6839\u64da\u516c\u5f0f(\u8cbb\u6d1b\u8499\u53ca\u5404node\u76f8\u9023\u4e4b\u6210\u672c)\u7522\u751f\u5404node\u53bb\u4e0d\u540cnode\u7684\u6a5f\u7387<br>\u3000\u3000dest=ant_decision(pb);<br>\u3000\u3000\/\/\u6839\u64da\u6a5f\u7387\u4e26\u900f\u904e\u65b9\u6cd5\u6c7a\u5b9a\u5728\u591a\u500b\u76ee\u5730\u6642\u61c9\u9078\u64c7\u90a3\u4e00\u500b\u76ee\u5730<br>\u3000\u3000antpath=antpath_update(dest);<br>\u3000\u3000\/\/\u66f4\u65b0ant\u8def\u5f91\u8868\u4ee5\u8868\u793aant\u79fb\u52d5\u7684\u72c0\u6cc1<br>\u3000\u3000ph=pheromone_update_local(antpath);<br>\u3000\u3000\/\/\u6839\u64da\u5be6\u969b\u53bb\u7684node,\u91cd\u65b0\u8a08\u7b97\u8cbb\u6d1b\u8499\u7684\u503c<br>\u3000}<br>ph=pheromone_update_global(antpath);<br>ph=pheromone_update_global_best(antpath);<br>best=selectbest_antpath(antpath); \/\/\u5f9e\u5404ant\u5be6\u969b\u8d70\u7684\u8def\u5f91\u4e2d\u9078\u64c7\u6700\u597d\u7684\u8def\u5f91<br>}<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<\/p>\n\n\n\n<p>acs for php example<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/ acs usage description \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/*\n1.acs() need \"map distance\" data and array named as \"$para&#91;'map_d']\", as follow\n$para&#91;'map_d']=array(\n'1'=>array('1'=>0,'2'=>3,'3'=>5,'4'=>5),\n'2'=>array('1'=>3,'2'=>0,'3'=>4,'4'=>6),\n'3'=>array('1'=>5,'2'=>4,'3'=>0,'4'=>2),\n'4'=>array('1'=>5,'2'=>6,'3'=>2,'4'=>0));\n\n2.acs($para) will return acs result with the array representation ,refer to function evaluate()\n$result_array=acs($para);\n*\/\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/ acs example as follow \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/phase 1\n\/\/read data\n$inputdata = file('map.txt'); \/\/in the each line of map.txt` is x,y\nwhile($line=each($inputdata)){\n\u00a0 $i++;\n\u00a0 $tmp=explode(',',$line&#91;'value']);\n\u00a0 $node&#91;$i]&#91;'x']=trim($tmp&#91;0]);\n\u00a0 $node&#91;$i]&#91;'y']=trim($tmp&#91;1]);\n}\n$nodecount=count($node);\nfor($i=1;$i&lt;=$nodecount;$i++){\n\u00a0 for($j=1;$j&lt;=$nodecount;$j++){\n\u00a0 \u00a0 $map_d&#91;$i]&#91;$j]=0;\n\u00a0 \u00a0 if($i!=$j)$map_d&#91;$i]&#91;$j]= sprintf(\"%.5f\",sqrt( pow($node&#91;$i]&#91;'x']-$node&#91;$j]&#91;'x'],2) + pow($node&#91;$i]&#91;'y']-$node&#91;$j]&#91;'y'],2) ));\n\u00a0 }\n}\n$para&#91;'map_d']=$map_d; \/\/ data for acs()\n\/\/$para&#91;'node_xy']=$node; \/\/the data for graph()\n\n\/\/phase 2\n\/\/excute acs\n$para&#91;'antpath_value']=acs($para);\necho 'global best='.$para&#91;'antpath_value']&#91;'sumbest_global'].'&lt; br>';\ngraph($para&#91;'antpath_value']&#91;'pathbest_global'],$node);\n\/\/\/\/\/\/\/\/\/\/\/ acs example end \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/ main function \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction acs($para){\n$para&#91;'a']=0.1;\/\/0$para&#91;'b']=2;\/\/relative importance of local heuristic or pheromone\n$para&#91;'p']=0.1;\/\/trail evaporates,the value must is &lt; 1\n$para&#91;'q0']=0.9;\/\/explorse or tracking $para&#91;'gn']=100;\/\/generation number\n$para&#91;'gn']=500;\/\/generation number\n\n$para&#91;'node']=count($para&#91;'map_d']);\/\/node sum\n$para&#91;'ant']=$para&#91;'node'];\/\/ant sum\n$para&#91;'initph']=(1\/($para&#91;'node']*nearest_neighbor_heuristic($para)));\n$para&#91;'map_h']=init('map_h',$para);\n$para&#91;'map_hb']=init('map_hb',$para);\n$para&#91;'ph']=init('ph',$para);\/\/init pheromone by random\n\nwhile($t&lt;$para&#91;'gn']){\n\u00a0 $t++;\n\u00a0 $para&#91;'antpath']=init('antpath',$para);\n\u00a0 $para&#91;'unvisited']=init('unvisited',$para);\n\u00a0 for($i=0;$i&lt;$para&#91;'node'];$i++){\n\u00a0 \u00a0 $para&#91;'unvisited']=unvisitednode($para);\n\u00a0 \u00a0 reset($para&#91;'antpath']);\n\u00a0 \u00a0 \u00a0 while($ant=each($para&#91;'antpath'])){\n\u00a0 \u00a0 \u00a0 \u00a0 $para&#91;'antpath']&#91;$ant&#91;0]]&#91;]=state_transition($ant&#91;0],$para);\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 $para&#91;'ph']=pheromone_update($para);\n\u00a0 }\n\u00a0 $para&#91;'antpath_value']=evaluate($para);\n\u00a0 $para&#91;'ph']=pheromone_update_global($para);\n}\n\nreturn $para&#91;'antpath_value'];\n\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/ sub function \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction nearest_neighbor_heuristic($para){\nfor($i=1;$i&lt;=$para&#91;'node'];$i++){\n\u00a0 $traved&#91;$i]=0;\n}\n\n$path&#91;]=1;\n$traved&#91;1]=1;\nwhile(array_sum($traved)&lt;$para&#91;'node']){\n\u00a0 $start=end($path);\n\u00a0 reset($traved);\n\u00a0 $distance=null;\n\u00a0 while($d=each($traved)){\n\u00a0 \u00a0 $dst=$d&#91;0];\n\u00a0 \u00a0 if($d&#91;1]!=1){\n\u00a0 \u00a0 \u00a0 $distance&#91;$dst]=$para&#91;'map_d']&#91;$start]&#91;$dst];\n\u00a0 \u00a0 }\n\u00a0 }\n\u00a0 asort($distance);\n\u00a0 $n=each($distance);\n\u00a0 $traved&#91;$n&#91;0]]=1;\n\u00a0 $path&#91;]=$n&#91;0];\n\u00a0 $length&#91;]=$n&#91;1];\n}\n$start=end($path);\nreset($traved);\n$distance=null;\nwhile($d=each($traved)){\n\u00a0 $dst=$d&#91;0];\n\u00a0 if($d&#91;1]!=1){\n\u00a0 \u00a0 $distance&#91;$dst]=$para&#91;'map_d']&#91;$start]&#91;$dst];\n\u00a0 \u00a0 $traved&#91;$dst]=1;\n\u00a0 \u00a0 $path&#91;]=$dst;\n\u00a0 \u00a0 $length&#91;]=$distance&#91;$dst];\n\u00a0 }\n}\n\n$totallength=array_sum($length);\nreturn $totallength;\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction init($type,$para){\nif($type=='antpath'){\n\u00a0 for($i=1;$i&lt;=$para&#91;'ant'];$i++){\n\u00a0 \u00a0 $antpath&#91;$i]&#91;]=$i;\n\u00a0 }\n\u00a0 return $antpath;\n}\n\nif($type=='unvisited'){\n\u00a0 for($i=1;$i&lt;=$para&#91;'ant'];$i++){\n\u00a0 \u00a0 $n=1;\n\u00a0 \u00a0 while($n&lt;=$para&#91;'node']){$unvisited&#91;$i]&#91;]=$n++;}\n\u00a0 }\n\u00a0 return $unvisited;\n}\n\n\/\/compute heuristic(1\/distance=heuristic)\nif($type=='map_h' or $type=='ph' or $type=='map_hb'){\n\u00a0 while($i=each($para&#91;'map_d'])){\n\u00a0 \u00a0 while($j=each($i&#91;'value'])){\n\u00a0 \u00a0 \u00a0 if($j&#91;'value']){\n\u00a0 \u00a0 \u00a0 \u00a0 $map_h&#91;$i&#91;'key']]&#91;$j&#91;'key']]=1\/$j&#91;'value'];\n\u00a0 \u00a0 \u00a0 \u00a0 $map_hb&#91;$i&#91;'key']]&#91;$j&#91;'key']]=pow($map_h&#91;$i&#91;'key']]&#91;$j&#91;'key']],$para&#91;'b']);\n\u00a0 \u00a0 \u00a0 \u00a0 $ph&#91;$i&#91;'key']]&#91;$j&#91;'key']]=$para&#91;'initph'];\n\u00a0 \u00a0 \u00a0 }else{\n\u00a0 \u00a0 \u00a0 \u00a0 $map_h&#91;$i&#91;'key']]&#91;$j&#91;'key']]=0;\n\u00a0 \u00a0 \u00a0 \u00a0 $map_hb&#91;$i&#91;'key']]&#91;$j&#91;'key']]=0;\n\u00a0 \u00a0 \u00a0 \u00a0 $ph&#91;$i&#91;'key']]&#91;$j&#91;'key']]=0;\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 }\n}\nif($type=='map_h'){return $map_h;}\nif($type=='map_hb'){return $map_hb;}\nif($type=='ph'){return $ph;}\n\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction unvisitednode($para){\nwhile($ant=each($para&#91;'antpath'])){\n\u00a0 $lastnode=end($para&#91;'antpath']&#91;$ant&#91;0]]);\n\u00a0 \u00a0 while($u=each($para&#91;'unvisited']&#91;$ant&#91;0]])){\n\u00a0 \u00a0 \u00a0 if($u&#91;1]!=$lastnode)$unvisited_new&#91;$ant&#91;0]]&#91;]=$u&#91;1];\n\u00a0 \u00a0 }\n\u00a0 }\nreturn $unvisited_new;\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction state_transition($k,$para){\n$r=end($para&#91;'antpath']&#91;$k]);\n\n$dstcount=count($para&#91;'unvisited']&#91;$k]);\nif($dstcount&lt;1){$antdest&#91;$k]=$para&#91;'antpath']&#91;$k]&#91;0];}\nif($dstcount==1){\n\u00a0 $lastdst=each($para&#91;'unvisited']&#91;$k]);\n\u00a0 $antdest&#91;$k]=$lastdst&#91;1];\n}\nif($dstcount>1){\n\n\/\/computer state value\n\u00a0 $u_pb_sum=0;\n\u00a0 while($unvisited=each($para&#91;'unvisited']&#91;$k])){\n\u00a0 $u=$unvisited&#91;1];\n\u00a0 $u_pb_each&#91;$u]=$para&#91;'ph']&#91;$r]&#91;$u]*$para&#91;'map_hb']&#91;$r]&#91;$u];\n}\n\n\/\/select explore or tracked by q0\n$q=rand(0,100)\/100;\nif($q&lt;=$para&#91;'q0']){\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/select best pheromone dest start\n\u00a0 $ph_comp=$u_pb_each;\n\u00a0 arsort($ph_comp);\n\u00a0 $dstary=each($ph_comp);\n\u00a0 $antdest&#91;$k]=$dstary&#91;0];\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/select best pheromone dest end\n}else{\n\/\/\/\/\/\/\/\/\/\/\/\/\/random select dest by probability start\n\u00a0 $u_pb_sum=array_sum($u_pb_each);\n\u00a0 while($s=each($u_pb_each)){\n\u00a0 \u00a0 if($s&#91;1]!=0){\n\u00a0 \u00a0 \u00a0 $pb&#91;$r]&#91;$s&#91;0]]=$s&#91;1]\/$u_pb_sum;\n\u00a0 \u00a0 }else{\n\u00a0 \u00a0 \u00a0 $pb&#91;$r]&#91;$s&#91;0]]=0;\n\u00a0 \u00a0 }\n\u00a0 }\n\/\/select\n\u00a0 $pbsum=array_sum($pb&#91;$r]);\n\u00a0 $selectpoint=(rand(0,$pbsum*10000)\/10000);\n\u00a0 while($s=each($pb&#91;$r])){\n\u00a0 \u00a0 $nowposition+=$s&#91;1];\n\u00a0 \u00a0 if($nowposition>=$selectpoint){\n\u00a0 \u00a0 \u00a0$antdest&#91;$k]=$s&#91;0];\n\u00a0 \u00a0 \u00a0break;\n\u00a0 \u00a0}\n\u00a0 }\n\/\/\/\/\/\/\/\/\/\/\/\/\/random select dest by probability end\n}\n\n}\n\nreturn $antdest&#91;$k];\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction pheromone_update($para){\nreset($para&#91;'antpath']);\nwhile($ant=each($para&#91;'antpath'])){\n\u00a0 $j=end($para&#91;'antpath']&#91;$ant&#91;0]]);\n\u00a0 $i=prev($para&#91;'antpath']&#91;$ant&#91;0]]);\n\u00a0 $ph_add&#91;$i]&#91;$j]=$para&#91;'initph'];\n\u00a0 $ph_add_tmp=0;\n\n\/\/have only traveled update\n\u00a0 $para&#91;'ph']&#91;$i]&#91;$j]=(1-$para&#91;'p'])*$para&#91;'ph']&#91;$i]&#91;$j]+$para&#91;'p']*$ph_add&#91;$i]&#91;$j];\n}\nreturn $para&#91;'ph'];\n}\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction pheromone_update_global($para){\n$ph_add=pow($para&#91;'antpath_value']&#91;'sumbest_global'],-1);\nwhile($node=each($para&#91;'antpath_value']&#91;'pathbest_global'])){\n\u00a0 if($i!=null){\n\u00a0 \u00a0 $j=$node&#91;1];\n\u00a0 \u00a0 $para&#91;'ph']&#91;$i]&#91;$j]=(1-$para&#91;'a'])*$para&#91;'ph']&#91;$i]&#91;$j]+$para&#91;'a']*$ph_add;\n\u00a0 }\n\u00a0 $i=$node&#91;1];\n}\nreturn $para&#91;'ph'];\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction evaluate($para){\n$antpath_value=$para&#91;'antpath_value'];\n$antpath_value&#91;'unit']=null;\nwhile($ant=each($para&#91;'antpath'])){\n\u00a0 $i=null;\n\u00a0 $j=null;\n\u00a0 while($path=each($ant&#91;'value'])){\n\u00a0 \u00a0 if($i!=null){\n\u00a0 \u00a0 \u00a0 $j=$path&#91;'value'];\n\u00a0 \u00a0 \u00a0 $antpath_value&#91;'unit']&#91;$ant&#91;'key']]&#91;]=$para&#91;'map_d']&#91;$i]&#91;$j];\n\u00a0 \u00a0 }\n\u00a0 \u00a0 $i=$path&#91;'value'];\n\u00a0 }\n$antpath_value&#91;'sum']&#91;$ant&#91;'key']]=array_sum($antpath_value&#91;'unit']&#91;$ant&#91;'key']]);\n}\n\nasort($antpath_value&#91;'sum']);\n$bestdata=each($antpath_value&#91;'sum']);\n$bestant=$bestdata&#91;0];\n$antpath_value&#91;'sumbest']=$bestdata&#91;1];\n$antpath_value&#91;'pathbest']=$para&#91;'antpath']&#91;$bestant];\n$antpath_value&#91;'sumbest_history']&#91;]=$antpath_value&#91;'sumbest'];\n\nif($antpath_value&#91;'sumbest_global']==null or $antpath_value&#91;'sumbest_global']>$antpath_value&#91;'sumbest']){\n\u00a0 $antpath_value&#91;'sumbest_global']=$antpath_value&#91;'sumbest'];\n\u00a0 $antpath_value&#91;'pathbest_global']=$antpath_value&#91;'pathbest'];\n}\n$antpath_value&#91;'sumbest_global_history']&#91;]=$antpath_value&#91;'sumbest_global'];\n\n\/*\n$antpath_value&#91;'unit'] array ,each ant each cost of path node\n$antpath_value&#91;'sum'] array ,each ant sum cost of path node\n$antpath_value&#91;'pathbest'] array\n$antpath_value&#91;'sumbest'] int\n$antpath_value&#91;'sumbest_history'] array\n$antpath_value&#91;'pathbest_global'] array\n$antpath_value&#91;'sumbest_global'] int\n$antpath_value&#91;'sumbest_global_history'] array\n*\/\n\necho $antpath_value&#91;'sumbest_global'].\",\";\n\nreturn $antpath_value;\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/ optional \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction caclutime(){\n$time = explode( \" \", microtime());\n$usec = (double)$time&#91;0];\n$sec = (double)$time&#91;1];\nreturn $sec + $usec;\n}\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nfunction graph($path,$node_xy){\n\/\/$path=$data&#91;'antpath_value']&#91;'pathbest_global'];\n\/\/$node_xy=$data&#91;'node_xy'];\n$im = imagecreate(500,500);\n$green = imagecolorallocate($im,214,235,214);\n$black = imagecolorallocate ($im, 0, 0, 0);\n$count=count($path)-1;\nfor($i=0;$i&lt;$count;$i++){\n\u00a0 $ix=$node_xy&#91;$path&#91;$i]]&#91;'x']*5;\n\u00a0 $iy=$node_xy&#91;$path&#91;$i]]&#91;'y']*5;\n\u00a0 $jx=$node_xy&#91;$path&#91;$i+1]]&#91;'x']*5;\n\u00a0 $jy=$node_xy&#91;$path&#91;$i+1]]&#91;'y']*5;\n\u00a0 imageline($im,$ix,$iy,$jx,$jy,$black);\n}\nimagepng($im, \"a.png\");\necho \"&lt; img src='a.png' >\";\nimagedestroy($im);\n}<\/code><\/pre>\n\n\n\n<p><br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<\/p>\n\n\n\n<p><br>\u5176\u4ed6\u53ef\u53c3\u8003\u7684\u6587\u737b<br>http:\/\/sjchen.im.nuu.edu.tw\/Project_Courses\/ML\/AntAlgo.pdf<br>http:\/\/bm.nsysu.edu.tw\/tutorial\/iylu\/2008%20IQM\/QT2_%C3%C6%B8s%BAt%BA%E2%AAk%A9%F3%A6v%B0t%B7~%B8%F4%BDu%B3%CC%A8%CE%A4%C6%A4%A7%AC%E3%A8s.pdf<br>http:\/\/ccckmit.wikidot.com\/so:antcolony<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ant Algorithm(\u879e\u87fb\u6f14\u7b97\u6cd5)1991\u5e74\u7531Dori &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[],"class_list":["post-498","post","type-post","status-publish","format-standard","hentry","category-dataanalysis"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/comments?post=498"}],"version-history":[{"count":0,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/498\/revisions"}],"wp:attachment":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/media?parent=498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/categories?post=498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/tags?post=498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}