使用Golang编写优化算法 (1)
动手写点东西是学习新知识很重要的一个阶段。之前用 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)的更多相关文章
- 使用 JavaScript 编写优化算法 (1)
之前一直用Python来写优化算法,为了增强 JS 的熟练程度,开始将原有的代码改写成 JS.采用的工具包括 node.js + Grunt + nodeunit + github + npm + t ...
- fastjson的deserializer的主要优化算法
JSON最佳实践 | kimmking's blog http://kimmking.github.io/2017/06/06/json-best-practice/ Fastjson内幕 Java综 ...
- JavaScript是如何工作的02:深入V8引擎&编写优化代码的5个技巧
概述 JavaScript引擎是执行 JavaScript 代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器. 以为实现J ...
- Golang 性能优化实战
小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...
- fastjson的deserializer的主要优化算法 漏洞
JSON最佳实践 | kimmking's blog http://kimmking.github.io/2017/06/06/json-best-practice/ Fastjson内幕 Java综 ...
- 数值最优化:一阶和二阶优化算法(Pytorch实现)
1 最优化概论 (1) 最优化的目标 最优化问题指的是找出实数函数的极大值或极小值,该函数称为目标函数.由于定位\(f(x)\)的极大值与找出\(-f(x)\)的极小值等价,在推导计算方式时仅考虑最小 ...
- [Algorithm] 群体智能优化算法之粒子群优化算法
同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...
- 基于网格的分割线优化算法(Level Set)
本文介绍一种网格分割线的优化算法,该方法能够找到网格上更精确.更光滑的分割位置,并且分割线能够自由地合并和分裂,下面介绍算法的具体原理和过程. 曲面上的曲线可以由水平集(level set)形式表示, ...
- paper 8:支持向量机系列五:Numerical Optimization —— 简要介绍求解求解 SVM 的数值优化算法。
作为支持向量机系列的基本篇的最后一篇文章,我在这里打算简单地介绍一下用于优化 dual 问题的 Sequential Minimal Optimization (SMO) 方法.确确实实只是简单介绍一 ...
随机推荐
- 如何使用js判断视频是否可以成功访问
日常工作中会出现各个公司网络不互通的情况,视频如果采用不互通的地址也无法播放,下面方法提供了检测视频是否可以播放的解决方案: 1.跨域 var video = document.createEleme ...
- Influxdb安装部署
1.下载Influxdb并解压 2.下载上图中的nssm(辅助性工具) 3. 在安装目录执行cmd 输入 nssm install influxdb,其中Path选择安装文件中的influxd,Ar ...
- 【loj114】k大异或和 线性基+特判
题目描述 给由 $n$ 个数组成的一个可重集 $S$ ,每次给定一个数 $k$ ,求一个集合 $T⊆S$ ,使得集合 $T$ 在 $S$ 的所有非空子集的不同的异或和中,其异或和 $T_1 ...
- 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐
题目描述 假设有来自 \(n\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i\) .会议餐厅共有 \(m\) 张餐桌,每张餐桌可容纳 \(c_i\) 个代表就餐. 为了使 ...
- CJB的大作
Description 给你一个长度不超过100的字符串.一共进行\(N\)次操作,第\(i\)次操作是将当前字符串复制一份接到后面,并将新的一份循环移位\(k_i\)(\(1 \le k_i \le ...
- SpringBoot中的定时任务与Quartz的整合
SpringBoot集成Quartz 定时任务Quartz : 就是在指定的时间执行一次或者循环执行,在项目的开发中有时候会需要的, 还是很有用的. SpringBoot内置的定时 添加依赖 < ...
- ByteBuffer的allocate与allocateDirect2013-01-11
在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public sta ...
- ssm框架中Controller层的junit测试_我改
Controller测试和一般其他层的junit测试可以共用一个BaseTest 一.BaseTest如下: @RunWith(SpringJUnit4ClassRunner.class) @WebA ...
- Spark记录-spark与storm比对与选型(转载)
大数据实时处理平台市场上产品众多,本文着重讨论spark与storm的比对,最后结合适用场景进行选型. 一.spark与storm的比较 比较点 Storm Spark Streaming 实时计算模 ...
- Spark记录-spark编程介绍
Spark核心编程 Spark 核心是整个项目的基础.它提供了分布式任务调度,调度和基本的 I/O 功能.Spark 使用一种称为RDD(弹性分布式数据集)一个专门的基础数据结构,是整个机器分区数据的 ...