JavaScript Advent Calendar 2011 (ãªã¬æ¨æºã³ã¼ã¹)ã®9æ¥ç®ã®è¨äºã§ã。
「ãªã¬æ¨æºã³ã¼ã¹ã¯ä½ãæ¸ãã¦ãããããã」ã¨ããåãèãã¤ãã¦ãã£ã¦ãã¾ãã。@push_backã§ã。
ä»åã¯ç°¡åãªãã¡ã¸ã¼è«ç(cf. ãã¡ã¸ã£è«ç - Wikipedia)ãJSã§ãã£ã¦ã¿ãã!ã¨ãã試ã¿。
å ãã¿ã¯æå¾ã«ããåèæç®[1]ãåç §ã®ãã¨。
ä¸æ¥ã§çªè²«å·¥äºããã®ã§、ã¨ããã©ããå¾®å¦ã ã£ãããã¾ã。許ã!
ä¸è¨ã§è¨ãã¨"ããåºæºå¤ã¨ã®è¿ããã0~1ã®ççå¤ãæ±ãã"ãã®。
æ®éã«ççå¤ãæ±ãã(ä¾ãã°、100 < N)ã¨true/falseã§0ã1ãã®2å¤ã«ãªã。
ããã、ãã¡ã¸ã¼è«çã§ã¯、è©ä¾¡åºæºã¨ãªãã¡ã³ãã¼ã·ããé¢æ°ã®è¿ã0~1ã®ã¹ã³ã¢ã¨ãã¦ççå¤ãæ±ã¾ã。
è¦ããã«、é¾å¤ã§ã¹ãã£ã¨çå½ãåããã«、ã¹ã³ã¢ããæè»ã«å¤æããã、ã¨ãããã¨。
……ãªã©ã©、ãããã¦ããã³ã¨æ¥ãªãã¨æãããã®ã§、ã¾ããµã³ãã«ãã覧é ããã。
ã³ã¼ãã¯ããã«ç½®ãã¦ããã®ã§、ããã£ã¦ã¿ãã人ã¯ã©ãã。
è¨æ£:å³ä¸ã®å°å½¢ã¯ã©ã¹ã¯"Fuzzy.Stage"ã§ã¯ãªã"Fuzzy.Trapezoid"ãæ£ããã§ã。
ãããã¼ã«è§£èª¬ãã¦ããã¨、å³ã¯y=f(x)ãªãé¢æ°ã®ã°ã©ãã§ã。
xãè©ä¾¡ãããå¤、f(x)ãxã®å¤ã«ãã£ã¦0~1ã®å¤ãè¿ãã¡ã³ãã¼ã·ããé¢æ°。
å®éã®ã³ã¼ãã§ã¯、ççå¤T=fuzzy.getT(x)ã¨ãªã、fuzzyãåãã¡ã¸ã¼è«çã¯ã©ã¹、getT(x)ãf(x)ã«ç¸å½ãã¾ã。
åã¯ã©ã¹ã®æ¦è¦ã¯ä»¥ä¸。
ä¾ãã°RPGã§、æµãã£ã©ã®æ¦éç¨ãã¸ãã¯ãä½ã£ã¦ããã¨ãã«、以ä¸ã®ãããªæ¡ä»¶ãã¤ãã。
ããã§、ãã¡ã¸ã¼è«çãç¨ãã¦åºæºå¤ã¨ã®è¿ãããå¤æããã¨、
ãããã¯、åç´ã«ä»ã®å¤æåºæºã¨æ¯è¼ãã¦é«ãæ¹(æ»æ)ãé¸ã¶、ãªãã¦ãã¨ãã§ãã。
æµã®è¡åãã¡ãã£ã¨ãã·ã«ãªã£ãã®ã§ãã§ãããã§ãã。
ããã大éæã«èããã¨、「åºæºå¤ã¨ã®è¿ãããé¾å¤ã決ãã¦、ä¹±æ°ã§åå²ããã®ãã¡ãã£ã¨ã¹ãã¼ãã«ãããããªä½ã。」ã¨ããã¤ã¡ã¼ã¸。
ããå°ãè¸ã¿è¾¼ãã èãæ¹ã¨ãã¦、ããã¤ãã®ã¡ã³ãã¼ã·ããé¢æ°ãçµã¿åããã。
ããããã¨è¤éãªæ¡ä»¶ã表ç¾ãããã¨ãå¯è½ã«ãªã£ã¦ã³ã¼ããã¹ãããªããã、使ãã¾ãããã、ããããããã°å¯è¦åãã§ããã、ããããã®ã¡ãªããã。
ä¸é¨çç¥ãã¦ããã®ã§、å®éã®ã½ã¼ã¹ã¯ä¸ã®æ¹ã«ãããµã³ãã«ã®ãªã³ã¯å ããã©ãã。
"å¾ã*x座æ¨"ã§ããå°ç¹ã®ççå¤ãæ±ã¾ãåç´(y=ax)ãªçå±。
ç¹çãã¹ãç¹ã¯ãªã。è«çæ¼ç®ã¯wikipediaã®å®ç¾©ãã£ãããã®ã¾ã¾。
ãµãã¯ã©ã¹ã¯Fuzzyãç¶æ¿ããããã§、ççå¤ã®è¨ç®é¢æ°getT()ã«è¨ç®å¼ãåãè¾¼ãã§ã¾ã。
è¤æ°ã®FuzzyãANDã§çµã¿åãããã、ä»»æã®å³å½¢ã®æ¹ç¨å¼ãå ¥ããã、使ãæ¹ã¯ç¡é大。
æå¾ã«ä¸è¨。å°ãã§ãå½¹ã«ç«ã¤ã¨ããããã©、æ£ç´、è¨æ¶ãããã¾ããªã®ã§(ãããæ¸ãããã£ãã ãã§ã、ãè©«ã³ç³ãä¸ãã¾ã)、èå³ã®ãã人ã¯ãã®è¨äºã®ãã¨ãå¿ãã¦æ¬ãèªãã§ã¿ãã¨ããã§ã。
O'Reilly Japan - ã²ã¼ã éçºè ã®ããã®AIå ¥é(åºçå ã®ç´¹ä»ã¨ç®æ¬¡)
ã²ã¼ã éçºè ã®ããã®AIå ¥é - Google ããã¯ã¹(試ãèªã¿å¯è½)
A. JavaScriptã§æ¸ãããã£ãããæ¸ããã ã(æè¨)。
Q. æ¬å½ã«?
A. å¼·ãã¦è¨ããªã「ä»ãªãã°ã©ããcanvasã§æãããªã」ã¨。æã¯ç·ãä¸æ¬å¼ãã®ã«ãçµæ§ãªè¦å´ããã£ã¦(以ä¸ç¥)。
Q. "ãã¡ã¸ã¼çè«"ã¨"ãã¡ã¸ã¼è«ç"ã©ã£ã¡ãã©ã£ã¡ãªã®?
A. ãã¡ã¸ã¼çè«ã®ä¸ã«å«ã¾ããã®ããã¡ã¸ã¼è«çã ã¨ä¿¡ãã¦ãã¾ã。ä½è«ã§ãã、ç´°ãããã¨ãæ°ã«ããªãã®ãé·çãã®ç§è¨£ã§ã。
Q. ãã¡ã¸ã¼çè«ãªãã¦ç¡ãã¦ã、ä¹±æ°ã®é¾å¤ãå¤æåºæºããè¨å®ããã°ããã ããããªãã®?
A. ãã®ã³ã¼ããã¯ã©ã¹ã«é è½ãã¦ãã®ã、ãã¡ã¸ã¼è«çã®ã¡ã³ãã¼ã·ããé¢æ°ãªããããªãããªã、ã¨。ãã¡ã¸ã¼è«çãªãã¦èããªãã¦ãåæ§ã®æ©è½ã¯ä½ããã、è³¢ã人ã¯ç¡æèã«ä½ã£ã¦ãæ°ãããªãã§ããªã。
Q. ãã®æ¬ãèªã¿ãããã©、ãéããªãã®ã§ã©ãã«ããã¦ãã ãã。
A. å³æ¸é¤¨ãå©ç¨ãã¾ããã。
Q. ãã¾ãæ£ã¯ä½å³ã好ãã§ãã?
A. ã³ã¼ã³ãã¿ã¼ã¸ã¥å³ã¨ãã¼ãºå³ã§ã。
「ãªã¬æ¨æºã³ã¼ã¹ã¯ä½ãæ¸ãã¦ãããããã」ã¨ããåãèãã¤ãã¦ãã£ã¦ãã¾ãã。@push_backã§ã。
ä»åã¯ç°¡åãªãã¡ã¸ã¼è«ç(cf. ãã¡ã¸ã£è«ç - Wikipedia)ãJSã§ãã£ã¦ã¿ãã!ã¨ãã試ã¿。
å ãã¿ã¯æå¾ã«ããåèæç®[1]ãåç §ã®ãã¨。
ä¸æ¥ã§çªè²«å·¥äºããã®ã§、ã¨ããã©ããå¾®å¦ã ã£ãããã¾ã。許ã!
ãã¡ã¸ã¼(ããã¾ã)è«çã£ã¦?
AIã®æèãã¸ãã¯ã¨ãã¨ã¢ã³ã³ã®å¶å¾¡ãªããã«ä½¿ããã¦ãã、ã¼ãããããåºæºããã¨ã«å¤æããæ¹æ³。ä¸è¨ã§è¨ãã¨"ããåºæºå¤ã¨ã®è¿ããã0~1ã®ççå¤ãæ±ãã"ãã®。
æ®éã«ççå¤ãæ±ãã(ä¾ãã°、100 < N)ã¨true/falseã§0ã1ãã®2å¤ã«ãªã。
ããã、ãã¡ã¸ã¼è«çã§ã¯、è©ä¾¡åºæºã¨ãªãã¡ã³ãã¼ã·ããé¢æ°ã®è¿ã0~1ã®ã¹ã³ã¢ã¨ãã¦ççå¤ãæ±ã¾ã。
è¦ããã«、é¾å¤ã§ã¹ãã£ã¨çå½ãåããã«、ã¹ã³ã¢ããæè»ã«å¤æããã、ã¨ãããã¨。
……ãªã©ã©、ãããã¦ããã³ã¨æ¥ãªãã¨æãããã®ã§、ã¾ããµã³ãã«ãã覧é ããã。
ãµã³ãã«
以ä¸ãåä½ãµã³ãã«。canvasã«x座æ¨ã§0~200ã¾ã§ãããã。ççå¤ã¯ä¸ã1.0、ä¸ã0.0。ã³ã¼ãã¯ããã«ç½®ãã¦ããã®ã§、ããã£ã¦ã¿ãã人ã¯ã©ãã。
è¨æ£:å³ä¸ã®å°å½¢ã¯ã©ã¹ã¯"Fuzzy.Stage"ã§ã¯ãªã"Fuzzy.Trapezoid"ãæ£ããã§ã。
ãããã¼ã«è§£èª¬ãã¦ããã¨、å³ã¯y=f(x)ãªãé¢æ°ã®ã°ã©ãã§ã。
xãè©ä¾¡ãããå¤、f(x)ãxã®å¤ã«ãã£ã¦0~1ã®å¤ãè¿ãã¡ã³ãã¼ã·ããé¢æ°。
å®éã®ã³ã¼ãã§ã¯、ççå¤T=fuzzy.getT(x)ã¨ãªã、fuzzyãåãã¡ã¸ã¼è«çã¯ã©ã¹、getT(x)ãf(x)ã«ç¸å½ãã¾ã。
åã¯ã©ã¹ã®æ¦è¦ã¯ä»¥ä¸。
- ããä¸å®å¤ä»¥ä¸ã¯å½ããçã«å¤å
- ã¾ãã¯ãã®é
- ããä¸ç¹ãä¸å¿ã«ä¸å®ã®å²åã§å¤å
- ããåºéã¯ç
- ããåºéã¯ç、ãã®åå¾ã§å½ããç、çããå½ã¸å¤å
- ããä¸ç¹ãé ç¹ã¨ããåæ¥åã®è»è·¡ã«æ²¿ã£ã¦å¤å(å ´æãä½ã£ãã®ã§é©å½)
使ãé
å ·ä½çã«ã©ãããæ使ããã®ãã¨ããã¨、ããã¾ããªå¤æããããæ。ä¾ãã°RPGã§、æµãã£ã©ã®æ¦éç¨ãã¸ãã¯ãä½ã£ã¦ããã¨ãã«、以ä¸ã®ãããªæ¡ä»¶ãã¤ãã。
- èªåã®HPãX以ä¸ãªãéãã
- ãã¬ã¤ã¤ã¼ã®HPãY以ä¸ãªãæ»æ
if(X > æµãã£ã©ã®HP)/* éãã */; else if(Y > ãã¬ã¤ã¤ã¼ã®HP)/* æ»æ */; /* 以ä¸ããããç¶ã…… */ã®ããã«å¦çããã¨、ãã¬ã¼ã¤ã¼ããã¨ä¸æã§åããã®ã«éããããã³ãªæµã«ãªã£ã¦ãã¾ã、é常ã«æ®å¿µ。
ããã§、ãã¡ã¸ã¼è«çãç¨ãã¦åºæºå¤ã¨ã®è¿ãããå¤æããã¨、
- ”HPãå±éºãªã®ã§éãã”ã®ççå¤0.6 = ”ããéããã¹ã”
- ”ãã¬ã¤ã¤ã¼ã®HPãä½ãã®ã§æ»æ”ã®ççå¤0.8 = ”ããªãæ»æãã¹ã”
ãããã¯、åç´ã«ä»ã®å¤æåºæºã¨æ¯è¼ãã¦é«ãæ¹(æ»æ)ãé¸ã¶、ãªãã¦ãã¨ãã§ãã。
æµã®è¡åãã¡ãã£ã¨ãã·ã«ãªã£ãã®ã§ãã§ãããã§ãã。
ããã大éæã«èããã¨、「åºæºå¤ã¨ã®è¿ãããé¾å¤ã決ãã¦、ä¹±æ°ã§åå²ããã®ãã¡ãã£ã¨ã¹ãã¼ãã«ãããããªä½ã。」ã¨ããã¤ã¡ã¼ã¸。
ããå°ãè¸ã¿è¾¼ãã èãæ¹ã¨ãã¦、ããã¤ãã®ã¡ã³ãã¼ã·ããé¢æ°ãçµã¿åããã。
ããããã¨è¤éãªæ¡ä»¶ã表ç¾ãããã¨ãå¯è½ã«ãªã£ã¦ã³ã¼ããã¹ãããªããã、使ãã¾ãããã、ããããããã°å¯è¦åãã§ããã、ããããã®ã¡ãªããã。
å®è£
ãããã、JavaScriptã¨é¢ä¿ãªã話ãããã®ã§、ããããã½ã¼ã¹ãè²¼ã£ã¦ãã¾ããã¦ããã¾ã。ä¸é¨çç¥ãã¦ããã®ã§、å®éã®ã½ã¼ã¹ã¯ä¸ã®æ¹ã«ãããµã³ãã«ã®ãªã³ã¯å ããã©ãã。
"å¾ã*x座æ¨"ã§ããå°ç¹ã®ççå¤ãæ±ã¾ãåç´(y=ax)ãªçå±。
ç¹çãã¹ãç¹ã¯ãªã。è«çæ¼ç®ã¯wikipediaã®å®ç¾©ãã£ãããã®ã¾ã¾。
ãµãã¯ã©ã¹ã¯Fuzzyãç¶æ¿ããããã§、ççå¤ã®è¨ç®é¢æ°getT()ã«è¨ç®å¼ãåãè¾¼ãã§ã¾ã。
è¤æ°ã®FuzzyãANDã§çµã¿åãããã、ä»»æã®å³å½¢ã®æ¹ç¨å¼ãå ¥ããã、使ãæ¹ã¯ç¡é大。
/* å§ç¹ããçµç¹ã®éã§0~1ã¨ç´ç·çã«å¤åããççå¤ã表ã start å§ç¹ã®xåº§æ¨ end çµç¹ã®xåº§æ¨ [flip] 1~0ã¨å¤åããå ´åtrueã«ãã */ function Fuzzy(start, end, flip){ var startVal = +!!flip; var endVal = +!flip; var delta = (endVal - startVal) / (end - start); /* xå°ç¹ã§ã®ççå¤ãè¿ã x ççå¤ãå¾ããå°ç¹ã®ï½åº§æ¨ */ this.getT = function(x){ if(start >= x)return startVal; else if(end <= x)return endVal; else return startVal + delta * (x - start); }; } Fuzzy.prototype = { /* 以ä¸、è«çæ¼ç® x ãã®ãªãã¸ã§ã¯ãã®xå°ç¹ fuzzy æ¼ç®ããFuzzyãªãã¸ã§ã¯ãã¾ãã¯å¤ */ and : function(x, fuzzy){ return Math.min( this.getT(x), isNaN(fuzzy)?fuzzy.getT(x):fuzzy); }, or : function(x, fuzzy){ return Math.max( this.getT(x), isNaN(fuzzy)?fuzzy.getT(x):fuzzy); }, not : function(x){ return 1 - this.getT(x); } }; /* 以ä¸、ãµãã¯ã©ã¹ */ //ä¸è§(å¼æ°:å§ç¹、é ç¹、çµç¹ã®x座æ¨) Fuzzy.Triangle = function(start, top, end){/* ç¥ */}; //ãã«ã¹(å¼æ°:å§ç¹、çµç¹ã®x座æ¨) Fuzzy.Palse = function(start, end){/* ç¥ */}; //å°å½¢(å¼æ°:ä¸ãã®å§ç¹、ä¸ãã®çµç¹、ä¸ãã®å§ç¹、ä¸ãã®çµç¹ã®x座æ¨) Fuzzy.Trapezoid = function(upStart, upEnd, downStart, downEnd){/* ç¥ */}; //åå(å¼æ°:å§ç¹、çµç¹ã®x座æ¨) Fuzzy.Circle = function(start, end){/* ç¥ */};
ã¾ã¨ã
ããã¾ã§ã®è©±ã®ãã¤ã³ãã3è¡ã§。- ãã¡ã¸ã¼è«çã¯æ¯è¼å¯¾è±¡ã®å¤ã¨ã¡ã³ãã¼ã·ããé¢æ°ããççå¤ãæ±ãã
- ççå¤ã¯0~1ã®å¤ãåãã®ã§、åªå é ä½ãã¤ãã¥ããè¤éãªå¤æã«åãã¦ãã
- æ¡ä»¶ãã³ã¼ãããåé¢ããã、çµã¿åããããã¨ã§ãã¸ãã¯ããã£ãããããã
æå¾ã«ä¸è¨。å°ãã§ãå½¹ã«ç«ã¤ã¨ããããã©、æ£ç´、è¨æ¶ãããã¾ããªã®ã§(ãããæ¸ãããã£ãã ãã§ã、ãè©«ã³ç³ãä¸ãã¾ã)、èå³ã®ãã人ã¯ãã®è¨äºã®ãã¨ãå¿ãã¦æ¬ãèªãã§ã¿ãã¨ããã§ã。
åèæç®
- David M. Bourg, Glenn Seemann è, æ ªå¼ä¼ç¤¾ã¯ã¤ã¼ã 訳: "ã²ã¼ã éçºè ã®ããã®AIå ¥é", 10ç« , ãªã©ã¤ãªã¼ã¸ã£ãã³, 2005
O'Reilly Japan - ã²ã¼ã éçºè ã®ããã®AIå ¥é(åºçå ã®ç´¹ä»ã¨ç®æ¬¡)
ã²ã¼ã éçºè ã®ããã®AIå ¥é - Google ããã¯ã¹(試ãèªã¿å¯è½)
è足(FAQ)
Q. ã©ããã¦ãã®ãã¿ãªã®?å¥ã«JavaScriptã§ããå¿ è¦æ§ãè¦å½ãããªããã§ããã©!A. JavaScriptã§æ¸ãããã£ãããæ¸ããã ã(æè¨)。
Q. æ¬å½ã«?
A. å¼·ãã¦è¨ããªã「ä»ãªãã°ã©ããcanvasã§æãããªã」ã¨。æã¯ç·ãä¸æ¬å¼ãã®ã«ãçµæ§ãªè¦å´ããã£ã¦(以ä¸ç¥)。
Q. "ãã¡ã¸ã¼çè«"ã¨"ãã¡ã¸ã¼è«ç"ã©ã£ã¡ãã©ã£ã¡ãªã®?
A. ãã¡ã¸ã¼çè«ã®ä¸ã«å«ã¾ããã®ããã¡ã¸ã¼è«çã ã¨ä¿¡ãã¦ãã¾ã。ä½è«ã§ãã、ç´°ãããã¨ãæ°ã«ããªãã®ãé·çãã®ç§è¨£ã§ã。
Q. ãã¡ã¸ã¼çè«ãªãã¦ç¡ãã¦ã、ä¹±æ°ã®é¾å¤ãå¤æåºæºããè¨å®ããã°ããã ããããªãã®?
A. ãã®ã³ã¼ããã¯ã©ã¹ã«é è½ãã¦ãã®ã、ãã¡ã¸ã¼è«çã®ã¡ã³ãã¼ã·ããé¢æ°ãªããããªãããªã、ã¨。ãã¡ã¸ã¼è«çãªãã¦èããªãã¦ãåæ§ã®æ©è½ã¯ä½ããã、è³¢ã人ã¯ç¡æèã«ä½ã£ã¦ãæ°ãããªãã§ããªã。
Q. ãã®æ¬ãèªã¿ãããã©、ãéããªãã®ã§ã©ãã«ããã¦ãã ãã。
A. å³æ¸é¤¨ãå©ç¨ãã¾ããã。
Q. ãã¾ãæ£ã¯ä½å³ã好ãã§ãã?
A. ã³ã¼ã³ãã¿ã¼ã¸ã¥å³ã¨ãã¼ãºå³ã§ã。
ã³ã¡ã³ã
ã³ã¡ã³ããæ稿