├── .gitignore ├── LICENSE ├── README.md └── heuristic └── ACO ├── README.md ├── aco.css ├── aco.js ├── entity ├── Ant.js ├── Direction.js ├── Position.js └── World.js ├── img ├── breezedust.ico └── github.png ├── index.html ├── lib ├── grid.js └── zepto.js ├── package.json └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | build 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 BreezeDust 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 算法实验室 2 | 3 | #### 启发式算法 4 | + [简单蚁群算法](https://github.com/BreezeDust/AlgorithmsLab/tree/master/heuristic/ACO) -------------------------------------------------------------------------------- /heuristic/ACO/README.md: -------------------------------------------------------------------------------- 1 | ## 简单蚁群算法实验模拟 2 | 3 | + [文章地址](http://breezedust.com/2016/07/10/zi-hua-yi-qun-suan-fa-jian-dan-mo-ni-shi-li/) 4 | + [Demo](http://lab.breezedust.com/aco/) 5 | 6 | ### 使用 7 | 8 | ```js 9 | npm run install 10 | npm run start 11 | ``` 12 | 打开浏览器 http://localhost:8080 13 | 14 | ### 参数调整 15 | 16 | 17 | 以下为world可修改参数`entity/World.js` 18 | 19 | ``` 20 | // 静态变量 21 | World.BASE_PHEROMONE=1; // 22 | World.CHANGE_MAX_VALUE=0.02; // 突变概率 23 | World.ANT_NUMBER=50; // 蚂蚁数量 24 | 25 | 26 | 27 | // 可调参数 28 | World.volatile=0; // 信息素挥发参数 29 | World.baseHomePheromone=0; // 家相关信息素起始值 30 | World.baseFoodPheromone=0; // 食物相关信息素起始值 31 | 32 | World.minPheromone=0; // 最小散播信息素值,指达到这个值后,蚂蚁自动被重置 33 | 34 | World.maxPheromoneValue=0; // 最大信息素值 35 | World.showPheromoneType=0; // 显示那种信息素的分布图 36 | ``` 37 | 38 | + demo参数的赋值见`entity/World:_init()` 39 | + 蚂蚁运动相关见`entity/Ant` -------------------------------------------------------------------------------- /heuristic/ACO/aco.css: -------------------------------------------------------------------------------- 1 | body{ 2 | margin: 0px; 3 | padding: 0px; 4 | background-color: #16a085; 5 | position: relative; 6 | } 7 | #gridBg{ 8 | position: relative; 9 | left: 0px; 10 | top:0px; 11 | } 12 | 13 | .normal{ 14 | position: absolute; 15 | width: 20px; 16 | height: 20px; 17 | z-index: 100; 18 | } 19 | .food{ 20 | background-color: #abc123; 21 | } 22 | .home{ 23 | background-color: #407D94; 24 | } 25 | .barrier{ 26 | background-color: #637342; 27 | } 28 | .pheromone{ 29 | background-color: #264863; 30 | } 31 | .ant{ 32 | position: absolute; 33 | width: 20px; 34 | height: 20px; 35 | background-color: #fff; 36 | -webkit-transition: all 1s linear; 37 | transition: all 1s linear; 38 | border-radius: 50%; 39 | z-index: 110; 40 | } 41 | #selectPlane{ 42 | position: absolute; 43 | width: 100%; 44 | height: 100%; 45 | left: 0px; 46 | top:0px; 47 | display: none; 48 | z-index: 200; 49 | } 50 | #selectPlane #innerSelectPlane{ 51 | position: absolute; 52 | width: 60px; 53 | height: 30px; 54 | -webkit-border-radius: 5px; 55 | border-radius: 5px; 56 | overflow: hidden; 57 | 58 | } 59 | 60 | #selectPlane #innerSelectPlane .opacityBg{ 61 | position: absolute; 62 | width: 100%; 63 | height: 100%; 64 | left: 0px; 65 | top:0px; 66 | background-color: #000; 67 | 68 | -webkit-opacity: 0.5; 69 | opacity: 0.5; 70 | 71 | } 72 | #selectPlane #innerSelectPlane .content{ 73 | position: absolute; 74 | width: 100%; 75 | height: 100%; 76 | left: 0px; 77 | top:5px; 78 | } 79 | #selectPlane #innerSelectPlane .content .select{ 80 | width: 20px; 81 | height: 20px; 82 | float: left; 83 | margin-left: 5px; 84 | margin-right: 5px; 85 | 86 | } 87 | #welcome{ 88 | position: absolute; 89 | left: 0px; 90 | top:0px; 91 | width: 100%; 92 | height: 100%; 93 | z-index: 300; 94 | } 95 | #welcome .opacityBg{ 96 | position: absolute; 97 | width: 100%; 98 | height: 100%; 99 | left: 0px; 100 | top:0px; 101 | background-color: #000; 102 | 103 | -webkit-opacity: 0.6; 104 | opacity: 0.55; 105 | } 106 | #welcome .vertical{ 107 | position: absolute; 108 | width: 100%; 109 | height: 100%; 110 | left: 0px; 111 | top:0px; 112 | display: table; 113 | } 114 | #welcome .content{ 115 | position: relative; 116 | width: 100%; 117 | display: table-cell; 118 | vertical-align: middle; 119 | top:-30px; 120 | } 121 | #welcome .content h1{ 122 | width: 100%; 123 | text-align: center; 124 | color: #fff; 125 | font-size: 15px; 126 | } 127 | #welcome .author{ 128 | position: relative; 129 | width: 125px; 130 | margin: auto; 131 | margin-top: 25px; 132 | } 133 | #welcome .author img{ 134 | max-width: 32px; 135 | max-height: 32px; 136 | margin-left: 20px; 137 | -webkit-transition: all 0.6s linear; 138 | transition: all 0.6s linear; 139 | } 140 | #welcome .author img:hover{ 141 | -webkit-opacity: 0.5; 142 | opacity: 0.5; 143 | } 144 | #welcome .tip{ 145 | position: relative; 146 | margin: auto; 147 | margin-top: 9%; 148 | } 149 | #welcome .tip h2{ 150 | width: 100%; 151 | text-align: center; 152 | font-size: 12px; 153 | color:rgba(255,255,255,0.8); 154 | } 155 | #welcome .tip .block{ 156 | position: relative; 157 | width:101px; 158 | margin: auto; 159 | 160 | } 161 | #welcome .outSelect{ 162 | position: relative; 163 | float: left; 164 | margin-left: 20px; 165 | } 166 | #welcome .outSelect h2{ 167 | font-size: 12px; 168 | color:rgba(255,255,255,0.8); 169 | } 170 | #welcome .select{ 171 | position: relative; 172 | width: 20px; 173 | height: 20px; 174 | margin: auto; 175 | } 176 | 177 | 178 | #welcome .content .btn{ 179 | position: relative; 180 | margin: auto; 181 | width: 120px; 182 | height: 40px; 183 | line-height: 40px; 184 | background-color: #16a085; 185 | color: #fff; 186 | text-align: center; 187 | margin-top: 7%; 188 | } 189 | .green{ 190 | background-color: #abc123; 191 | } 192 | .scaleOutAnim{ 193 | -webkit-animation: scaleOut 0.4s ease; 194 | animation: scaleOut 0.4s ease; 195 | } 196 | @-webkit-keyframes scaleOut 197 | { 198 | 0%{ 199 | -webkit-transform: scale(0); 200 | } 201 | /*90%{ 202 | -webkit-transform: scale(1.2); 203 | }*/ 204 | 100%{ 205 | -webkit-transform: scale(1); 206 | } 207 | } 208 | @keyframes scaleOut 209 | { 210 | 0%{ 211 | transform: scale(0); 212 | } 213 | /*90%{ 214 | transform: scale(1.2); 215 | }*/ 216 | 100%{ 217 | transform: scale(1); 218 | } 219 | } -------------------------------------------------------------------------------- /heuristic/ACO/aco.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author: BreezeDust 3 | * @Date: 2016-07-04 4 | * @Email: breezedust.com@gmail.com 5 | * @Last modified by: BreezeDust 6 | * @Last modified time: 2016-07-10 7 | */ 8 | require("./lib/zepto.js"); 9 | require("./lib/grid.js"); 10 | 11 | var Ant=require("./entity/Ant.js"); 12 | var World=require("./entity/World.js"); 13 | var Position=require("./entity/Position.js"); 14 | 15 | (function() { 16 | function initGridBg() { 17 | var canvas = document.getElementById('gridBg'); 18 | var ctx = canvas.getContext('2d'); 19 | canvas.width=window.innerWidth; 20 | canvas.height=window.innerHeight; 21 | console.log(canvas.width, canvas.height,window.innerWidth,window.innerHeight); 22 | var opts = { 23 | distance: 20, 24 | lineWidth: 0.1, 25 | gridColor: "#fff", 26 | caption: false 27 | }; 28 | new Grid(opts).draw(ctx); 29 | } 30 | function start(){ 31 | var world=new World(window.innerWidth,window.innerHeight,20); 32 | var antList=[]; 33 | var isRun=false; 34 | window.world=world; 35 | function _run(){ 36 | if(!isRun){ 37 | isRun=true; 38 | world.volatitlePheromone(); 39 | if(antList.length"); 43 | for(var i=0;i'); 71 | $("body").append(this.dom); 72 | this.dom.addClass("ant"); 73 | } 74 | this.dom.removeClass("green"); 75 | 76 | this.dom.css({ 77 | left:this.homePosition.x*20, 78 | top:this.homePosition.y*20 79 | }); 80 | } 81 | Ant.prototype._getP=function(position,status){ 82 | var value=0; 83 | if(status==Ant.STATUS_FIND_FOOD){ 84 | if(this.homePosition!=null){ 85 | // var manhattan=Math.abs(position.x-this.homePosition.x)+Math.abs(position.y-this.homePosition.y); 86 | value=World.baseHomePheromone/this.step; 87 | 88 | } 89 | } 90 | else if(status===Ant.STATUS_CARRY_FOOD){ 91 | if(this.foodPosition!=null){ 92 | // var manhattan=Math.abs(position.x-this.foodPosition.x)+Math.abs(position.y-this.foodPosition.y); 93 | value=World.baseFoodPheromone/this.step; 94 | } 95 | } 96 | return value<=0.1? 0:value; 97 | }; 98 | Ant.prototype._leavePheromone=function(position){ 99 | position.leavePheromone(this._getP(position,this.status),this.status); 100 | } 101 | Ant.prototype._check=function(position){ 102 | if(position==null){ 103 | return Ant.CHECK_BARRIER; 104 | } 105 | if(position.x==this.homePosition.x && position.y==this.homePosition.y){ 106 | return Ant.CHECK_HOME; 107 | } 108 | 109 | if(position.type==Position.TYPE_BARRIER){ 110 | return Ant.CHECK_BARRIER; 111 | } 112 | else if (position.type==Position.TYPE_NORMAL) { 113 | return Ant.CHECK_NOMARL; 114 | } 115 | return Ant.CHECK_FOOD; 116 | 117 | } 118 | Ant.prototype._setStatus=function(status){ 119 | this.status=status; 120 | } 121 | Ant.prototype.move=function(){ 122 | this.step++; 123 | 124 | var lastPosition=this.checkList[this.checkList.length-1]; 125 | 126 | var newPosition=this._findPosition(lastPosition); 127 | 128 | // 没有信息素时,回家 129 | if(this._getP(lastPosition,this.status)<=World.minPheromone){ 130 | this._init(); 131 | return; 132 | } 133 | var check=this._check(newPosition); 134 | if(check==Ant.CHECK_BARRIER){ 135 | this.dp=Math.floor(Math.random()*Direction.M.length); 136 | } 137 | else if(check==Ant.CHECK_NOMARL){ 138 | this._move(newPosition); 139 | } 140 | else if(check==Ant.CHECK_FOOD){ 141 | this.step=0; 142 | this.checkList=[]; 143 | this.foodPosition=newPosition; 144 | this._setStatus(Ant.STATUS_CARRY_FOOD) 145 | this._move(newPosition); 146 | this.dom.addClass("green"); 147 | } 148 | else if(check==Ant.CHECK_HOME){ 149 | this._init(); 150 | // if(this.status==Ant.STATUS_FIND_FOOD){ 151 | // this._move(newPosition); 152 | // } 153 | // else if(this.status==Ant.STATUS_CARRY_FOOD){ 154 | // this._init(); 155 | // } 156 | } 157 | }; 158 | 159 | Ant.prototype._findPosition=function(lastPosition,isStart){ 160 | var changeWhell = [0.4, 0.2, World.CHANGE_MAX_VALUE, 0.4-World.CHANGE_MAX_VALUE]; 161 | var change=changeWhell[Ant.lunpandu(changeWhell)]; 162 | // 探测信息素 163 | var findStatus=Ant.STATUS_CARRY_FOOD; 164 | if(this.status==Ant.STATUS_CARRY_FOOD){ 165 | findStatus=Ant.STATUS_FIND_FOOD; 166 | } 167 | if(this.status==Ant.STATUS_FIND_FOOD && change<=World.CHANGE_MAX_VALUE){ 168 | // console.log("===>","change",change); 169 | this.dp=Math.floor(Math.random()*Direction.M.length); 170 | } 171 | else{ 172 | var pheromoneList=[]; 173 | var allPheromone=0; 174 | for (var j = 1; j <= 1; j++) { 175 | for (var i = 0; i < Direction.M.length; i++) { 176 | var checkP = lastPosition.move(Direction.M[i], this._word.map, j); 177 | var check = this._check(checkP); 178 | if (check != Ant.CHECK_BARRIER) { 179 | if (this.status == this.lastStatus) { 180 | // 防止小幅度震荡 181 | if (this._getCheckedIndex(checkP) < 0) { 182 | allPheromone+=checkP.getP(findStatus); 183 | pheromoneList.push(checkP); 184 | } 185 | } else { 186 | allPheromone+=checkP.getP(findStatus); 187 | pheromoneList.push(checkP); 188 | } 189 | 190 | } 191 | } 192 | 193 | } 194 | this.lastStatus=this.status; 195 | if(allPheromone>0){ 196 | var whell=[]; 197 | for(var k=0;k",selectIndex); 203 | if(selectIndex>=0 && selectIndex=0){ 238 | this.checkList.splice(insertIndex,1); 239 | } 240 | this.checkList.push(position); 241 | }; 242 | Ant.prototype._getCheckedIndex=function(position){ 243 | for(var i=0;i'); 41 | this.dom.css({ 42 | left:this.x*20, 43 | top:this.y*20 44 | }); 45 | $("body").append(this.dom); 46 | this.dom.addClass("normal"); 47 | var that=this; 48 | $(this.dom).click(function(){ 49 | console.log( 50 | that.x, 51 | that.y, 52 | that.pheromone[Position.P_TYPE_FOOD].toFixed(2), 53 | that.pheromone[Position.P_TYPE_HOME].toFixed(2)); 54 | that._world.clickPosition(that); 55 | }); 56 | } 57 | Position.prototype.getP=function(pType){ 58 | return this.pheromone[pType]; 59 | }; 60 | Position.prototype.move=function(direction,map,deep){ 61 | if(deep==null){ 62 | deep=1; 63 | } 64 | var x=this.x+direction[0]*deep; 65 | var y=this.y+direction[1]*deep; 66 | if(x<0 || y<0 || x>=map.length || y>=map[0].length){ 67 | return null; 68 | } 69 | return map[x][y]; 70 | } 71 | Position.prototype.volatitlePheromone=function(volatite){ 72 | this._volatitlePheromone(volatite,Position.P_TYPE_FOOD); 73 | this._volatitlePheromone(volatite,Position.P_TYPE_HOME); 74 | 75 | } 76 | Position.prototype._volatitlePheromone=function(volatite,pType){ 77 | if(this.type==Position.TYPE_NORMAL){ 78 | if(this.pheromone[pType]-volatite<0){ 79 | this.pheromone[pType]=0; 80 | } 81 | else{ 82 | this.pheromone[pType]-=volatite; 83 | } 84 | return this.pheromone[pType]; 85 | } 86 | return 0; 87 | 88 | } 89 | Position.prototype.leavePheromone=function(fp,pType){ 90 | if(this.type==Position.TYPE_NORMAL){ 91 | this.pheromone[pType]+=fp; 92 | } 93 | } 94 | Position.prototype.changeType=function(type){ 95 | if(this.type==Position.TYPE_BARRIER){ 96 | this.dom.removeClass("barrier"); 97 | } 98 | if(this.type==Position.TYPE_HOME){ 99 | this.dom.removeClass("home"); 100 | } 101 | if(this.type==Position.TYPE_FOOD){ 102 | this.dom.removeClass("food"); 103 | } 104 | this.type=type; 105 | this.dom.removeClass("pheromone"); 106 | this.dom.css({ 107 | "opacity":1 108 | }); 109 | if(type==Position.TYPE_BARRIER){ 110 | this.pheromone[Position.P_TYPE_FOOD]=0; 111 | this.pheromone[Position.P_TYPE_HOME]=0; 112 | this.showBarrire(); 113 | } 114 | if(type==Position.TYPE_FOOD){ 115 | this.pheromone[Position.P_TYPE_FOOD]=Number.MAX_VALUE; 116 | this.pheromone[Position.P_TYPE_HOME]=0; 117 | this.showFood(); 118 | } 119 | }; 120 | Position.prototype.showBarrire=function(){ 121 | if(this.type==Position.TYPE_BARRIER){ 122 | this.dom.addClass("barrier"); 123 | } 124 | } 125 | Position.prototype.showFood=function(){ 126 | if(this.type==Position.TYPE_FOOD){ 127 | this.dom.addClass("food"); 128 | } 129 | } 130 | Position.prototype.showHome=function(){ 131 | if(this.type==Position.TYPE_HOME){ 132 | this.dom.addClass("home"); 133 | } 134 | } 135 | Position.prototype.showPheromone=function(max,showType){ 136 | var a=(max-this.pheromone[showType])/max; 137 | if(this.type==Position.TYPE_NORMAL){ 138 | var r=38; 139 | var g=72; 140 | var b=99; 141 | if(a>=1){ 142 | a=1; 143 | } 144 | if(a<=0){ 145 | a=0; 146 | } 147 | a=1-a; 148 | this.dom.addClass("pheromone"); 149 | 150 | this.dom.css({ 151 | "opacity":a 152 | }); 153 | } 154 | } 155 | module.exports=Position; -------------------------------------------------------------------------------- /heuristic/ACO/entity/World.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author: BreezeDust 3 | * @Date: 2016-07-04 4 | * @Email: breezedust.com@gmail.com 5 | * @Last modified by: BreezeDust 6 | * @Last modified time: 2016-07-10 7 | */ 8 | 9 | 10 | var Position=require("./Position.js"); 11 | 12 | function World(width,height,distance){ 13 | this.map=[]; 14 | this.width=width; 15 | this.height=height; 16 | this.distance=distance; 17 | this.checkList=[]; 18 | this.selectedPosition=null; 19 | this.xl=parseInt(width/distance); 20 | this.yl=parseInt(height/distance); 21 | 22 | this._init(); 23 | 24 | } 25 | // 静态变量 26 | World.BASE_PHEROMONE=1; 27 | World.CHANGE_MAX_VALUE=0.02; // 突变概率 28 | World.ANT_NUMBER=50; // 蚂蚁数量 29 | 30 | 31 | 32 | // 可调参数 33 | World.volatile=0; // 挥发参数 34 | World.baseHomePheromone=0; // 家相关信息素起始值 35 | World.baseFoodPheromone=0; // 食物相关信息素起始值 36 | 37 | World.minPheromone=0; // 最小信息素值 38 | 39 | World.maxPheromoneValue=0; // 最大信息素值 40 | World.showPheromoneType=0; // 显示那种信息素的分布 41 | 42 | World.prototype._init=function(){ 43 | 44 | var maxLength=parseInt(Math.sqrt(this.xl*this.xl +this.yl*this.yl)); 45 | World.baseHomePheromone=maxLength*World.BASE_PHEROMONE; 46 | World.baseFoodPheromone=maxLength*World.BASE_PHEROMONE; 47 | 48 | World.minPheromone=World.BASE_PHEROMONE; 49 | World.volatile=World.BASE_PHEROMONE/2; 50 | World.maxPheromoneValue=World.baseHomePheromone; 51 | World.showPheromoneType=Position.P_TYPE_HOME; 52 | 53 | console.log("World.volatile",World.volatile); 54 | console.log("World.baseHomePheromone",World.baseHomePheromone); 55 | console.log("World.baseFoodPheromone",World.baseFoodPheromone); 56 | console.log("World.minPheromone",World.minPheromone); 57 | console.log("World.minPheromone",World.showPheromoneType); 58 | 59 | 60 | for(var i=0;iheight*1.5){ 112 | top=position.y*20-height; 113 | } 114 | else{ 115 | top=position.y*20+height; 116 | } 117 | if(position.x*20>width/2){ 118 | left=position.x*20-width/2+10; 119 | } 120 | else if((this.xl-position.x)*20=0){ 138 | this.checkList.splice(insertIndex,1); 139 | } 140 | this.checkList.push(position); 141 | }; 142 | World.prototype._getCheckedIndex=function(position){ 143 | for(var i=0;imax){ 155 | max=position.getP(World.showPheromoneType); 156 | } 157 | position.volatitlePheromone(World.volatile); 158 | position.showPheromone(World.maxPheromoneValue,World.showPheromoneType); 159 | } 160 | // console.log("====>",max); 161 | // World.maxPheromoneValue=max; 162 | } 163 | World.prototype.getPosition=function(x,y){ 164 | return this.map[x][y]; 165 | } 166 | module.exports=World; 167 | -------------------------------------------------------------------------------- /heuristic/ACO/img/breezedust.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BreezeDust/AlgorithmsLab/befda7d8d6105f075c0c3135b765b7f55c36fa73/heuristic/ACO/img/breezedust.ico -------------------------------------------------------------------------------- /heuristic/ACO/img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BreezeDust/AlgorithmsLab/befda7d8d6105f075c0c3135b765b7f55c36fa73/heuristic/ACO/img/github.png -------------------------------------------------------------------------------- /heuristic/ACO/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 简单蚁群算法 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | 23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |

简单蚁群算法模拟

31 |
32 | 33 | 34 | 35 |
36 |
37 |

点击单元格,可放置以下物品

38 |
39 |
40 |
41 |
42 |

障碍

43 |
44 |
45 |
46 |
47 |

食物

48 |
49 |
50 |
51 |
52 |
开始
53 |
54 |
55 |
56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /heuristic/ACO/lib/grid.js: -------------------------------------------------------------------------------- 1 | //enterprisbug.github.com/grid.js#v1.1 2 | (function (window, document, undefined) { 3 | function mergeWithDefaultValues(obj) { 4 | for (var i = 1; i < arguments.length; i++) { 5 | var def = arguments[i]; 6 | for (var n in def) { 7 | if (obj[n] === undefined) { 8 | obj[n] = def[n]; 9 | } 10 | } 11 | } 12 | return obj; 13 | } 14 | 15 | var defaults = { 16 | distance: 50, 17 | lineWidth: 1, 18 | gridColor: "#000000", 19 | caption: true, 20 | font: "10px Verdana", 21 | verticalLines: true, 22 | horizontalLines: true 23 | }; 24 | 25 | /** The constructor */ 26 | var Grid = function Grid(o) { 27 | if (!this.draw) return new Grid(o); 28 | this.opts = mergeWithDefaultValues(o || {}, Grid.defaults, defaults); 29 | }; 30 | 31 | Grid.defaults = {}; 32 | mergeWithDefaultValues(Grid.prototype, { 33 | draw: function (target) { 34 | var self = this; 35 | var o = self.opts; 36 | 37 | if (target) { 38 | target.lineWidth = o.lineWidth; 39 | target.strokeStyle = o.gridColor; 40 | target.font = o.font; 41 | 42 | if (target.canvas.width > target.canvas.height) { 43 | until = target.canvas.width; 44 | } else { 45 | until = target.canvas.height; 46 | } 47 | 48 | // vertical lines 49 | for (var y = 0; y <= until; y += o.distance) { 50 | if (o.horizontalLines) { 51 | target.beginPath(); 52 | if (o.lineWidth == 1.0) { 53 | target.moveTo(0, y + 0.5); 54 | target.lineTo(target.canvas.width, y + 0.5); 55 | } else { 56 | target.moveTo(0, y); 57 | target.lineTo(target.canvas.width, y); 58 | } 59 | target.closePath(); 60 | target.stroke(); 61 | } 62 | if (o.caption && o.verticalLines) { 63 | target.fillText(y, y, 10); 64 | } 65 | } 66 | 67 | // horizontal lines 68 | for (var x = 0; x <= until; x += o.distance) { 69 | if (o.verticalLines) { 70 | target.beginPath(); 71 | if (o.lineWidth == 1.0) { 72 | target.moveTo(x + 0.5, 0); 73 | target.lineTo(x + 0.5, target.canvas.height); 74 | } else { 75 | target.moveTo(x, 0); 76 | target.lineTo(x, target.canvas.height); 77 | } 78 | target.closePath(); 79 | target.stroke(); 80 | } 81 | if (o.caption && o.horizontalLines) { 82 | target.fillText(x, 0, x); 83 | } 84 | } 85 | 86 | } 87 | } 88 | }); 89 | 90 | window.Grid = Grid; 91 | 92 | })(window, document); -------------------------------------------------------------------------------- /heuristic/ACO/lib/zepto.js: -------------------------------------------------------------------------------- 1 | /* Zepto v1.1.6 - zepto event ajax form ie - zeptojs.com/license */ 2 | var Zepto=function(){function L(t){return null==t?String(t):j[S.call(t)]||"object"}function Z(t){return"function"==L(t)}function _(t){return null!=t&&t==t.window}function $(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function D(t){return"object"==L(t)}function M(t){return D(t)&&!_(t)&&Object.getPrototypeOf(t)==Object.prototype}function R(t){return"number"==typeof t.length}function k(t){return s.call(t,function(t){return null!=t})}function z(t){return t.length>0?n.fn.concat.apply([],t):t}function F(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function q(t){return t in f?f[t]:f[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function H(t,e){return"number"!=typeof e||c[F(t)]?e:e+"px"}function I(t){var e,n;return u[t]||(e=a.createElement(t),a.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),u[t]=n),u[t]}function V(t){return"children"in t?o.call(t.children):n.map(t.childNodes,function(t){return 1==t.nodeType?t:void 0})}function B(n,i,r){for(e in i)r&&(M(i[e])||A(i[e]))?(M(i[e])&&!M(n[e])&&(n[e]={}),A(i[e])&&!A(n[e])&&(n[e]=[]),B(n[e],i[e],r)):i[e]!==t&&(n[e]=i[e])}function U(t,e){return null==e?n(t):n(t).filter(e)}function J(t,e,n,i){return Z(e)?e.call(t,n,i):e}function X(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function W(e,n){var i=e.className||"",r=i&&i.baseVal!==t;return n===t?r?i.baseVal:i:void(r?i.baseVal=n:e.className=n)}function Y(t){try{return t?"true"==t||("false"==t?!1:"null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?n.parseJSON(t):t):t}catch(e){return t}}function G(t,e){e(t);for(var n=0,i=t.childNodes.length;i>n;n++)G(t.childNodes[n],e)}var t,e,n,i,C,N,r=[],o=r.slice,s=r.filter,a=window.document,u={},f={},c={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},l=/^\s*<(\w+|!)[^>]*>/,h=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,p=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,d=/^(?:body|html)$/i,m=/([A-Z])/g,g=["val","css","html","text","data","width","height","offset"],v=["after","prepend","before","append"],y=a.createElement("table"),x=a.createElement("tr"),b={tr:a.createElement("tbody"),tbody:y,thead:y,tfoot:y,td:x,th:x,"*":a.createElement("div")},w=/complete|loaded|interactive/,E=/^[\w-]*$/,j={},S=j.toString,T={},O=a.createElement("div"),P={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},A=Array.isArray||function(t){return t instanceof Array};return T.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var i,r=t.parentNode,o=!r;return o&&(r=O).appendChild(t),i=~T.qsa(r,e).indexOf(t),o&&O.removeChild(t),i},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return s.call(t,function(e,n){return t.indexOf(e)==n})},T.fragment=function(e,i,r){var s,u,f;return h.test(e)&&(s=n(a.createElement(RegExp.$1))),s||(e.replace&&(e=e.replace(p,"<$1>")),i===t&&(i=l.test(e)&&RegExp.$1),i in b||(i="*"),f=b[i],f.innerHTML=""+e,s=n.each(o.call(f.childNodes),function(){f.removeChild(this)})),M(r)&&(u=n(s),n.each(r,function(t,e){g.indexOf(t)>-1?u[t](e):u.attr(t,e)})),s},T.Z=function(t,e){return t=t||[],t.__proto__=n.fn,t.selector=e||"",t},T.isZ=function(t){return t instanceof T.Z},T.init=function(e,i){var r;if(!e)return T.Z();if("string"==typeof e)if(e=e.trim(),"<"==e[0]&&l.test(e))r=T.fragment(e,RegExp.$1,i),e=null;else{if(i!==t)return n(i).find(e);r=T.qsa(a,e)}else{if(Z(e))return n(a).ready(e);if(T.isZ(e))return e;if(A(e))r=k(e);else if(D(e))r=[e],e=null;else if(l.test(e))r=T.fragment(e.trim(),RegExp.$1,i),e=null;else{if(i!==t)return n(i).find(e);r=T.qsa(a,e)}}return T.Z(r,e)},n=function(t,e){return T.init(t,e)},n.extend=function(t){var e,n=o.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){B(t,n,e)}),t},T.qsa=function(t,e){var n,i="#"==e[0],r=!i&&"."==e[0],s=i||r?e.slice(1):e,a=E.test(s);return $(t)&&a&&i?(n=t.getElementById(s))?[n]:[]:1!==t.nodeType&&9!==t.nodeType?[]:o.call(a&&!i?r?t.getElementsByClassName(s):t.getElementsByTagName(e):t.querySelectorAll(e))},n.contains=a.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},n.type=L,n.isFunction=Z,n.isWindow=_,n.isArray=A,n.isPlainObject=M,n.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},n.inArray=function(t,e,n){return r.indexOf.call(e,t,n)},n.camelCase=C,n.trim=function(t){return null==t?"":String.prototype.trim.call(t)},n.uuid=0,n.support={},n.expr={},n.map=function(t,e){var n,r,o,i=[];if(R(t))for(r=0;r=0?e:e+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return r.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return Z(t)?this.not(this.not(t)):n(s.call(this,function(e){return T.matches(e,t)}))},add:function(t,e){return n(N(this.concat(n(t,e))))},is:function(t){return this.length>0&&T.matches(this[0],t)},not:function(e){var i=[];if(Z(e)&&e.call!==t)this.each(function(t){e.call(this,t)||i.push(this)});else{var r="string"==typeof e?this.filter(e):R(e)&&Z(e.item)?o.call(e):n(e);this.forEach(function(t){r.indexOf(t)<0&&i.push(t)})}return n(i)},has:function(t){return this.filter(function(){return D(t)?n.contains(this,t):n(this).find(t).size()})},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!D(t)?t:n(t)},last:function(){var t=this[this.length-1];return t&&!D(t)?t:n(t)},find:function(t){var e,i=this;return e=t?"object"==typeof t?n(t).filter(function(){var t=this;return r.some.call(i,function(e){return n.contains(e,t)})}):1==this.length?n(T.qsa(this[0],t)):this.map(function(){return T.qsa(this,t)}):n()},closest:function(t,e){var i=this[0],r=!1;for("object"==typeof t&&(r=n(t));i&&!(r?r.indexOf(i)>=0:T.matches(i,t));)i=i!==e&&!$(i)&&i.parentNode;return n(i)},parents:function(t){for(var e=[],i=this;i.length>0;)i=n.map(i,function(t){return(t=t.parentNode)&&!$(t)&&e.indexOf(t)<0?(e.push(t),t):void 0});return U(e,t)},parent:function(t){return U(N(this.pluck("parentNode")),t)},children:function(t){return U(this.map(function(){return V(this)}),t)},contents:function(){return this.map(function(){return o.call(this.childNodes)})},siblings:function(t){return U(this.map(function(t,e){return s.call(V(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return n.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=I(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=Z(t);if(this[0]&&!e)var i=n(t).get(0),r=i.parentNode||this.length>1;return this.each(function(o){n(this).wrapAll(e?t.call(this,o):r?i.cloneNode(!0):i)})},wrapAll:function(t){if(this[0]){n(this[0]).before(t=n(t));for(var e;(e=t.children()).length;)t=e.first();n(t).append(this)}return this},wrapInner:function(t){var e=Z(t);return this.each(function(i){var r=n(this),o=r.contents(),s=e?t.call(this,i):t;o.length?o.wrapAll(s):r.append(s)})},unwrap:function(){return this.parent().each(function(){n(this).replaceWith(n(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(e){return this.each(function(){var i=n(this);(e===t?"none"==i.css("display"):e)?i.show():i.hide()})},prev:function(t){return n(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return n(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var i=this.innerHTML;n(this).empty().append(J(this,t,e,i))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=J(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this[0].textContent:null},attr:function(n,i){var r;return"string"!=typeof n||1 in arguments?this.each(function(t){if(1===this.nodeType)if(D(n))for(e in n)X(this,e,n[e]);else X(this,n,J(this,i,t,this.getAttribute(n)))}):this.length&&1===this[0].nodeType?!(r=this[0].getAttribute(n))&&n in this[0]?this[0][n]:r:t},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){X(this,t)},this)})},prop:function(t,e){return t=P[t]||t,1 in arguments?this.each(function(n){this[t]=J(this,e,n,this[t])}):this[0]&&this[0][t]},data:function(e,n){var i="data-"+e.replace(m,"-$1").toLowerCase(),r=1 in arguments?this.attr(i,n):this.attr(i);return null!==r?Y(r):t},val:function(t){return 0 in arguments?this.each(function(e){this.value=J(this,t,e,this.value)}):this[0]&&(this[0].multiple?n(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var i=n(this),r=J(this,t,e,i.offset()),o=i.offsetParent().offset(),s={top:r.top-o.top,left:r.left-o.left};"static"==i.css("position")&&(s.position="relative"),i.css(s)});if(!this.length)return null;var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(t,i){if(arguments.length<2){var r,o=this[0];if(!o)return;if(r=getComputedStyle(o,""),"string"==typeof t)return o.style[C(t)]||r.getPropertyValue(t);if(A(t)){var s={};return n.each(t,function(t,e){s[e]=o.style[C(e)]||r.getPropertyValue(e)}),s}}var a="";if("string"==L(t))i||0===i?a=F(t)+":"+H(t,i):this.each(function(){this.style.removeProperty(F(t))});else for(e in t)t[e]||0===t[e]?a+=F(e)+":"+H(e,t[e])+";":this.each(function(){this.style.removeProperty(F(e))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(n(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return t?r.some.call(this,function(t){return this.test(W(t))},q(t)):!1},addClass:function(t){return t?this.each(function(e){if("className"in this){i=[];var r=W(this),o=J(this,t,e,r);o.split(/\s+/g).forEach(function(t){n(this).hasClass(t)||i.push(t)},this),i.length&&W(this,r+(r?" ":"")+i.join(" "))}}):this},removeClass:function(e){return this.each(function(n){if("className"in this){if(e===t)return W(this,"");i=W(this),J(this,e,n,i).split(/\s+/g).forEach(function(t){i=i.replace(q(t)," ")}),W(this,i.trim())}})},toggleClass:function(e,i){return e?this.each(function(r){var o=n(this),s=J(this,e,r,W(this));s.split(/\s+/g).forEach(function(e){(i===t?!o.hasClass(e):i)?o.addClass(e):o.removeClass(e)})}):this},scrollTop:function(e){if(this.length){var n="scrollTop"in this[0];return e===t?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=e}:function(){this.scrollTo(this.scrollX,e)})}},scrollLeft:function(e){if(this.length){var n="scrollLeft"in this[0];return e===t?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=e}:function(){this.scrollTo(e,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),i=this.offset(),r=d.test(e[0].nodeName)?{top:0,left:0}:e.offset();return i.top-=parseFloat(n(t).css("margin-top"))||0,i.left-=parseFloat(n(t).css("margin-left"))||0,r.top+=parseFloat(n(e[0]).css("border-top-width"))||0,r.left+=parseFloat(n(e[0]).css("border-left-width"))||0,{top:i.top-r.top,left:i.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||a.body;t&&!d.test(t.nodeName)&&"static"==n(t).css("position");)t=t.offsetParent;return t})}},n.fn.detach=n.fn.remove,["width","height"].forEach(function(e){var i=e.replace(/./,function(t){return t[0].toUpperCase()});n.fn[e]=function(r){var o,s=this[0];return r===t?_(s)?s["inner"+i]:$(s)?s.documentElement["scroll"+i]:(o=this.offset())&&o[e]:this.each(function(t){s=n(this),s.css(e,J(this,r,t,s[e]()))})}}),v.forEach(function(t,e){var i=e%2;n.fn[t]=function(){var t,o,r=n.map(arguments,function(e){return t=L(e),"object"==t||"array"==t||null==e?e:T.fragment(e)}),s=this.length>1;return r.length<1?this:this.each(function(t,u){o=i?u:u.parentNode,u=0==e?u.nextSibling:1==e?u.firstChild:2==e?u:null;var f=n.contains(a.documentElement,o);r.forEach(function(t){if(s)t=t.cloneNode(!0);else if(!o)return n(t).remove();o.insertBefore(t,u),f&&G(t,function(t){null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src||window.eval.call(window,t.innerHTML)})})})},n.fn[i?t+"To":"insert"+(e?"Before":"After")]=function(e){return n(e)[t](this),this}}),T.Z.prototype=n.fn,T.uniq=N,T.deserializeValue=Y,n.zepto=T,n}();window.Zepto=Zepto,void 0===window.$&&(window.$=Zepto),function(t){function l(t){return t._zid||(t._zid=e++)}function h(t,e,n,i){if(e=p(e),e.ns)var r=d(e.ns);return(s[l(t)]||[]).filter(function(t){return!(!t||e.e&&t.e!=e.e||e.ns&&!r.test(t.ns)||n&&l(t.fn)!==l(n)||i&&t.sel!=i)})}function p(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function d(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function m(t,e){return t.del&&!u&&t.e in f||!!e}function g(t){return c[t]||u&&f[t]||t}function v(e,i,r,o,a,u,f){var h=l(e),d=s[h]||(s[h]=[]);i.split(/\s/).forEach(function(i){if("ready"==i)return t(document).ready(r);var s=p(i);s.fn=r,s.sel=a,s.e in c&&(r=function(e){var n=e.relatedTarget;return!n||n!==this&&!t.contains(this,n)?s.fn.apply(this,arguments):void 0}),s.del=u;var l=u||r;s.proxy=function(t){if(t=j(t),!t.isImmediatePropagationStopped()){t.data=o;var i=l.apply(e,t._args==n?[t]:[t].concat(t._args));return i===!1&&(t.preventDefault(),t.stopPropagation()),i}},s.i=d.length,d.push(s),"addEventListener"in e&&e.addEventListener(g(s.e),s.proxy,m(s,f))})}function y(t,e,n,i,r){var o=l(t);(e||"").split(/\s/).forEach(function(e){h(t,e,n,i).forEach(function(e){delete s[o][e.i],"removeEventListener"in t&&t.removeEventListener(g(e.e),e.proxy,m(e,r))})})}function j(e,i){return(i||!e.isDefaultPrevented)&&(i||(i=e),t.each(E,function(t,n){var r=i[t];e[t]=function(){return this[n]=x,r&&r.apply(i,arguments)},e[n]=b}),(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?i.returnValue===!1:i.getPreventDefault&&i.getPreventDefault())&&(e.isDefaultPrevented=x)),e}function S(t){var e,i={originalEvent:t};for(e in t)w.test(e)||t[e]===n||(i[e]=t[e]);return j(i,t)}var n,e=1,i=Array.prototype.slice,r=t.isFunction,o=function(t){return"string"==typeof t},s={},a={},u="onfocusin"in window,f={focus:"focusin",blur:"focusout"},c={mouseenter:"mouseover",mouseleave:"mouseout"};a.click=a.mousedown=a.mouseup=a.mousemove="MouseEvents",t.event={add:v,remove:y},t.proxy=function(e,n){var s=2 in arguments&&i.call(arguments,2);if(r(e)){var a=function(){return e.apply(n,s?s.concat(i.call(arguments)):arguments)};return a._zid=l(e),a}if(o(n))return s?(s.unshift(e[n],e),t.proxy.apply(null,s)):t.proxy(e[n],e);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,i){return this.on(t,e,n,i,1)};var x=function(){return!0},b=function(){return!1},w=/^([A-Z]|returnValue$|layer[XY]$)/,E={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,s,a,u,f){var c,l,h=this;return e&&!o(e)?(t.each(e,function(t,e){h.on(t,s,a,e,f)}),h):(o(s)||r(u)||u===!1||(u=a,a=s,s=n),(r(a)||a===!1)&&(u=a,a=n),u===!1&&(u=b),h.each(function(n,r){f&&(c=function(t){return y(r,t.type,u),u.apply(this,arguments)}),s&&(l=function(e){var n,o=t(e.target).closest(s,r).get(0);return o&&o!==r?(n=t.extend(S(e),{currentTarget:o,liveFired:r}),(c||u).apply(o,[n].concat(i.call(arguments,1)))):void 0}),v(r,e,u,a,s,l||c)}))},t.fn.off=function(e,i,s){var a=this;return e&&!o(e)?(t.each(e,function(t,e){a.off(t,i,e)}),a):(o(i)||r(s)||s===!1||(s=i,i=n),s===!1&&(s=b),a.each(function(){y(this,e,s,i)}))},t.fn.trigger=function(e,n){return e=o(e)||t.isPlainObject(e)?t.Event(e):j(e),e._args=n,this.each(function(){e.type in f&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,n){var i,r;return this.each(function(s,a){i=S(o(e)?t.Event(e):e),i._args=n,i.target=a,t.each(h(a,e.type||e),function(t,e){return r=e.proxy(i),i.isImmediatePropagationStopped()?!1:void 0})}),r},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){o(t)||(e=t,t=e.type);var n=document.createEvent(a[t]||"Events"),i=!0;if(e)for(var r in e)"bubbles"==r?i=!!e[r]:n[r]=e[r];return n.initEvent(t,i,!0),j(n)}}(Zepto),function(t){function h(e,n,i){var r=t.Event(n);return t(e).trigger(r,i),!r.isDefaultPrevented()}function p(t,e,i,r){return t.global?h(e||n,i,r):void 0}function d(e){e.global&&0===t.active++&&p(e,null,"ajaxStart")}function m(e){e.global&&!--t.active&&p(e,null,"ajaxStop")}function g(t,e){var n=e.context;return e.beforeSend.call(n,t,e)===!1||p(e,n,"ajaxBeforeSend",[t,e])===!1?!1:void p(e,n,"ajaxSend",[t,e])}function v(t,e,n,i){var r=n.context,o="success";n.success.call(r,t,o,e),i&&i.resolveWith(r,[t,o,e]),p(n,r,"ajaxSuccess",[e,n,t]),x(o,e,n)}function y(t,e,n,i,r){var o=i.context;i.error.call(o,n,e,t),r&&r.rejectWith(o,[n,e,t]),p(i,o,"ajaxError",[n,i,t||e]),x(e,n,i)}function x(t,e,n){var i=n.context;n.complete.call(i,e,t),p(n,i,"ajaxComplete",[e,n]),m(n)}function b(){}function w(t){return t&&(t=t.split(";",2)[0]),t&&(t==f?"html":t==u?"json":s.test(t)?"script":a.test(t)&&"xml")||"text"}function E(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function j(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()||(e.url=E(e.url,e.data),e.data=void 0)}function S(e,n,i,r){return t.isFunction(n)&&(r=i,i=n,n=void 0),t.isFunction(i)||(r=i,i=void 0),{url:e,data:n,success:i,dataType:r}}function C(e,n,i,r){var o,s=t.isArray(n),a=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),r&&(n=i?r:r+"["+(a||"object"==o||"array"==o?n:"")+"]"),!r&&s?e.add(u.name,u.value):"array"==o||!i&&"object"==o?C(e,u,i,n):e.add(n,u)})}var i,r,e=0,n=window.document,o=/)<[^<]*)*<\/script>/gi,s=/^(?:text|application)\/javascript/i,a=/^(?:text|application)\/xml/i,u="application/json",f="text/html",c=/^\s*$/,l=n.createElement("a");l.href=window.location.href,t.active=0,t.ajaxJSONP=function(i,r){if(!("type"in i))return t.ajax(i);var f,h,o=i.jsonpCallback,s=(t.isFunction(o)?o():o)||"jsonp"+ ++e,a=n.createElement("script"),u=window[s],c=function(e){t(a).triggerHandler("error",e||"abort")},l={abort:c};return r&&r.promise(l),t(a).on("load error",function(e,n){clearTimeout(h),t(a).off().remove(),"error"!=e.type&&f?v(f[0],l,i,r):y(null,n||"error",l,i,r),window[s]=u,f&&t.isFunction(u)&&u(f[0]),u=f=void 0}),g(l,i)===!1?(c("abort"),l):(window[s]=function(){f=arguments},a.src=i.url.replace(/\?(.+)=\?/,"?$1="+s),n.head.appendChild(a),i.timeout>0&&(h=setTimeout(function(){c("timeout")},i.timeout)),l)},t.ajaxSettings={type:"GET",beforeSend:b,success:b,error:b,complete:b,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:u,xml:"application/xml, text/xml",html:f,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0},t.ajax=function(e){var a,o=t.extend({},e||{}),s=t.Deferred&&t.Deferred();for(i in t.ajaxSettings)void 0===o[i]&&(o[i]=t.ajaxSettings[i]);d(o),o.crossDomain||(a=n.createElement("a"),a.href=o.url,a.href=a.href,o.crossDomain=l.protocol+"//"+l.host!=a.protocol+"//"+a.host),o.url||(o.url=window.location.toString()),j(o);var u=o.dataType,f=/\?.+=\?/.test(o.url);if(f&&(u="jsonp"),o.cache!==!1&&(e&&e.cache===!0||"script"!=u&&"jsonp"!=u)||(o.url=E(o.url,"_="+Date.now())),"jsonp"==u)return f||(o.url=E(o.url,o.jsonp?o.jsonp+"=?":o.jsonp===!1?"":"callback=?")),t.ajaxJSONP(o,s);var C,h=o.accepts[u],p={},m=function(t,e){p[t.toLowerCase()]=[t,e]},x=/^([\w-]+:)\/\//.test(o.url)?RegExp.$1:window.location.protocol,S=o.xhr(),T=S.setRequestHeader;if(s&&s.promise(S),o.crossDomain||m("X-Requested-With","XMLHttpRequest"),m("Accept",h||"*/*"),(h=o.mimeType||h)&&(h.indexOf(",")>-1&&(h=h.split(",",2)[0]),S.overrideMimeType&&S.overrideMimeType(h)),(o.contentType||o.contentType!==!1&&o.data&&"GET"!=o.type.toUpperCase())&&m("Content-Type",o.contentType||"application/x-www-form-urlencoded"),o.headers)for(r in o.headers)m(r,o.headers[r]);if(S.setRequestHeader=m,S.onreadystatechange=function(){if(4==S.readyState){S.onreadystatechange=b,clearTimeout(C);var e,n=!1;if(S.status>=200&&S.status<300||304==S.status||0==S.status&&"file:"==x){u=u||w(o.mimeType||S.getResponseHeader("content-type")),e=S.responseText;try{"script"==u?(1,eval)(e):"xml"==u?e=S.responseXML:"json"==u&&(e=c.test(e)?null:t.parseJSON(e))}catch(i){n=i}n?y(n,"parsererror",S,o,s):v(e,S,o,s)}else y(S.statusText||null,S.status?"error":"abort",S,o,s)}},g(S,o)===!1)return S.abort(),y(null,"abort",S,o,s),S;if(o.xhrFields)for(r in o.xhrFields)S[r]=o.xhrFields[r];var N="async"in o?o.async:!0;S.open(o.type,o.url,N,o.username,o.password);for(r in p)T.apply(S,p[r]);return o.timeout>0&&(C=setTimeout(function(){S.onreadystatechange=b,S.abort(),y(null,"timeout",S,o,s)},o.timeout)),S.send(o.data?o.data:null),S},t.get=function(){return t.ajax(S.apply(null,arguments))},t.post=function(){var e=S.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=S.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,i){if(!this.length)return this;var a,r=this,s=e.split(/\s/),u=S(e,n,i),f=u.success;return s.length>1&&(u.url=s[0],a=s[1]),u.success=function(e){r.html(a?t("
").html(e.replace(o,"")).find(a):e),f&&f.apply(r,arguments)},t.ajax(u),this};var T=encodeURIComponent;t.param=function(e,n){var i=[];return i.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(T(e)+"="+T(n))},C(i,e,n),i.join("&").replace(/%20/g,"+")}}(Zepto),function(t){t.fn.serializeArray=function(){var e,n,i=[],r=function(t){return t.forEach?t.forEach(r):void i.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(i,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&r(t(o).val())}),i},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(Zepto),function(t){"__proto__"in{}||t.extend(t.zepto,{Z:function(e,n){return e=e||[],t.extend(e,t.fn),e.selector=n||"",e.__Z=!0,e},isZ:function(e){return"array"===t.type(e)&&"__Z"in e}});try{getComputedStyle(void 0)}catch(e){var n=getComputedStyle;window.getComputedStyle=function(t){try{return n(t)}catch(e){return null}}}}(Zepto); -------------------------------------------------------------------------------- /heuristic/ACO/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aco", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "aco.js", 6 | "scripts": { 7 | "start": "webpack-dev-server --inline --hot --quiet", 8 | "dev": "webpack-dev-server --inline --hot --quiet --host 192.168.31.110", 9 | "build": "webpack -p", 10 | "test": "mocha" 11 | }, 12 | "author": "BreezeDust", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "css-loader": "^0.23.1", 16 | "html-loader": "^0.4.3", 17 | "style-loader": "^0.13.0", 18 | "vue-loader": "^8.2.0", 19 | "webpack": "^1.12.14", 20 | "webpack-dev-server": "^1.14.1", 21 | "mocha": "^2.4.5" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /heuristic/ACO/webpack.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | entry: "./aco.js", 3 | output: { 4 | path: "./build", 5 | publicPath: "/build/", 6 | filename: "build.js" 7 | }, 8 | module: { 9 | loaders: [ 10 | { test: /\.css$/, loader: "style!css" }, 11 | { test: /\.html$/, loader: "html" }, 12 | { test: /\.vue$/, loader: "vue" } 13 | ] 14 | }, 15 | devtool: 'source-map' 16 | }; --------------------------------------------------------------------------------