El algoritmo genético de la inteligencia artificial resuelve las ocho reinas

1. Descripción del problema
  El problema de las ocho reinas es un problema en el trasfondo del ajedrez: ¿cómo colocar ocho reinas en un tablero de ajedrez de 8×8 para que ninguna reina pueda capturar directamente a otras reinas? Para lograr esto, no pueden estar dos reinas en la misma línea horizontal, vertical o diagonal. El problema de las ocho reinas se puede extender a un problema de colocación de n reinas más general: en este momento, el tamaño del tablero de ajedrez se convierte en n1 × n1, y el número de reinas también se convierte en n2. Y el problema se resuelve solo cuando n2 ≥ 1 o n1 ≥ 4.
2. Uso del método: Antes de esto, el problema de las ocho reinas se resolvió buscando a ciegas en la gráfica, esta vez, después de aprender el algoritmo genético, lo realicé con python.
Definición de la función de aptitud, tamaño de la población, proporción de cruce, proporción de mutación, condición de terminación del algoritmo; (
1) función de aptitud = 28-número de parejas de reinas que se atacan entre sí;
(2) el tamaño de la población se establece en 20;
(3) proporción de cruce 1 ;
(4) Tasa de variación 0.05;
(5) Condición de terminación del algoritmo Detener el algoritmo cuando aparece un estado con un fitness de 28 o el número de iteraciones llega a 3000;
luego comenzamos nuestro proceso de codificación, (aquí esto atacable La función de cálculo del el par de reinas también usa el DFS anterior para resolver la idea del código de las ocho reinas).

import  random
import copy
def Variataion(Population_list):#种群作为参数,进行变异 变异率为0.05
       # print("准备开始变异",Population_list)
       index1,index2=random.randint(0,19),random.randint(0,7)
       # print(index1,index2)
       value=random.randint(0,7)
       Population_list[index1][index2]=value
       return  Population_list

def Crisscross(Population_list):#种群作为参数,进行交叉
     # print(len(Population_list))
     i=0
     NewPopulation_list=[]
     while True:
         x=[]
         y=[]
         temp1=copy.deepcopy(Population_list[i])
         temp2=copy.deepcopy(Population_list[i+1])
         key=random.randint(0,7)
         # print("测试点",key)
         for j in range(key):
             x.append(temp1[j])
         for j in range(key,len(temp1)):
             x.append(temp2[j])
         for j in range(key):
             y.append(temp2[j])
         for j in range(key,len(temp1)):
             y.append(temp1[j])
         i+=2
         # print(x,y)
         NewPopulation_list.append(x)
         NewPopulation_list.append(y)
         if i==len(Population_list):
             # print(NewPopulation_list)
             return NewPopulation_list

def StartPopulation():#产生一个初始的随机种群,个体数量为20
     Population_list=[]#种群列表
     while True:
         Individual_list=[]#个体列表
         while True:
            x=random.randint(0,7)
            Individual_list.append(x)
            if len(Individual_list)==8:
                Population_list.append(Individual_list)
                # print(Individual_list)
                # print(Population_list)
                break
         if len(Population_list)==20:
             #print(Population_list)
             return Population_list

def tran(Individual):#将序列转化为矩阵
    #print(Individual)
    zt=[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]
    for i in range(8):
           zt[Individual[i]][i]=8
    #printf(zt)
    return zt
    pass

def Fitness(zt):#参数为矩阵
    ans=0
    for i in range(8):
        for j  in range(8):
            if  zt[i][j]==8:
                for m in range(j):
                    if  zt[i][m]==8:
                        ans+=1
                for  a in range(i):
                    for b in range(8):
                        if zt[a][b]==8:
                            if (a-b==i-j)or (a+b==i+j):  # 判断对角线
                                         ans+=1
    return 28-ans

def printf(chess):#用来输出测试
    for i in range(8):
        for j in range(8):
            print(chess[i][j],end=' ')
        print()

def  Iheritance():#遗传算法
    Population_list=StartPopulation()
    # print(Population_list)
    # for item in Population_list:
    #     print(Fitness(tran(item)),end=' ')
    # print()
    index=0
    while True:
        if index>3000:
            return -1
        for item in Population_list:
            if Fitness(tran(item))==28:
                print("找到一个可行的解")
                return item
        select=[]#选择种群列表
        for item in Population_list:
            if Fitness(tran(item))>=20:
                select.append(item)
        if len(select)!=len(Population_list):
            while True:
                x=random.randint(0,19)
                if Fitness(tran(Population_list[x]))>22:
                    select.append(Population_list[x])
                if len(select)==len(Population_list):

                        break
        # print(select)
        Crisscross_list=Crisscross(select)#交叉遗传产生的种群
        Variataion_list=Variataion(Crisscross_list)#变异之后产生的种群
        Population_list.clear()
        Population_list=copy.deepcopy(Variataion_list)
        index+=1
if  __name__=="__main__":
      reslut=Iheritance()
      if reslut==-1:
          print("到达最大迭代次数")
      else:
          print(reslut)
          printf(tran(reslut))
          print("适应度为",Fitness(tran(reslut)))
      pass

Supongo que te gusta

Origin blog.csdn.net/qq_44741914/article/details/106182198
Recomendado
Clasificación