유전자 알고리즘을 사용하여 4 x 4 스도쿠 해결사를 만들려고합니다. 로컬 미니 마에 수렴하는 가치에 몇 가지 문제가 있습니다. 나는 순위가 매겨진 접근법을 사용하고 아래쪽의 두 가지 순위가있는 답변 가능성을 제거하고 가장 높은 순위의 두 가지 답변 가능성 사이의 교차점으로 대체합니다. 현지 mininma를 피하는 추가 도움을 위해, 나는 또한 돌연변이를 사용하고있다. 특정 세대 내에 응답이 결정되지 않으면 나의 인구는 완전히 새로운 무작위 상태 값으로 채워집니다. 그러나, 내 알고리즘은 로컬 미니 마에 갇혀있는 것 같습니다. 피트니스 기능으로, 내가 사용하고 :유전 알고리즘이 지역 최소치에서 수렴하는 것을 방지하는 방법은 무엇입니까?
(오픈 사각형의 총 금액은 * 7 (수 각 광장에서 위반, 행, 열 및 상자)) - 총 위반
을인구은의 ArrayList에있다 각 배열이 입력을 기반으로하는 스도쿠의 가능한 종료 상태 인 정수 배열. 피트니스는 모집단의 각 배열에 대해 결정됩니다.
누군가 내 알고리즘이 로컬 미니 마에 수렴하는 이유를 판단하는 데 도움을 줄 수 있습니까, 아니면 로컬 미니 마를 피하기 위해 사용할 기술을 권장 할 수 있습니까? 어떤 도움이라도 대단히 감사합니다.
피트니스 기능 :
public int[] fitnessFunction(ArrayList<int[]> population)
{
int emptySpaces = this.blankData.size();
int maxError = emptySpaces*7;
int[] fitness = new int[populationSize];
for(int i=0; i<population.size();i++)
{
int[] temp = population.get(i);
int value = evaluationFunc(temp);
fitness[i] = maxError - value;
System.out.println("Fitness(i)" + fitness[i]);
}
return fitness;
}
크로스 오버 기능 :
public void crossover(ArrayList<int[]> population, int indexWeakest, int indexStrong, int indexSecStrong, int indexSecWeak)
{
int[] tempWeak = new int[16];
int[] tempStrong = new int[16];
int[] tempSecStrong = new int[16];
int[] tempSecWeak = new int[16];
tempStrong = population.get(indexStrong);
tempSecStrong = population.get(indexSecStrong);
tempWeak = population.get(indexWeakest);
tempSecWeak = population.get(indexSecWeak);
population.remove(indexWeakest);
population.remove(indexSecWeak);
int crossoverSite = random.nextInt(14)+1;
for(int i=0;i<tempWeak.length;i++)
{
if(i<crossoverSite)
{
tempWeak[i] = tempStrong[i];
tempSecWeak[i] = tempSecStrong[i];
}
else
{
tempWeak[i] = tempSecStrong[i];
tempSecWeak[i] = tempStrong[i];
}
}
mutation(tempWeak);
mutation(tempSecWeak);
population.add(tempWeak);
population.add(tempSecWeak);
for(int j=0; j<tempWeak.length;j++)
{
System.out.print(tempWeak[j] + ", ");
}
for(int j=0; j<tempWeak.length;j++)
{
System.out.print(tempSecWeak[j] + ", ");
}
}
돌연변이 기능 :
public void mutation(int[] mutate)
{
if(this.blankData.size() > 2)
{
Blank blank = this.blankData.get(0);
int x = blank.getPosition();
Blank blank2 = this.blankData.get(1);
int y = blank2.getPosition();
Blank blank3 = this.blankData.get(2);
int z = blank3.getPosition();
int rando = random.nextInt(4) + 1;
if(rando == 2)
{
int rando2 = random.nextInt(4) + 1;
mutate[x] = rando2;
}
if(rando == 3)
{
int rando2 = random.nextInt(4) + 1;
mutate[y] = rando2;
}
if(rando==4)
{
int rando3 = random.nextInt(4) + 1;
mutate[z] = rando3;
}
}
또한 스도쿠 게임의 4x4 게임에 적합한 인구 규모 및 최대 세대 수는 무엇입니까? –
솔직하게 말해서, 나는 이것이 기술의 오용이라고 생각합니다. 유전 알고리즘은 최적의 대답을 찾기가 어려운 퍼지 질문 (예 : 여행 판매원 문제)에 가장 적합하지만 합리적으로 좋은 답변을 찾는 것은 쉽습니다. 잘 디자인 된 스도쿠 퍼즐에는 정답이 하나뿐입니다. 철저한 검색으로 빠르고 쉽게 찾을 수 있습니다. – user3386109