Skip to content

Commit c803284

Browse files
committed
Add grid search optimizer
1 parent 2f9c651 commit c803284

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.kylecorry.sol.math.optimization
2+
3+
import com.kylecorry.sol.math.Range
4+
5+
class GridSearchOptimizer(private val stepSize: Double) : IOptimizer {
6+
override fun optimize(
7+
xRange: Range<Double>,
8+
yRange: Range<Double>,
9+
maximize: Boolean,
10+
fn: (x: Double, y: Double) -> Double
11+
): Pair<Double, Double> {
12+
var bestX = xRange.start
13+
var bestY = yRange.start
14+
var bestValue = fn(bestX, bestY)
15+
16+
var x = xRange.start
17+
while (x <= xRange.end) {
18+
var y = yRange.start
19+
while (y <= yRange.end) {
20+
val value = fn(x, y)
21+
if ((maximize && value > bestValue) || (!maximize && value < bestValue)) {
22+
bestValue = value
23+
bestX = x
24+
bestY = y
25+
}
26+
y += stepSize
27+
}
28+
x += stepSize
29+
}
30+
31+
return Pair(bestX, bestY)
32+
}
33+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.kylecorry.sol.math.optimization
2+
3+
import com.kylecorry.sol.math.Range
4+
import org.junit.jupiter.api.Assertions.*
5+
6+
import org.junit.jupiter.api.Test
7+
8+
internal class GridSearchOptimizerTest {
9+
10+
@Test
11+
fun optimize() {
12+
val optimizer = GridSearchOptimizer(0.01)
13+
val fn = { x: Double, y: Double ->
14+
x * x + y * y
15+
}
16+
17+
val minimum = optimizer.optimize(Range(-10.0, 10.0), Range(-10.0, 10.0), maximize = false, fn = fn)
18+
19+
assertEquals(0.0, minimum.first, 0.01)
20+
assertEquals(0.0, minimum.second, 0.01)
21+
}
22+
}

0 commit comments

Comments
 (0)