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.
近期下载者:
相关文件:
收藏者: