使用 JavaScript 编写优化算法 (1)
之前一直用Python来写优化算法,为了增强 JS 的熟练程度,开始将原有的代码改写成 JS。采用的工具包括 node.js + Grunt + nodeunit + github + npm + travis-ci。
最初的版本采用过程式的方式实现,没有采用面向对象或事件驱动的模式。
#!/usr/bin/env node --harmony
// Random Search
"use strict";
var util = require("util");
function objective_function(v) {
return v.map(function(x) {
return x*x;
}).reduce(function(a, b) {
return a+b;
});
}
function random_vector(min_max) {
return min_max.map(function(x) {
return x[0] + (x[1] - x[0]) * Math.random();
});
}
function search(search_space, max_iteration) {
var best = {};
for (var iteration = 0; iteration < max_iteration; iteration++) {
var candidate = {
'vector': random_vector(search_space)
};
candidate['cost'] = objective_function(candidate['vector']);
//console.log(candidate);
if (iteration === 0 || candidate['cost'] < best['cost']) {
best = candidate;
}
console.log(' > iteration=' + (iteration+1) + ', best=' + best['cost']);
}
return best;
}
function generate_array(element, repeat) {
return new Array(repeat+1).join(1).split('').map(function(){return element;});
}
function run () {
var problem_size = 2;
var search_space = generate_array([-5, 5], problem_size);
var max_iteration = 100;
var best = search(search_space, max_iteration);
console.log("Done. Best Solution: " + util.inspect(best));
}
exports.objective_function = objective_function;
exports.random_vector = random_vector;
exports.generate_array = generate_array;
exports.search = search;
exports.run = run;
调用方式很简单。
var rs = require('clever_algorithms_js').random_search;
rs.run();
单元测试:
var random_search = require('../../lib/stochastic/random_search');
exports['objective'] = function (test) {
test.equal(random_search.objective_function([1, 2]), 5);
test.done();
};
exports['random_vector'] = function (test) {
var rv = random_search.random_vector([[1, 2], [2, 3]]);
test.equal(rv.length, 2);
test.ok(1 <= rv[0] && rv[0] <= 2);
test.ok(2 <= rv[1] && rv[1] <= 3);
test.done();
};
exports['generate_array'] = function (test) {
var a = random_search.generate_array([-5, 5], 2);
test.equal(a.length, 2);
test.deepEqual(a, [[-5,5], [-5,5]]);
test.done();
};
exports['search'] = function (test) {
var problem_size = 2,
search_space = random_search.generate_array([-5, 5], problem_size),
max_iter = 100;
var best = random_search.search(search_space, max_iter);
test.notEqual(best, {});
test.ok(-5 <= best['cost'] && best['cost'] <= 5);
test.done();
};
如果采用CoffeeScript进行改写的话,代码会更简洁一些:
# Random Search
util = require("util");
objective_function = (v) ->
v.reduce (x,y) -> x*x + y*y
random_vector = (min_max) ->
min_max.map (rx) -> rx[0] + (rx[1] - rx[0]) * Math.random()
generate_array = (element, repeat) ->
(element for [1..repeat])
search = (search_space, max_iteration) ->
best = {}
for iteration in [0..max_iteration-1]
candidate = {
'vector': random_vector(search_space)
}
candidate['cost'] = objective_function(candidate['vector'])
best = candidate if iteration == 0 || candidate['cost'] < best['cost']
console.log ' > iteration=' + (iteration+1) + ' best=' + best['cost'];
best
run = () ->
problem_size = 2
search_space = generate_array([-5, 5], problem_size)
max_iteration = 100
best = search(search_space, max_iteration)
console.log "Done. Best Solution: " + util.inspect(best);
return
exports.objective_function = objective_function;
exports.random_vector = random_vector;
exports.generate_array = generate_array;
exports.search = search;
exports.run = run;
编译出的JavaScript代码,看起来是这个样子:
(function() {
var generate_array, objective_function, random_vector, run, search, util;
util = require("util");
objective_function = function(v) {
return v.reduce(function(x, y) {
return x * x + y * y;
});
};
random_vector = function(min_max) {
return min_max.map(function(rx) {
return rx[0] + (rx[1] - rx[0]) * Math.random();
});
};
generate_array = function(element, repeat) {
var _i, _results;
_results = [];
for (_i = 1; 1 <= repeat ? _i <= repeat : _i >= repeat; 1 <= repeat ? _i++ : _i--) {
_results.push(element);
}
return _results;
};
search = function(search_space, max_iteration) {
var best, candidate, iteration, _i, _ref;
best = {};
for (iteration = _i = 0, _ref = max_iteration - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; iteration = 0 <= _ref ? ++_i : --_i) {
candidate = {
'vector': random_vector(search_space)
};
candidate['cost'] = objective_function(candidate['vector']);
if (iteration === 0 || candidate['cost'] < best['cost']) {
best = candidate;
}
console.log(' > iteration=' + (iteration + 1) + ' best=' + best['cost']);
}
return best;
};
run = function() {
var best, max_iteration, problem_size, search_space;
problem_size = 2;
search_space = generate_array([-5, 5], problem_size);
max_iteration = 100;
best = search(search_space, max_iteration);
console.log("Done. Best Solution: " + util.inspect(best));
};
exports.objective_function = objective_function;
exports.random_vector = random_vector;
exports.generate_array = generate_array;
exports.search = search;
exports.run = run;
}).call(this);
[1] https://www.npmjs.org/package/clever_algorithms_js
[2] https://github.com/fox000002/clever_algorithms_js
使用 JavaScript 编写优化算法 (1)的更多相关文章
- 使用Golang编写优化算法 (1)
动手写点东西是学习新知识很重要的一个阶段.之前用 Python 和 JavaScript 实现优化算法,现在用 Golang 来实现.语法上略有不爽,某些C语言的思维又回来了. - Golang 用 ...
- JavaScript是如何工作的02:深入V8引擎&编写优化代码的5个技巧
概述 JavaScript引擎是执行 JavaScript 代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器. 以为实现J ...
- JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍
概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下 ...
- JavaScript内存优化
JavaScript内存优化 相对C/C++ 而言,我们所用的JavaScript 在内存这一方面的处理已经让我们在开发中更注重业务逻辑的编写.但是随着业务的不断复杂化,单页面应用.移动HTML5 应 ...
- 前端开发周报: CSS 布局方式方式与JavaScript数据结构和算法
前端开发周报:CSS 布局方式与JavaScript动画库 1.常见 CSS 布局方式详见: 一些常见的 CSS 布局方式梳理,涉及 Flex 布局.Grid 布局.圣杯布局.双飞翼布局等.http: ...
- JavaScript性能优化篇js优化
JavaScript性能优化篇js优化 随着Ajax越来越普遍,Ajax引用的规模越来越大,Javascript代码的性能越来越显得重要,我想这就是一个很典型的例子,上面那段代码因为会被频繁使用, ...
- javascript数据结构与算法---列表
javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...
- 摘:JavaScript性能优化小知识总结
原文地址:http://www.codeceo.com/article/javascript-performance-tips.html JavaScript的性能问题不容小觑,这就需要我们开发人员在 ...
- artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口
artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口 自适应内容 artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适应 ...
随机推荐
- echarts实现折线图
前端框架使用的angular,折线图使用echarts实现. 这里实现的折线图只是简单是折线图,折线图显示在table中,不需要xy轴的数据说明. 1. item.component.html < ...
- 纯CSS3实现打火机火焰动画
HTML5已经越来越流行起来了,尤其是移动互联网的发展,更是带动了HTML5的迅猛发展,我们也是时候学习HTML5了,以防到时候落伍.今天给大家介绍10款效果惊艳的HTML5应用,方便大家学习,也将应 ...
- 沉迷AC自动机无法自拔之:[UVA 11468] Substring
图片加载可能有点慢,请跳过题面先看题解,谢谢 这个鬼题目,上一波套路好了 先用题目给的模板串建\(AC\)自动机,把单词结尾标记为 \(val=1\),然后在建好的\(AC\)自动机上跑 \(dp\) ...
- java绘图合并图像AlphaComposite模式测试
package com.hdwang.test; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.sw ...
- JAVA实现组合、排列、重复排列(多层循环)
1.代码 package com.hdwang; import java.util.ArrayList; import java.util.Arrays; import java.util.List; ...
- Mysql(三)约束
一.视图 视图是虚拟的数据表,本身不存储数据,而是提供数据的逻辑 展示. 1.创建视图 create view stu_view as select s1.id, s1.name, s2. ...
- 【POJ2631】Roads in the North 树的直径
题目大意:给定一棵 N 个节点的边权无根树,求树的直径. 代码如下 #include <cstdio> #include <algorithm> using namespace ...
- Django中简单添加HTML、css、js等文件(非正规添加,适合小白)
Django中简单添加HTML.css.js等文件 首先申明下自己的环境, python版本3.65(亲测3.7版本有毒,没解决掉!) Django版本1.11.15(版本比较成熟,也可以用最新的版本 ...
- 迭代器Iterator与ConcurrentModificationException详解
背景:一直以来对迭代器的问题理解不是很透彻,特别是迭代器和异常ConcurrentModificationException之间的联系.通过debug,详细了解其底层的具体实现过程. 简介 Itera ...
- 用rem来做响应式开发(转)
由于最近在做公司移动项目的重构,因为要实现响应式的开发,所以大量使用到了rem的单位,觉得这个单位有点意思.但是现在貌似用他的人很少.上一篇文章我分享了淘宝写的一篇rem的介绍,介绍的非常全面,但是他 ...