genetik

所属分类:人工智能/神经网络/深度学习
开发工具:kotlin
文件大小:0KB
下载次数:0
上传日期:2023-08-26 14:09:23
上 传 者sh-1993
说明:  Kotlin中的遗传编程实现,
(A genetic programming implementation in Kotlin,)

文件列表:
LICENSE (11358, 2023-08-27)
build.gradle.kts (174, 2023-08-27)
charting-listener/ (0, 2023-08-27)
charting-listener/build.gradle.kts (199, 2023-08-27)
charting-listener/src/ (0, 2023-08-27)
charting-listener/src/main/ (0, 2023-08-27)
charting-listener/src/main/java/ (0, 2023-08-27)
charting-listener/src/main/java/net/ (0, 2023-08-27)
charting-listener/src/main/java/net/rools/ (0, 2023-08-27)
charting-listener/src/main/java/net/rools/genetik/ (0, 2023-08-27)
charting-listener/src/main/java/net/rools/genetik/ChartingEvolutionListener.kt (1298, 2023-08-27)
genetik/ (0, 2023-08-27)
genetik/build.gradle.kts (377, 2023-08-27)
genetik/src/ (0, 2023-08-27)
genetik/src/main/ (0, 2023-08-27)
genetik/src/main/kotlin/ (0, 2023-08-27)
genetik/src/main/kotlin/net/ (0, 2023-08-27)
genetik/src/main/kotlin/net/rools/ (0, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/ (0, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/Constant.kt (1009, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/EphemeralConstant.kt (1921, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/EvaluatedIndividual.kt (184, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/FitnessEvaluator.kt (130, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/Function.kt (2752, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/GeneticParameters.kt (873, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/GeneticRunner.kt (5776, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/Individual.kt (129, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/Node.kt (297, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/NodeType.kt (306, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/OptimizationType.kt (85, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/Variable.kt (1508, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/cache/ (0, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/cache/FitnessCache.kt (185, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/cache/LruFitnessCache.kt (647, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/geneticoperation/ (0, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/geneticoperation/EliteOperation.kt (513, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/geneticoperation/GeneticOperation.kt (386, 2023-08-27)
genetik/src/main/kotlin/net/rools/genetik/geneticoperation/ReproductionOperation.kt (752, 2023-08-27)
... ...

# Genetik A genetic programming implementation written in Kotlin. ## Sample Below is a symbolic regression sample that will attempt to evolve mathematical expressions using genetik. The target expression in this sample is $`f(x) = 4 x x x + 7 x x - 3 x + 5`$. The first step is to specify the function and terminal set for the problem. This sample specifies three basic arithmetic expressions, a variable *x* and an *ephemeral random constant* ranging from 1 to 10: ```kotlin val nodeTypes = listOf>( function("+") { a: Int, b: Int -> a + b }, function("-") { a: Int, b: Int -> a - b }, function("*") { a: Int, b: Int -> a * b }, variable("x") { x: Int -> x }, ephemeralConstant { random -> random.nextInt(1, 10) } ) ``` Then a `FitnessEvaluator` is defined which generates a dataset from the target expression. Candidate expressions will be evaluated over this dataset, and the mean squared error will be used as our fitness function: ```kotlin class MeanSquaredErrorEvaluator : FitnessEvaluator { private fun targetExpression(x: Int) = 4 * x * x * x + 7 * x * x - 3 * x + 5 private val dataset: List> = (-50..50).map { x -> x to targetExpression(x) } override fun evaluate(individual: Individual): Double { return dataset.sumOf { (x, expectedY) -> val evaluatedY = individual.rootNode.evaluate(x) (expectedY - evaluatedY).toDouble().pow(2) } / dataset.size } } ``` The last preparatory step is to define the remaining parameters for the run, most of which should be self-explanatory: ```kotlin val params = GeneticParameters( nodeTypes = nodeTypes, rootType = Int::class, fitnessEvaluator = MeanSquaredErrorEvaluator(), populationInitializer = RampedHalfAndHalfInitializer(), geneticOperations = listOf( EliteOperation(10), SubtreeCrossoverOperation(probability = 0.8), SubtreeMutationOperation(probability = 0.25), ReproductionOperation(probability = 1.0) ), terminationCriterion = GenerationTerminationCriterion(100), solutionDesignation = BestSoFarSolutionDesignation(), random = Random(seed = 1), populationSize = 5_000, maxNodeDepth = 4, optimizationType = OptimizationType.MINIMIZE, parsimonyCoefficient = 0.1, ) ``` Everything needed to evolve some expressions is now set up. The parameters is passed to a `GeneticRunner`, and the evolution is started: ```kotlin val runner = GeneticRunner(params) val solution = runner.evolve() println("Expression: ${solution.rootNode.toStringInfix()}") ``` If all goes well, the solution expression should be equivalent to (but not necessarily the same as) the target expression: ``` Expression: (((7 + (x * 4)) * (x * x)) - ((x + x) - (5 - x))) ``` ## License Copyright 2023 Robert Olsson Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

近期下载者

相关文件


收藏者