[PYTHON] Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (2)

Letztes Mal suchte nach einer der Lösungen für das N-Queen-Problem für den Fall von N = 8. Dieses Mal werden wir es auf jedes N ausweiten.

Politik

Ersetzen Sie einfach 8 in Letztes Mal durch ein beliebiges N. Schreiben Sie dieses Mal ein Programm, um eine Lösung zu finden, indem Sie den Wert von N als Argument angeben und ausführen. Die Anzahl der Gene bleibt vier. Beim letzten Mal wurde die Kreuzungsposition festgelegt, diesmal ändert sie sich jedoch in Abhängigkeit von N. Insbesondere werden das N-4. Und nachfolgende Elemente ersetzt, und das N-2. Und nachfolgende Elemente werden ersetzt.

Zusammenfassung

Ich werde es sofort im Quellcode wecken.

n-queen.py


#! /usr/bin/env python
# encoding=utf-8

# N Queens Problem

import sys
import random

gGeneCnt = 4
gMutationSpan = 4
gRange = 0
gVec = [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)]

def makeIniGene(dim):
	ini_gene = []
	for cnt in range(0,gGeneCnt):
		line = []
		for i in range(0, dim):
			val = random.randint(0, dim-1)
			line.append(val)

		ini_gene.append(line)

	return ini_gene

def calcFitness(gene, dim):
	fitness = 0
	board = []
	line = []
	for i in range(0, dim):
		line = []
		for j in range(0, dim):
			if j == gene[i]:
				line.append(1)
			else:
				line.append(0)
		board.append(line)

	for i in range(0, dim):
		for j in range(0, dim):
			val = getCell(board, (i,j), (0,0), dim)
			if val == 1:
				for vec in gVec:
					for k in range(1, dim):
						valofst = getCell(board, (i,j), (vec[0]*k, vec[1]*k), dim)
						if valofst == 1:
							fitness += 1
						elif valofst == -1:
							break

	return fitness

def getCell(board, pos, ofst, dim):
	posx = pos[0] + ofst[0]
	posy = pos[1] + ofst[1]
	if posx >= 0 and posy >= 0 and posx < dim and posy < dim:
		val = board[posx][posy]
	else:
		val = -1
	
	return val

def simpleGa(gene_list, rank_list, dim):
	new_gene_list = []
	for i in range(0, gGeneCnt):
		if i == rank_list[3]:
			new_gene_list.append(gene_list[rank_list[0]])
		else:
			new_gene_list.append(gene_list[i])

	gaIdx = [dim-4, dim-2]
	updated_gene_list = []
	line1 = []
	line2 = []
	for i in range(0, dim):
		if i < gaIdx[0]:
			line1.append(new_gene_list[rank_list[0]][i])
			line2.append(new_gene_list[rank_list[1]][i])
		else:
			line1.append(new_gene_list[rank_list[1]][i])
			line2.append(new_gene_list[rank_list[0]][i])
	updated_gene_list.append(line1)
	updated_gene_list.append(line2)
	
	line1 = []
	line2 = []
	for i in range(0, dim):
		if i < gaIdx[1]:
			line1.append(new_gene_list[rank_list[2]][i])
			line2.append(new_gene_list[rank_list[3]][i])
		else:
			line1.append(new_gene_list[rank_list[3]][i])
			line2.append(new_gene_list[rank_list[2]][i])
	updated_gene_list.append(line1)
	updated_gene_list.append(line2)
	
	return updated_gene_list

def printBoard(gene):
	for i in range(0, len(gene)):
		line = []
		for j in range(0, len(gene)):
			if j == gene[i]:
				line.append(1)
			else:
				line.append(0)

		print line

def main(argv):
	dim = int(argv[1])
	gene_list = makeIniGene(dim)
	print "Initial gene = " + str(gene_list)

	fitness = []
	for i in range(0, gGeneCnt):
		fitness.append(0)

	loop = 0
	while True :
		loop += 1
		idx = 0
		max_fitness_idx = []
		min_fitness_idx = []

		# mutation
		if loop % gMutationSpan == 0:
			geneidx = random.randint(0, gGeneCnt-1)
			posidx = random.randint(0,  dim-1)
			valrand = random.randint(0,  dim-1)
			gene_list[geneidx][posidx] = valrand

		# compare fitness
		for gene in gene_list:
			fitness[idx] = calcFitness(gene, dim)
			if idx == 0:
				max_fitness_idx = (fitness[0], 0)
				min_fitness_idx = (fitness[0], 0)

			if max_fitness_idx[0] < fitness[idx]:
				max_fitness_idx = (fitness[idx], idx)

			if min_fitness_idx[0] > fitness[idx]:
				min_fitness_idx = (fitness[idx], idx)

			print fitness[idx]
			idx += 1

		min_fitness = min(fitness)
		if min_fitness <= gRange:
			print "Loop end = " + str(loop) + ", Fitness = " +  str(min_fitness)
			printBoard(gene_list[min_fitness_idx[1]])
			break

		ranktemp = []
		for i in range(0, gGeneCnt):
			if i !=  max_fitness_idx[1] and i != min_fitness_idx[1]:
				ranktemp.append(i)

		if fitness[ranktemp[0]] > fitness[ranktemp[1]]:
			rank_list = [ min_fitness_idx[1], ranktemp[1], ranktemp[0], max_fitness_idx[1] ]
		else:
			rank_list = [ min_fitness_idx[1], ranktemp[0], ranktemp[1], max_fitness_idx[1] ]

		updated_gene_list = []
		updated_gene_list = simpleGa(gene_list, rank_list, dim)
		gene_list = updated_gene_list


if __name__ == "__main__":
        main(sys.argv)

Als Beispiel wird das Ausführungsergebnis angezeigt, wenn N = 16 ist.

$./n-queen.py 16
...
...
2
2
2
0
Loop end = 23420, Fitness = 0
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 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, 1]
[0, 1, 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, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 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, 1, 0, 0]
[1, 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, 1, 0, 0, 0, 0, 0]

Die Konvergenz ist langsam. .. .. .. Es scheint notwendig zu sein, die Kreuzungsmethode zu ändern, um die Konvergenz zu beschleunigen. Am Ende hängt es vom Glück der Mutation ab, daher kann es notwendig sein, über eine geeignete Mutationsmethode nachzudenken. Dies ist eine zukünftige Ausgabe.

Referenz

KI zum ersten Mal beim Lernen mit Excel :: von Noboru Asai

Recommended Posts

Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (2)
Suche nach einer Lösung für das N-Queen-Problem mit einem genetischen Algorithmus (1)
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Ausführungsergebnis)
Lösung des Planungsproblems der Krankenschwester (Schichtoptimierung) mit einem genetischen Algorithmus
Wie man die anfängliche Population mit einem genetischen Algorithmus unter Verwendung von DEAP fixiert
Eine Geschichte über den Umgang mit dem CORS-Problem
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 1)
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Ich habe versucht, "einen genetischen Algorithmus (GA) in Python zu implementieren, um das Problem des Handlungsreisenden (TSP) zu lösen".
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Speichern Sie das Objekt in einer Datei mit pickle
Lösen Sie das Python-Rucksackproblem mit dem Greedy-Algorithmus
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Lösung des Problems des Handlungsreisenden mit dem genetischen Algorithmus (GA) und seiner Bibliothek (vcopt)
[Python] Lösung für das Problem, dass Elemente beim Kopieren einer Liste verknüpft werden
Berechnen Sie mit scipy.optimize die optimale Lösung, um einen Weltrekord für zehn Arten von Wettbewerb aufzustellen
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Übergang zum Update-Bildschirm mit dem Django-Tag
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
Eine Lösung für das Problem, dass Dateien mit [und] nicht in glob.glob () aufgeführt sind
So lösen Sie das Problem, dass beim Ausführen des PyQt-Systems mit Jupyter oder Spyder IDE häufig ein Neustart des Kernels auftritt
Eine Python-Probe zum Lernen von XOR mit einem genetischen Algorithmus in einem neuronalen Netz
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
[Python] Versuchen Sie, die FX-Systolenparameter mit einem genetischen Algorithmus zu optimieren
Der erste Schritt beim Erstellen einer serverlosen Anwendung mit Zappa
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Die übliche Art, einen Kernel mit Jupyter Notebook hinzuzufügen
Ein Memo, das das Rucksackproblem mit der gierigen Methode löste
Versuchen Sie, eine multimodale Verteilung mithilfe des EM-Algorithmus zu modellieren
Eine Person, die das D-Problem mit ABC von AtCoder lösen möchte, hat versucht, zu kratzen
Eine Geschichte, in der der Algorithmus zu einem lächerlichen Ergebnis kam, als er versuchte, das Problem der reisenden Verkäufer richtig zu lösen
Schreiben Sie ein Programm, um den 4x4x4 Rubik Cube zu lösen! 2. Algorithmus
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Lösen des Labyrinths mit Python-Ergänzung zu Kapitel 6 der Algorithmus-Kurzreferenz-
Fehler mit pip: Beim Bestätigen des SSL-Zertifikats ist ein Problem aufgetreten
Schreiben Sie ein Skript, um die Entfernung mit dem Elasticsearch 5-System schmerzfrei zu berechnen
Lösen Sie das Python-Rucksackproblem mit der Branch-and-Bound-Methode
Lösen Sie Teilsummenprobleme mit der vollständigen Suche in Python
So senden Sie eine Anfrage mit Python an die DMM (FANZA) -API
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Mit OpenCV die einfachsten Fehler finden
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
Die NVM-Prüfsumme ist ungültig, eine Lösung für das Problem, das das kabelgebundene LAN von Intel unter Linux nicht erkennt.
Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen
Das 16. Offline-Echtzeit-Schreibproblem wurde mit Python gelöst
Ein Memo zur einfachen Verwendung des Beleuchtungsstärkesensors TSL2561 mit Raspberry Pi 2
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python