动手写点东西是学习新知识很重要的一个阶段。之前用 Python 和 JavaScript 实现优化算法,现在用 Golang 来实现。语法上略有不爽,某些C语言的思维又回来了。

- Golang 用 package 来组织代码,同一 package 下不同文件之间的标识符是共享的,不能包含两个相同名称的函数。而且只有 package main 能够包含 main 函数。所以将公用的函数提取出来,放在package common。同时,每种例子程序移动到 examples 目录下。

- 在 CleverAlgorithms 中都是随机优化算法,最常用的是随机数或向量的生成函数。因为默认采用Fixed Seed,所以需要自行设置成运行时刻的纳秒值作为种子。

- 在缺乏灵活的dict类型之后,需要定义struct组合类型来满足数组单元中存储不同类型值的需求。

package common

import (
"math/rand"
"time"
) // InitSeed set random seed with current time value
func InitSeed() {
rand.Seed(time.Now().UnixNano())
} // RandomVector generates a random vector from min_max bound.
// It returns the generated random vector.
func RandomVector(min_max [][2]float64) []float64 {
var v = make([]float64, len(min_max))
for i, mm := range min_max {
v[i] = mm[0] + (mm[1]-mm[0])*rand.Float64()
}
return v
} // RandomBound generates a random value from the bound.
// It returns the random value.
func RandomBound(bound [2]float64) float64 {
return bound[0] + (bound[1]-bound[0])*rand.Float64()
} // FRange simulates range in python for float64.
// It yields values in the range.
func FRange(start float64, stop float64, step float64) (c chan float64) {
c = make(chan float64)
go func() {
for x := start; x<stop; x += step {
c <- x
}
close(c)
}() return
} // Entity stores cost and vector.
type Entity struct {
Cost float64
Vector []float64
}

然后,随机搜索的代码变成:

//
// Random Search
// package stochastic import (
"clever_algorithms/common"
"fmt"
) func objective_function(v []float64) float64 {
return common.SphereFunction(v)
} func RandomSearch(search_space [][2]float64, max_iteration int) common.Entity {
var best common.Entity common.InitSeed() for i := 0; i < max_iteration; i++ {
candidate := common.Entity{
0.0,
common.RandomVector(search_space),
}
candidate.Cost = objective_function(candidate.Vector)
if best.Vector == nil || best.Cost > candidate.Cost {
best = candidate
}
fmt.Println("Iteration ", i+1, ", best=", best.Cost)
} return best
}

添加简单的单元测试:

package stochastic

import (
"fmt"
"testing"
) func TestObjectiveFunction(t *testing.T) {
if 5 != objective_function([]float64{1, 2}) {
t.Error("Objetive function failed")
}
} func TestSearch(t *testing.T) {
//
var problem_size = 2
var search_space = make([][2]float64, problem_size)
for i, _ := range search_space {
search_space[i] = [2]float64{-5, 5}
}
//
const max_iteration = 100
//
var best = RandomSearch(search_space, max_iteration)
if best.Vector == nil {
t.Error("Search result should not be nil.")
}
fmt.Println("Done. Best Solution: c=", best.Cost, ", v= [")
for i, v := range best.Vector {
fmt.Print(" ", v)
if v < search_space[i][0] || v > search_space[i][1] {
t.Error("vector values should be in the search space.")
}
}
fmt.Println("]") }

[1]https://coding.net/u/huys03/p/clever_algorithms_go/git

使用Golang编写优化算法 (1)的更多相关文章

  1. 使用 JavaScript 编写优化算法 (1)

    之前一直用Python来写优化算法,为了增强 JS 的熟练程度,开始将原有的代码改写成 JS.采用的工具包括 node.js + Grunt + nodeunit + github + npm + t ...

  2. fastjson的deserializer的主要优化算法

    JSON最佳实践 | kimmking's blog http://kimmking.github.io/2017/06/06/json-best-practice/ Fastjson内幕 Java综 ...

  3. JavaScript是如何工作的02:深入V8引擎&编写优化代码的5个技巧

    概述 JavaScript引擎是执行 JavaScript 代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器. 以为实现J ...

  4. Golang 性能优化实战

    小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...

  5. fastjson的deserializer的主要优化算法 漏洞

    JSON最佳实践 | kimmking's blog http://kimmking.github.io/2017/06/06/json-best-practice/ Fastjson内幕 Java综 ...

  6. 数值最优化:一阶和二阶优化算法(Pytorch实现)

    1 最优化概论 (1) 最优化的目标 最优化问题指的是找出实数函数的极大值或极小值,该函数称为目标函数.由于定位\(f(x)\)的极大值与找出\(-f(x)\)的极小值等价,在推导计算方式时仅考虑最小 ...

  7. [Algorithm] 群体智能优化算法之粒子群优化算法

    同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...

  8. 基于网格的分割线优化算法(Level Set)

    本文介绍一种网格分割线的优化算法,该方法能够找到网格上更精确.更光滑的分割位置,并且分割线能够自由地合并和分裂,下面介绍算法的具体原理和过程. 曲面上的曲线可以由水平集(level set)形式表示, ...

  9. paper 8:支持向量机系列五:Numerical Optimization —— 简要介绍求解求解 SVM 的数值优化算法。

    作为支持向量机系列的基本篇的最后一篇文章,我在这里打算简单地介绍一下用于优化 dual 问题的 Sequential Minimal Optimization (SMO) 方法.确确实实只是简单介绍一 ...

随机推荐

  1. poj2135 Farm Tour(费用流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  2. pgm1

    很遗憾前面只看过 Michael Jordan 写的一部分,这次打算把 Daphne Koller 和 Nir Friedman 合著的 Probabilistic Graphical Models: ...

  3. python_面向对象魔法方法指南

    原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://gi ...

  4. CJB的大作

    Description 给你一个长度不超过100的字符串.一共进行\(N\)次操作,第\(i\)次操作是将当前字符串复制一份接到后面,并将新的一份循环移位\(k_i\)(\(1 \le k_i \le ...

  5. thinkphp自学笔记

    什么是MVC? M:编写模型类-对数据进行操作 用作数据处理 V:编写HTML文件-将页面显示出来 网页视图 C:编写类文件 用作逻辑处理 ThinkPHP的MVC的特点是什么: 它比较灵活并不依赖 ...

  6. Dubbo学习笔记9:Dubbo服务提供方启动流程源码分析

    首先我们通过一个时序图,直观看下Dubbo服务提供方启动的流程: 在<Dubbo整体框架分析>一文中我们提到,服务提供方需要使用ServiceConfig API发布服务,具体是调用代码( ...

  7. 《Linux命令行与shell脚本编程大全》 第五章理解shell

    5.1 1. cat /etc/passwd 可以查看每个用户自己的默认的shell程序. 2.默认的交互shell会在用户登录某个虚拟控制台终端时启动. 不过还有另外一个默认的shell是/bin/ ...

  8. html canvas非正方旋转和缩放...写的大多是正方的有人表示一直看正方的看厌了

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. [转载]为什么有些MP4文件在Chrome浏览器上播放不了?

    http://blog.sina.com.cn/s/blog_6bb7ebcc0101c2ja.html Chrome浏览器支持HTML5,它支持原生播放部分的MP4格式(不用通过Flash等插件). ...

  10. Linux - awk 文本处理工具三

    AWK 文件打印匹配 格式示例 awk '/Tom/' file # 打印匹配到得行 awk '/^Tom/{print $1}' # 匹配Tom开头的行 打印第一个字段 awk '$1 !~ /ly ...