(다른 포럼에서 X 게시물).
gene[0] = 1 (item 0 is in knapsack 1)
gene[1] = 0 (item 1 is not in any knapsack)
gene[2] = 3 (item 2 is in knapsack 3)
gene[3] = 2 (item 3 is in knapsack 2)
gene[4] = 1 (item 4 is in knapsack 1)
그래서 개인이 3에 대한 가능한 해결책을 나타냅니다
예를 들어, 나는 항목이 어떤 배낭에없는 나타 내기 위해 항목의 배낭 번호와 같은 유전자를 고려하고 0
것 배낭. 그리고 당신은 예를 들어 인구 100 명을 가질 수 있습니다.
이 정보를 코딩하면 변형 및 재생산을 계산하기가 쉽습니다.
유전자를 돌연변이시키기 위해서는 [0,3] 범위의 난수 인 새로운 값을 지정하면됩니다. 예를 들어, 돌연변이 알고리즘 :
n = number of genes
mutation_rate = 0.01 // it means a mutation rate of 1%
For i from 0 to n-1
r = random real number between 0.0 and 1.0
If(r < mutation_rate)
gene[i] of new individual = (random integer number) modulo 4
Else
gene[i] of new individual = gene[i] of original individual
EndIf
EndFor
당신이 재생을 구현하려면, 당신은 단지 첫 번째 개인의 유전자의 절반, 두 번째 개인의 유전자의 반대 반을 선택해야합니다.
n = number of genes
For i from 0 to n-1
r = random integer number
If(r modulo 2 == 0)
gene[i] of new individual = gene[i] of first individual
Else
gene[i] of new individual = gene[i] of second individual
EndIf
EndFor
당신은 아동이 개인보다 효율적으로보다 먼저 계산에 돌연변이 아이들을 계산하기 위해, 하나에 두 개의 선행 알고리즘을 결합하고 그것을 변이 할 수 있습니다.
저는 피트니스 기능의 전문가는 아니지만, 다음과 같은 점에서 당신을 격려 할 수 있다고 생각합니다. 매우 기본적이고 배낭이 가능한 한 많이 채워 져야한다는 사실을 고려해야합니다. 이 운동 기능의 경우, 적합성 높은 값이 더 나은 솔루션입니다 :
n = number of genes
fitness = 0
weight_noknapsack = 0
weight_knapsack1 = 0
weight_knapsack2 = 0
weight_knapsack3 = 0
For i from 0 to n-1
Switch gene[i]
case 0: weight_noknapsack += item[i].weight
case 1: weight_knapsack1 += item[i].weight
case 2: weight_knapsack2 += item[i].weight
case 3: weight_knapsack3 += item[i].weight
EndSwitch
EndFor
If(weight_knapsack1 <= MAX_WEIGHT_KNAPSACK1)
fitness += weight_knapsack1
EndIf
If(weight_knapsack2 <= MAX_WEIGHT_KNAPSACK2)
fitness += weight_knapsack2
EndIf
If(weight_knapsack3 <= MAX_WEIGHT_KNAPSACK3)
fitness += weight_knapsack3
EndIf
그것은 피트니스을 계산,하지만 난 더 나은 피트니스 기능이있을 수 있습니다 생각합니다.
죄송하지만 귀하의 설명은 명확하지 않습니다. 해결하려는 문제를 설명하는 빠른 서문은 어떻습니까? – Basic
희망 사항을 더 잘 이해하기 위해 내 질문을 수정했습니다. –