利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示
HTML5提供了Canvas对象,为画图应用提供了便利.
Javascript可执行于浏览器中, 而不须要安装特定的编译器;
基于HTML5和Javascript语言, 可随时编写应用, 为算法測试带来便利.
针对TSP问题, 编写了Ant colony algorithm, 用于演示该算法, tsp_ant_colony_algorithm.html代码例如以下:
- <html>
- <head>
- <meta charset = "utf-8" / >
- <title>TSP_demo</title>
- </head>
- <body>
- <div id="outText">
- </div>
- <canvas id="canvas" height="550px" width="1024px">
- </canvas>
- <script type="text/javascript">
- //计时開始
- t1 = new Date(); //创建"then"这个日期/时间对像
- t1.setTime(t1.getTime()); //为这个对象赋值
- var canvas = document.getElementById("canvas");
- var canvasWidth = canvas.width;
- var canvasHeight = canvas.height;
- var context = canvas.getContext("2d");
- var N = 30; //城市数量
- var M = 120; //蚂蚁数量
- var inittao = 1; //初始路径激素量
- var tao; //[N][N]; //N*N矩阵——表示i和j间残留的激素信息量, 初始化为常熟C(各路径相等),以表示激素的挥发
- var yita; //[N][N]; //N*N矩阵——表示i和j间由举例所决定的选择概率矩阵
- var delta_tao; //[N][N]; //一轮循环后添加的信息素
- var distant; //[N][N]; //全部城市间的距离
- var tabu; //[M][N]; //禁忌表
- var route; //[M][N]; //M仅仅蚂蚁所走过的路径
- var solution; //[M]; //对M仅仅蚂蚁所走过路径的适应度评价值
- var BestRoute; //[N]; //最忌路径
- var BestSolution = 10000000000; //设置的极限最大路径
- var alfa, beta, rou, Q; //路径激素更新数量
- var NcMax; //蚁群最大迭代次数
- function initMat(M, N, val) {
- var x = new Array();
- for(var i = 0; i < M; i++) {
- x[i] = new Array();
- for(var j = 0; j < N; j++)
- x[i].push(val);
- }
- return x;
- }
- function initAllMats() {
- tao = initMat(N, N, 0);
- yita = initMat(N, N, 0);
- delta_tao = initMat(N, N, 0);
- distant = initMat(N, N, 0);
- tabu = initMat(M, N, 0);
- route = initMat(M, N, -1);
- solution = new Array();
- for(var i = 0; i < M; i++)
- solution[i] = 0;
- BestRoute = new Array();
- for(var i = 0; i < N; i++)
- BestRoute[i] = -1;
- }
- //初始化城市的位置
- function InCityXY(x, y)
- {
- for(var i = 0; i < N; i++) {
- x[i] = (Math.random() * 32767) % 980 + 20;
- y[i] = (Math.random() * 32767) % 420 + 20;
- }
- }
- //初始化算法參数
- function initparameter()
- {
- alfa = 1; //积累的激素调节因子作用系数
- beta = 5; //启示性调节因子作用系数
- rou = 0.9;
- Q = 100; //常量
- NcMax = 200; //群蚂蚁进化代数
- }
- //取得某个路径的长度
- function EvalueSolution(a)
- {
- var dist = 0;
- for(var i = 0; i < N-1; i++)
- dist += distant[a[i]][a[i+1]];
- dist += distant[a[N-1]][a[0]];
- return dist;
- }
- function drawCities(x, y) {
- for(var i = 0; i < N; i++) {
- context.beginPath();
- context.fillStyle = "blue";
- context.strokeStyle = "blue";
- context.lineWidth = 1;
- context.font = "normal 16px Arial";
- context.arc(x[i], y[i], 3, (Math.PI / 180) * 0, (Math.PI / 180) * 360, false);
- context.fill();
- context.stroke();
- context.closePath();
- /*
- context.fillStyle = "white";
- context.textAlign = "center";
- context.textBaseline = "middle";
- context.fillText(String(i), x[i], y[i]);
- */
- }
- }
- function drawPath(x1, y1, x2, y2, color, width) {
- context.beginPath();
- context.fillStyle = color;
- context.strokeStyle = color;
- context.lineWidth = width;
- context.moveTo(x1, y1);
- context.lineTo(x2, y2);
- context.stroke();
- }
- //主函数
- function ACA_TSP() {
- var NC = 0;
- //初始化算法參数
- initparameter();
- //初始化城市的位置
- var x = new Array();
- var y = new Array();
- for(var i = 0; i < N; i++) {
- x.push(0);
- y.push(0);
- }
- //初始化城市位置
- InCityXY( x, y );
- //计算随意两城市间的距离
- for(var i=0;i<N;i++)
- for(var j=i+1;j<N;j++)
- {
- distant[j][i] = Math.sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
- distant[i][j] = distant[j][i];
- }
- // calculate the heuristic parameters
- var i, j, k;
- //初始化随意两点间的选择可能性程度=1-p
- //若i==j。则p=1
- //否则。p=100/distant[i][j]
- for(i=0;i<N;i++)
- for(j=0;j<N;j++)
- {
- tao[i][j] = inittao;
- if(j != i)
- yita[i][j] = 100/distant[i][j]; //值越大,i到j被选择的路径概率越大; 或者说,i和j距离越近,被选择的概率越大
- }
- //初始化M个蚂蚁走全然部城市(N)的路径
- //-1表示第k仅仅蚂蚁尚没有从当前位置走向i城市
- /*
- for(k=0;k<M;k++)
- for(i=0;i<N;i++)
- route[k][i] =- 1;
- */
- //初始化全部蚂蚁的禁忌表
- for(k=0;k<M;k++)
- {
- route[k][0] = k % N; //随机置放蚂蚁的第一站城市点---此代码实际上没有随机摆放
- tabu[k][route[k][0]] = 1; //设置禁忌表的已訪问过的城市为1
- }
- //全部蚂蚁行走NcMax趟
- do {
- var s = 1;
- var partsum;
- var pper;
- var drand;
- //s循环N次,让每仅仅蚂蚁走N步,走全然程
- while( s < N)
- {
- for(k=0;k<M;k++)
- {
- var jrand= (Math.random() * 32767) % 3000;
- drand= jrand / 3001.0;
- partsum = 0;
- pper = 0;
- for(j=0;j<N;j++)
- {
- if(tabu[k][j]==0)
- partsum += Math.pow(tao[route[k][s-1]][j],alfa) * Math.pow(yita[route[k][s-1]][j],beta);
- }
- for(j=0;j<N;j++)
- {
- if(tabu[k][j]==0)
- pper += Math.pow(tao[route[k][s-1]][j],alfa) * Math.pow(yita[route[k][s-1]][j],beta)/partsum;
- if(pper > drand)
- break;
- }
- tabu[k][j]=1;
- route[k][s]=j;
- }
- s++;
- }
- // the pheromone is updated
- for(i=0;i<N;i++)
- for(var j=0;j<N;j++)
- delta_tao[i][j]=0;
- //记录最短路径及其长度
- for(k=0;k<M;k++)
- {
- solution[k] = EvalueSolution(route[k]);
- if(solution[k] < BestSolution)
- {
- BestSolution = solution[k];
- for(s=0; s<N; s++)
- BestRoute[s]=route[k][s];
- }
- }
- //依据上一批次(M个蚂蚁)所求路径的长度信息,更新从i到j的选择概率
- for(k=0;k<M;k++)
- {
- for(s=0;s<N-1;s++)
- delta_tao[route[k][s]][route[k][s+1]] += Q/solution[k];
- delta_tao[route[k][N-1]][route[k][0]] += Q/solution[k];
- }
- //计算NxN个节点间的转移概率。并设置最大与最小值
- for(i=0;i<N;i++)
- for(var j=0;j<N;j++)
- {
- tao[i][j]=rou*tao[i][j]+delta_tao[i][j];
- if(tao[i][j] < 0.00001)
- tao[i][j] = 0.00001;
- if(tao[i][j] > 20)
- tao[i][j] = 20;
- }
- //又一次设置全部蚂蚁的禁忌表和路径信息
- for(k=0;k<M;k++)
- for(var j=1;j<N;j++)
- {
- tabu[k][route[k][j]]=0;
- route[k][j]=-1;
- }
- NC++;
- } while(NC < NcMax);
- //output the calculating outs
- /*
- print("*针对旅行商问题的蚂蚁克隆算法*");
- print("初始參数:");
- print("alfa=" + alfa + ", beta=" + beta + ", rou=" + rou + ", Q=" + Q);
- print("蚁群探索循环次数:" + NcMax);
- print("最短路径是:" + BestSolution);
- print("最佳路径是:");
- */
- for(i = 0; i < N; i++) {
- if (i == N - 1)
- j = 0;
- else
- j = i + 1;
- var nodeA = BestRoute[i];
- var nodeB = BestRoute[j];
- var x1 = x[nodeA];
- var y1 = y[nodeA];
- var x2 = x[nodeB];
- var y2 = y[nodeB];
- drawPath(x1, y1, x2, y2, "black", 2);
- }
- drawCities(x, y);
- var out = document.getElementById("outText");
- out.innerHTML = "<h1>蚂蚁克隆算法求解旅行商问题: </h1>最佳路径:<br/>";
- for(i=0;i<N;i++)
- out.innerHTML = out.innerHTML + String(BestRoute[i]) + " ";
- out.innerHTML = out.innerHTML + "<br/>最短路径长度:<br/>" + BestSolution;
- }
- //调用上述函数
- initAllMats();
- ACA_TSP();
- //结束后,取得如今时间, 并计算时间差
- t2 = new Date(); //创建"then"这个日期/时间对像
- var ms = t2.getTime() - t1.getTime();
- var out = document.getElementById("outText");
- out.innerHTML = out.innerHTML + "<br/>用时(毫秒):<br/>" + ms;
- </script>
- </body>
- </html>
刷新该页面, 可随机产生不同的城市点, 并计算最短路径.
实例效果例如以下:
须要说明的是, 算法仍需改善, 在有些其情况下,无法保障总能获得最短路径.
利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示的更多相关文章
- 蚁群算法求解TSP问题
一.蚁群算法简介 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知 ...
- ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现
本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 1 蚁群 ...
- 蚁群算法解决TSP问题
代码实现 运行结果及参数展示 alpha=1beta=5 rho=0.1 alpha=1beta=1rho=0.1 alpha=0.5beta=1rho=0.1 概念蚁群算法(AG)是一种模拟蚂蚁觅 ...
- 蚁群算法求解旅行商问题(附c和matlab源代码)
前几天写了个模拟退火算法的程序,然后又陆陆续续看了很多群智能算法,发现很多旅行商问题都采用蚁群算法来求解,于是开始写蚁群算法的模板.网上关于蚁群算法的理论很多就不再这里赘述了,下面直接上代码和进行简单 ...
- [matlab] 8.蚁群算法解决TSP问题
城市坐标数据下载 密码:07d5 求遍历这52座城市后最后回到最初城市的最短距离 %% 第9章 蚁群算法及MATLAB实现——TSP问题 % 程序9-1 %% 数据准备 % 清空环境变量 clear ...
- 蚁群算法(Java)tsp问题
1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...
- 蚁群算法MATLAB解VRP问题
Excel exp12_3_2.xls内容: ANT_VRP函数: function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT ...
- Bring Your Charts to Life with HTML5 Canvas and JavaScript
Bring Your Charts to Life with HTML5 Canvas and JavaScript Bring Your Charts to Life with HTML5 Canv ...
- 蚁群算法简介(part 1:蚁群算法之绪论)
群算法是Marco Dorigo在1992年提出的一种优化算法,该算法受到蚂蚁搜索食物时对路径的选择策略的启示.蚁群算法作为群体智能算法的一种利用分布式的种群搜索策略来寻找目标函数的最优解.蚁群算法与 ...
随机推荐
- (3)webApi postman使用
https://www.getpostman.com/
- NYOJ 914 Yougth的最大化【二分/最大化平均值模板/01分数规划】
914-Yougth的最大化 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:4 难度:4 题目描述: Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从 ...
- UVA Rails(stl-stack)
具体思路是从B方向的序列 倒推 栈C 的入栈出栈顺序, 以B方向的5,4,3,2,1为例子:从一个数字5开始,要想从栈C拿到5号车厢,5号车厢得入栈C,且5号车厢处于栈顶位置,为了保证5号车 厢在 ...
- Linux命令之file
file [选项] [文件名] 确认文件类型 (1).常用选项 magic file指的是哪些具有特殊文件格式的文件 -b,--brief 不列出文件名称 -c,--checking-printout ...
- [BZOJ 1150] 数据备份
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1150 Solution: 思路和洛谷P1484完全相同 只不过将求最大不相邻的点权改为最 ...
- Exercise02_09
import javax.swing.JOptionPane; public class Acceleration { public static void main(String[] args){ ...
- NDK之打印调试信息Log
第一步:gradle配置ndk ndk { moduleName "Iso8583Lib" ldLibs "log", "z", " ...
- JAVA 基本概念和编码规范
概括性描述:一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 基本概念: 下面简要介绍下类.对象.方法和属性的概念. 对象:对象是类的一个实例,有状态和行为.例如, ...
- 正版greenvpn
短网址 http://jsq.re(建议收藏,长期有效)长网址 https://www.greenjsq.me/网址更新页面 http://www.greenvpn.site
- net core 踩坑
1.压缩静态文件,要nuget BuildBundlerMinifier 2.DI 自动注入 添加了两个类,才能完成 3.所有静态文件必须放在wwwroot下,不然访问不到 4.ajax 提交Typ ...