package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
$ go run hello.go Hello, World!
type GeneticAlgorithmSettings struct {
PopulationSize int
MutationRate int
CrossoverRate int
NumGenerations int
KeepBestAcrossPopulation bool
}
type GeneticAlgorithmRunner interface {
GenerateInitialPopulation(populationSize int) []interface{}
PerformCrossover(individual1, individual2 interface{}, mutationRate int) interface{}
PerformMutation(individual interface{}) interface{}
Sort([]interface{})
}
type QuadraticGA struct {}
func (l QuadraticGA) GenerateInitialPopulation(populationSize int) []interface{}{
initialPopulation := make([]interface{}, 0, populationSize)
for i:= 0; i < populationSize; i++ {
initialPopulation = append(initialPopulation, makeNewEntry())
}
return initialPopulation
}
func (l QuadraticGA) PerformCrossover(result1, result2 interface{}, _ int) interface{}{
return (result1.(float64) + result2.(float64)) / 2
}
func (l QuadraticGA) PerformMutation(_ interface{}, _ int) interface{}{
return makeNewEntry()
}
func (l QuadraticGA) Sort(population []interface{}){
sort.Slice(population, func(i, j int) bool {
return calculate(population[i].(float64)) > calculate(population[j].(float64))
})
}
settings := ga.GeneticAlgorithmSettings{
PopulationSize: 5,
MutationRate: 10,
CrossoverRate: 100,
NumGenerations: 20,
KeepBestAcrossPopulation: true,
}
best, err := ga.Run(QuadraticGA{}, settings)
if err != nil {
println(err)
}else{
fmt.Printf("Best: x: %f y: %f\n", best, calculate(best.(float64)))
}
func makeNewEntry() float64 {
return highRange * rand.Float64()
}
func calculate(x float64) float64 {
return math.Pow(x, 2) - 6*x + 2 // minimum should be at x=3
}
func Run(geneticAlgoRunner GeneticAlgorithmRunner, settings GeneticAlgorithmSettings) (interface{}, error){
population := geneticAlgoRunner.GenerateInitialPopulation(settings.PopulationSize)
geneticAlgoRunner.Sort(population)
bestSoFar := population[len(population) - 1]
for i:= 0; i < settings.NumGenerations; i++ {
newPopulation := make([]interface{}, 0, settings.PopulationSize)
if settings.KeepBestAcrossPopulation {
newPopulation = append(newPopulation, bestSoFar)
}
// perform crossovers with random selection
probabilisticListOfPerformers := createStochasticProbableListOfIndividuals(population)
newPopIndex := 0
if settings.KeepBestAcrossPopulation{
newPopIndex = 1
}
for ; newPopIndex < settings.PopulationSize; newPopIndex++ {
indexSelection1 := rand.Int() % len(probabilisticListOfPerformers)
indexSelection2 := rand.Int() % len(probabilisticListOfPerformers)
// crossover
newIndividual := geneticAlgoRunner.PerformCrossover(
probabilisticListOfPerformers[indexSelection1],
probabilisticListOfPerformers[indexSelection2], settings.CrossoverRate)
// mutate
if rand.Intn(101) < settings.MutationRate {
newIndividual = geneticAlgoRunner.PerformMutation(newIndividual)
}
newPopulation = append(newPopulation, newIndividual)
}
population = newPopulation
// sort by performance
geneticAlgoRunner.Sort(population)
// keep the best so far
bestSoFar = population[len(population) - 1]
}
return bestSoFar, nil
}
func createStochasticProbableListOfIndividuals(population []interface{}) []interface{} {
totalCount, populationLength:= 0, len(population)
for j:= 0; j < populationLength; j++ {
totalCount += j
}
probableIndividuals := make([]interface{}, 0, totalCount)
for index, individual := range population {
for i:= 0; i < index; i++{
probableIndividuals = append(probableIndividuals, individual)
}
}
return probableIndividuals
}
type Quad3D struct {
x, y float64
}
func makeNewQuadEntry(newX, newY float64) Quad3D {
return Quad3D{
x: newX,
y: newY,
}
}
func calculate3D(entry Quad3D) float64 {
return math.Pow(entry.x, 2)- 6 * entry.x + math.Pow(entry.y, 2)- 6 * entry.y + 2
}
type Quadratic3dGA struct {
}
func (l Quadratic3dGA) GenerateInitialPopulation(populationSize int)[]interface{}{
initialPopulation := make([]interface{}, 0, populationSize)
for i:= 0; i < populationSize; i++ { initialPopulation = append(initialPopulation, makeNewQuadEntry(makeNewEntry(), makeNewEntry())) } return initialPopulation } func (l Quadratic3dGA) PerformCrossover(result1, result2 interface{}, mutationRate int) interface{}{ r1Entry, r2Entry := result1.(Quad3D), result2.(Quad3D) return makeNewQuadEntry((r1Entry.x + r2Entry.x) / 2, (r1Entry.y + r2Entry.y) / 2,) } func (l Quadratic3dGA) PerformMutation(_ interface{}) interface{}{ return makeNewQuadEntry(makeNewEntry(), makeNewEntry()) } func (l Quadratic3dGA) Sort(population []interface{}){ sort.Slice(population, func(i, j int) bool { return calculate3D(population[i].(Quad3D)) > calculate3D(population[j].(Quad3D))
})
}
func quadratic3dMain(){
settings := ga.GeneticAlgorithmSettings{
PopulationSize: 25,
MutationRate: 10,
CrossoverRate: 100,
NumGenerations: 20,
KeepBestAcrossPopulation: true,
}
best, err := ga.Run(Quadratic3dGA{}, settings)
entry := best.(Quad3D)
if err != nil {
println(err)
}else{
fmt.Printf("Best: x: %f y: %f z: %f\n", entry.x, entry.y, calculate3D(entry))
}
}
func main() {
beforeQuadTime := time.Now()
quadraticMain()
afterQuadTime := time.Since(beforeQuadTime)
fmt.Printf("%d\n", afterQuadTime)
before3dQuadTime := time.Now()
quadratic3dMain()
after3dQuatTime := time.Since(before3dQuadTime)
fmt.Printf("%d\n", after3dQuatTime)
}
Best: x: 3.072833 y: -6.994695 136,876 Best: x: 3.891671 y: 4.554884 z: -12.787259 4,142,778
Best: 121.409960:, $58100 QB: Aaron Rodgers - 23.777778 RB: Latavius Murray - 15.228571 RB: DeMarco Murray - 19.980000 WR: Kelvin Benjamin - 11.800000 WR: Stefon Diggs - 14.312500 WR: Alshon Jeffery - 9.888889 TE: Connor Hamlett - 8.200000 D: Philadelphia Eagles - 10.777778 K: Phil Dawson - 7.444444 16,010,182
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有