使用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

时间: 2024-12-30 04:09:18

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

使用 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"); fu

从单体智能到群体统筹,优化算法推动人工智能新浪潮

(上图为斯坦福大学李国鼎工程讲座教授.杉数科技首席科学顾问叶荫宇) 过去两年出现了人工智能的热潮,特别是以深度学习算法为代表人工智能在中国市场出现了井喷现象.根据麦肯锡统计,2016年全球科技巨头在人工智能上投入了 200亿到300亿美元,VC/PE投融资达60亿到90亿美元.在中国,根据钛媒体TMTbase全球创投数据库的数据统计,目前共收录中国人工智能企业398家.共发生571起投资事件,投资总额高达571亿人民币. 就在AlphaGo先后挑战世界和中国围棋高手后,关于人工智能的热炒更有甚嚣

常用最短路优化算法及例题(附模板)——-SPFA和Dijkstra

常用最短路算法——-SPFA和Dijkstra及其优化 这篇文章将简单讲解两个最常用的最短路优化算法,需要读者有一定的图论基础. 首先从DIJKSTRA讲起.常规的dijkstra算法复杂度较高,为O(n^2),因为要花大量时间来找当前已知的距顶点距离最小的值,所以用优先队列(值小的先出队列)来优化,可大大优化时间复杂度.STL中优先队列的操作单次复杂度为O(logN),所以经过优先队列优化的dijkstra时间复杂度会降到O(N*logN); 以下为核心部分代码: 1 struct pack{

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

粒子群优化算法

2011-12-05 19:49:55 标签:群智能 休闲 蚁群优化 粒群优化 粒子群优化 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://nxlhero.blog.51cto.com/962631/734212 粒子群优化算法属于群智能(swarm intelligence)优化算法.群智能分两种,一种是粒群优化,另一种是蚁群优化. 群智能概念 假设你和你的朋友正在寻宝,每个人有个探测器,这个探测器可以知道宝藏到探测器的距离

量子粒子群优化算法

参考文献: 量子行为粒子群优化算法研究[D] ,孙俊,博士论文2.4节. #include <iostream> #include <math.h> #include <time.h> using namespace std; #define M 50 //群体数目50 #define N 4 //每个粒子的维数4 //测试类 class TestFunction { public: double resen(double x1,double x2,double x3,

基本粒子群优化算法(PSO)的matlab实现

粒子群优化算法是一种模拟鸟群社会行为的群体搜素算法.它分为全局最佳粒子优化和局部最佳粒子优化,对于全局最佳PSO,或者叫做gbest PSO,每个粒子的邻域都是整个群,其算法伪代码如下: 创建并初始化一个n维的粒子群 repeat for 每个粒子i=1,2,-n do //设置个体最佳位置 if f(i)<y then y=f(i); end //设置全局最佳位置 if y<Y then Y=y; end end for 每个粒子i=1,2,-n do 用速度方程更新速度 用位置方程更新位置

优化算法——拟牛顿法之DFP算法

一.牛顿法 在博文"优化算法--牛顿法(Newton Method)"中介绍了牛顿法的思路,牛顿法具有二阶收敛性,相比较最速下降法,收敛的速度更快.在牛顿法中使用到了函数的二阶导数的信息,对于函数,其中表示向量.在牛顿法的求解过程中,首先是将函数在处展开,展开式为: 其中,,表示的是目标函数在的梯度,是一个向量.,表示的是目标函数在处的Hesse矩阵.省略掉最后面的高阶无穷小项,即为: 上式两边对求导,即为: 在基本牛顿法中,取得最值的点处的导数值为,即上式左侧为.则: 求出其中的:

性能优化——算法优化

背景 由于某种原因,我们系统需要记录另一个系统中一个表里的id.但是,当我们记录完了以后,别人系统可能会删除那个表里的一些数据,这样的话,我们这边就多了一些无效数据,所以,我们必须的找到这些无效的id,然后将其删除. 开始,我们的实现是这样:我们将记录下来的所有id放在一个list里,然后传到另一个系统,他将他们已经删除的id返回.具体处理代码如下: <pre name="code" class="java">public String findDele