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问题演示的更多相关文章

  1. 蚁群算法求解TSP问题

    一.蚁群算法简介 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知 ...

  2. ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现

    本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 1 蚁群 ...

  3. 蚁群算法解决TSP问题

    代码实现 运行结果及参数展示 alpha=1beta=5 rho=0.1  alpha=1beta=1rho=0.1 alpha=0.5beta=1rho=0.1 概念蚁群算法(AG)是一种模拟蚂蚁觅 ...

  4. 蚁群算法求解旅行商问题(附c和matlab源代码)

    前几天写了个模拟退火算法的程序,然后又陆陆续续看了很多群智能算法,发现很多旅行商问题都采用蚁群算法来求解,于是开始写蚁群算法的模板.网上关于蚁群算法的理论很多就不再这里赘述了,下面直接上代码和进行简单 ...

  5. [matlab] 8.蚁群算法解决TSP问题

    城市坐标数据下载  密码:07d5 求遍历这52座城市后最后回到最初城市的最短距离 %% 第9章 蚁群算法及MATLAB实现——TSP问题 % 程序9-1 %% 数据准备 % 清空环境变量 clear ...

  6. 蚁群算法(Java)tsp问题

      1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...

  7. 蚁群算法MATLAB解VRP问题

    Excel  exp12_3_2.xls内容: ANT_VRP函数: function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT ...

  8. 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 ...

  9. 蚁群算法简介(part 1:蚁群算法之绪论)

    群算法是Marco Dorigo在1992年提出的一种优化算法,该算法受到蚂蚁搜索食物时对路径的选择策略的启示.蚁群算法作为群体智能算法的一种利用分布式的种群搜索策略来寻找目标函数的最优解.蚁群算法与 ...

随机推荐

  1. 洛谷 P1824 进击的奶牛【二分答案/类似青蛙过河】

    题目描述 Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000 ...

  2. POJ 1321 棋盘问题【DFS/回溯/放与不放/类似n皇后】

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62164 Accepted: 29754 Description 在一 ...

  3. AMQ学习笔记 - 02. JMS客户端编程模型

    概述 客户端编程模型,是讲如何使用JMS API实现Java应用程序和JMS Provider的通信. 消息传送模式 消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub ...

  4. 潜伏者(noip09年t1)解题报告 C++

    题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...

  5. 19、Django实战第19天:课程列表页

    从今天开始,我们将完成"公开课"课程的相关功能..... 1.把course-list.html复制到templates目录下 2.这个页面的头部.底部与之前定义的base.htm ...

  6. Html5+CSS

    1. 内联样式是为元素添加样式的最简单有效的方式,但是更易于维护的方式是使用层叠样式表CSS(Cascading Style Sheets). <style>  选择器 {属性名称: 属性 ...

  7. 【后缀数组】bzoj2217 Secretary

    考虑简化问题:计算一个字符串中至少出现两次的最长子串.答案一定会在sa中相邻两个后缀的lcp中.因为后缀的位置在sa中相距越远,其lcp的长度就越短,这是由于字典序的性质决定的. 于是,在s1和s2中 ...

  8. INLINE-BLOCK和FLOAT(二)(转)

    一.一抹前言 没有爱的日子,时间如指尖细沙,不知不觉就流逝了.写“CSS float浮动的深入研究.详解及拓展(一)”和“CSS float浮动的深入研究.详解及拓展(二)”似乎就在不久前,然而相隔差 ...

  9. python语言实现阶乘的两种方法---递归和迭代

    阶乘的递归实现,代码如下: def factorial(n): if n==1: return 1 else: return n*factorial(n-1) number = int(input(& ...

  10. c# 播放mp3

    转载:http://www.cnblogs.com/igrl/archive/2010/03/29/1699975.html /// <summary> /// 播放MP3文件 /// & ...