New Score :0
High Score :0
Run Best
NICE BUSINESS TYPE INDICATOR
3. ๊ธ์ ์ ์น๊ตฌ์๊ฒ ๋น๋ ธ๋๋ฐ ์ค๋์ด ๋์ ์ฃผ๊ธฐ๋ก ํ๋ .. ๊ทธ๋ฐ๋ฐ ์นด๋๊ฐ์ ๋ด์ผํ๋ ๋ ๋ ์ค๋์ธ๋ฐ... ์ด๊ฑธ ์ด์ฉ๋...
4. ์ฐ๋ฆฌ ํ์ฌ๋ ์ค์ํ ์์ฌ ๊ฒฐ์ ์ ํ ๋?
5. ์ด์ฌํ ์ผํ ๋๋ฅผ ์ํ ์ ๋ฌผ์ ์ฃผ๊ณ ์ถ๋ค. ์ด๋ค๊ฒ ์ข์๊น?
6. ์ํ์์ ํฌ์์ํ์ ์ถ์ฒ๋ฐ์๋ค. ์ด๋ค๊ฑธ ๊ฐ์ ํ์ง?
7. ํ์ฌ์์์ ๋๋?
8. ๊ฟ์์ ๊นจ์ด๋๋ 20๋ ์ ์ผ๋ก ๋์๊ฐ๋ค. ๋น์ ์ด ์ ์ผ ๋จผ์ ํ๋์ผ์?
9. ๋ด๊ฐ ์ธ์ฌ ๋ด๋น์๋ผ๋ฉด ์ ๊ท ์ ์ฌ์ ์ฑ์ฉ ์ ์ ์ผ ์ค์ํ๊ฒ ๋ณด๋๊ฒ์?
10. ํ์ฌ์ ์ ๋ง ์ซ์ดํ๋ ๋๋ฃ๊ฐ ์๋ค๋ฉด?
11. ๊ฐ๋ํ ์ง์ ๊ฐ์ฅ์ด ๋์๋ค.. ์๋ ์ ์์ผ ๋ ์ ๋ฌผ์?
12. ํ์ ํ์ฌ ์ถ๊ทผ ์คํ์ผ์?
13.ํ์ฌ ์ฒด์ก๋ํ ํ๋ ๋ ์ด๋ค. ์ค๋ ๋ญํ์ง?
14. ๋์ ์ ๋ฌด ์คํ์ผ์?
Genetic Algorithm(GA)
์์ฐ ์ ํ๊ณผ ์งํ๋ฅผ ๋ชจ๋ฐฉํ์ฌ ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฉํํด๋ฆฌ์คํฑ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์๋ฌผํ์ ์งํ์ ๊ฐ๋ ์ธ ์ ํ(Selection), ๊ต์ฐจ(Crossover), ๋์ฐ๋ณ์ด(Mutation)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ํตํด ์ต์ ์ ํด๋ฅผ ์ฐพ์๊ฐ๋๋ค:
์ด๊ธฐํ(Initialization)
์ด๊ธฐ ์ผ์์ฒด ์งํฉ(ํด ์งํฉ)์ ๋ฌด์์๋ก ์์ฑํฉ๋๋ค.
์ ํฉ๋ ํ๊ฐ(Fitness Evaluation)
๊ฐ ์ผ์์ฒด(ํด)์ ์ ํฉ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
์ ํ(Selection)
์ ํฉ๋๊ฐ ๋์ ์ผ์์ฒด๋ฅผ ๋ถ๋ชจ๋ก ์ ํํฉ๋๋ค.
๊ต์ฐจ(Crossover)
๋ถ๋ชจ ์ผ์์ฒด๋ฅผ ๊ฒฐํฉํ์ฌ ์๋ก์ด ์์ ์ผ์์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
๋์ฐ๋ณ์ด(Mutation)
์์ ์ผ์์ฒด์ ์ผ๋ถ ๋ณํ๋ฅผ ๊ฐํ์ฌ ๋ค์์ฑ์ ์ ์งํฉ๋๋ค.
์ข ๋ฃ ์กฐ๊ฑด ํ์ธ(Termination)
์ข ๋ฃ ์กฐ๊ฑด(์: ์ธ๋ ์, ์ ํฉ๋ ์๊ณ๊ฐ ๋ฑ)์ด ์ถฉ์กฑ๋๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฃํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด 2๋จ๊ณ๋ก ๋์๊ฐ๋๋ค.
GA๋ ์ต์ ํ ๋ฌธ์ , ํ์ ๋ฌธ์ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋๋ฉฐ, ๋ณต์กํ ๋ฌธ์ ์ ๋ํด ์ ์ญ ์ต์ ํด๋ฅผ ์ฐพ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
Kotlin์ ํ์ฉํ Genetic Algorithm ์ํ ์ฝ๋
์๋๋ Kotlin์ผ๋ก ๊ฐ๋จํ ์ ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์์ ์ ๋๋ค.
import kotlin.random.Random
// ๊ฐ์ฒด ๋ชจ๋ธ ์ ์
data class Individual(val genes: IntArray, var fitness: Double = 0.0)
// ์ด๊ธฐ ๊ฐ์ฒด๊ตฐ ์์ฑ
fun initializePopulation(populationSize: Int, geneLength: Int): List<Individual> {
return List(populationSize) {
Individual(genes = IntArray(geneLength) { Random.nextInt(0, 2) })
}
}
// ์ ํฉ๋ ํ๊ฐ ํจ์ (์: ์ ์ ์์ ํฉ์ ์ ํฉ๋๋ก ์ฌ์ฉ)
fun evaluateFitness(individual: Individual) {
individual.fitness = individual.genes.sum().toDouble()
}
// ๋ถ๋ชจ ์ ํ (๋ฃฐ๋ ํ ๋ฐฉ์)
fun selectParents(population: List<Individual>): Pair<Individual, Individual> {
val totalFitness = population.sumOf { it.fitness }
fun selectOne(): Individual {
val rand = Random.nextDouble(totalFitness)
var cumulative = 0.0
for (individual in population) {
cumulative += individual.fitness
if (cumulative >= rand) return individual
}
return population.last()
}
return Pair(selectOne(), selectOne())
}
// ๊ต์ฐจ ์ฐ์ฐ
fun crossover(parent1: Individual, parent2: Individual): Individual {
val crossoverPoint = Random.nextInt(parent1.genes.size)
val childGenes = parent1.genes.copyOf().apply {
for (i in crossoverPoint until size) this[i] = parent2.genes[i]
}
return Individual(childGenes)
}
// ๋์ฐ๋ณ์ด ์ฐ์ฐ
fun mutate(individual: Individual, mutationRate: Double = 0.01) {
for (i in individual.genes.indices) {
if (Random.nextDouble() < mutationRate) {
individual.genes[i] = 1 - individual.genes[i] // 0 -> 1 ๋๋ 1 -> 0
}
}
}
// ์ ์ ์๊ณ ๋ฆฌ์ฆ ์คํ
fun runGeneticAlgorithm(
populationSize: Int,
geneLength: Int,
generations: Int,
mutationRate: Double
) {
var population = initializePopulation(populationSize, geneLength)
repeat(generations) { generation ->
// ์ ํฉ๋ ํ๊ฐ
population.forEach { evaluateFitness(it) }
// ์๋ก์ด ์ธ๋ ์์ฑ
val newPopulation = mutableListOf<Individual>()
while (newPopulation.size < populationSize) {
val (parent1, parent2) = selectParents(population)
val child = crossover(parent1, parent2)
mutate(child, mutationRate)
newPopulation.add(child)
}
population = newPopulation
// ํ์ฌ ์ธ๋์ ์ต๊ณ ์ ํฉ๋ ์ถ๋ ฅ
val bestIndividual = population.maxByOrNull { it.fitness }!!
println("Generation $generation: Best Fitness = ${bestIndividual.fitness}")
}
}
fun main() {
runGeneticAlgorithm(
populationSize = 100,
geneLength = 10,
generations = 50,
mutationRate = 0.01
)
}
์ฝ๋ ์ค๋ช
์ด๊ธฐํ
initializePopulation ํจ์์์ ๋ฌด์์๋ก ์ด๊ธฐ ๊ฐ์ฒด๊ตฐ์ ์์ฑํฉ๋๋ค.
์ ํฉ๋ ํ๊ฐ
evaluateFitness ํจ์์์ ๊ฐ ๊ฐ์ฒด์ ์ ์ ์ ํฉ์ ์ ํฉ๋๋ก ๊ณ์ฐํฉ๋๋ค.
๋ถ๋ชจ ์ ํ
selectParents ํจ์์์ ๋ฃฐ๋ ํ ๋ฐฉ์์ ์ฌ์ฉํด ๋ถ๋ชจ๋ฅผ ์ ํํฉ๋๋ค.
๊ต์ฐจ
crossover ํจ์์์ ๊ต์ฐจ์ ์ ๊ธฐ์ค์ผ๋ก ์์์ ์์ฑํฉ๋๋ค.
๋์ฐ๋ณ์ด
mutate ํจ์์์ ์ผ์ ํ๋ฅ ๋ก ์ ์ ์๋ฅผ ๋ณํ์ํต๋๋ค.
์คํ ๊ฒฐ๊ณผ ์์
Generation 0: Best Fitness = 8.0
Generation 1: Best Fitness = 9.0
...
Generation 49: Best Fitness = 10.0
์ ์ฝ๋๋ ๋จ์ํ๋ ๋ฌธ์ ์ ๋ํด ์๋ํ๋ฉฐ, ์ค์ ๋ฌธ์ ์ ๋ง๊ฒ ์ ํฉ๋ ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค