动手写点东西是学习新知识很重要的一个阶段。之前用 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. Two Bases CodeForces - 602A (BigInteger c++long long也可以)

    哇咔咔 卡函数的 标记一下 c++和java的进制转换函数都是1-36进制的 c++ long long暴力就过了... 自己写一个就好了 import java.math.BigInteger; i ...

  2. Fire Net HDU - 1045(二分匹配)

    把每一列中相邻的 .  缩为一个点 作为二分图的左边 把每一行中相邻的  .  缩为一个点 作为二分图的右边 然后求最大匹配即可 这题用匈牙利足够了...然而..我用了hk...有点大材小用的感觉// ...

  3. gitlab 7.10.4 去除邮件认证

    $path/app/model/user.rb中 devise后面的confirmable

  4. 【bzoj1758】 Wc2010—重建计划

    http://www.lydsy.com/JudgeOnline/problem.php?id=1758 (题目链接) 题意 给出一棵树,每条边有边权,问选出一条长度为$[L,U]$的路径,使得路径上 ...

  5. alpine编译安装tengine,并使用supervisor启动

    Alpine是一个小型的linux系统,官方docker镜像只有不到5MB,非常适合作为容器镜像. Alpine Linux is a security-oriented, lightweight L ...

  6. 同一台机器安装多个MySQL服务

    在同一个服务器上面安装多个MySQL服务,甚至是安装多个不同版本(比如5.7和5.7.5.7和8.0.12),关键在于区分安装目录.数据目录和使用端口等. 可以下面步骤 安装MySQL1 wget h ...

  7. bzoj3920: Yuuna的礼物(莫队+分块套分块)

    思路挺简单的,但是总感觉好难写...码力还是差劲,最后写出来也挺丑的 这题显然是个莫队题,考虑怎么转移和询问... 根据莫队修改多查询少的特点,一般用修改快查询慢的分块来维护.查第$k_1$小的出现次 ...

  8. [收藏]:[算法]LRU和LFU的区别

    LRU和LFU是不同的! LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面! LFU是最近最不常用页面置换算法(Least Freque ...

  9. HTTP 返回的状态码 != 200 ,浏览器不会将返回的内容缓存到本地磁盘上

    今天无意发现的,以前处理HTTP State = 404或403之类的,都是直接返回 HTTP 200 OK,然后加一个缓存设置,例如: Cache-Control: max-age=3600 最近修 ...

  10. jq禁用html标签

    原文:http://www.jb51.net/article/105154.htm 移除或禁用html元素的点击事件可以通过css实现也可以通过js或jQuery实现. 一.CSS方法 .disabl ...