#!/usr/bin/python
# -*- coding: utf-8 -*-

import random
import os

iterace = 1000

def fitness(stav):
	constrain = set([])
	for i in range(len(stav)):
		constrain.add('sloupec' + str(i % 9) + str(stav[i]))
		constrain.add('radek' + str(i / 9) + str(stav[i]))
		constrain.add('ctverecek' + str((i / 9) / 3) + str((i % 9) / 3) + str(stav[i]))
	return len(constrain)

populace = []
f = open('ran005.csv', 'w')
velikost_populace_min, velikost_populace_max, pocet_mutace = 19, 40, 1
for i in range(iterace):
	if len(populace) in [0,velikost_populace_max]:
		if len(populace) > 0:
			populace = (sorted(populace, key = lambda x : fitness(x)))[-velikost_populace_min:]
		r = lambda : random.randint(1,9)
		for j in range(pocet_mutace):
			populace.append([1,7,9,2,r(),r(),3,r(),r(),r(),3,r(),r(),r(),6,7,2,r(),r(),r(),r(),7,3,r(),r(),1,8,7,2,1,r(),r(),r(),r(),4,r(),r(),6,r(),r(),9,r(),2,r(),r(),r(),9,8,4,r(),r(),6,r(),3,r(),8,r(),6,r(),4,r(),r(),7,6,r(),2,9,7,5,r(),3,4,r(),4,r(),r(),r(),1,r(),r(),2])
	populace.append([])
	for j in range(81):
		(populace[-1]).append((populace[random.randint(0,len(populace)-2)])[j])
	if i % 10 == 0:
		f.write(str(i + 0.00001) + ', ' + str(fitness(populace[0]) + 0.00001) + '\n')
f.close()

populace = []
f = open('ran01.csv', 'w')
velikost_populace_min, velikost_populace_max, pocet_mutace = 18, 40, 2
for i in range(iterace):
	if len(populace) in [0,velikost_populace_max]:
		if len(populace) > 0:
			populace = (sorted(populace, key = lambda x : fitness(x)))[-velikost_populace_min:]
		r = lambda : random.randint(1,9)
		for j in range(pocet_mutace):
			populace.append([1,7,9,2,r(),r(),3,r(),r(),r(),3,r(),r(),r(),6,7,2,r(),r(),r(),r(),7,3,r(),r(),1,8,7,2,1,r(),r(),r(),r(),4,r(),r(),6,r(),r(),9,r(),2,r(),r(),r(),9,8,4,r(),r(),6,r(),3,r(),8,r(),6,r(),4,r(),r(),7,6,r(),2,9,7,5,r(),3,4,r(),4,r(),r(),r(),1,r(),r(),2])
	populace.append([])
	for j in range(81):
		(populace[-1]).append((populace[random.randint(0,len(populace)-2)])[j])
	if i % 10 == 0:
		f.write(str(i + 0.00001) + ', ' + str(fitness(populace[0]) + 0.00001) + '\n')
f.close()

populace = []
f = open('ran02.csv', 'w')
velikost_populace_min, velikost_populace_max, pocet_mutace = 16, 40, 4
for i in range(iterace):
	if len(populace) in [0,velikost_populace_max]:
		if len(populace) > 0:
			populace = (sorted(populace, key = lambda x : fitness(x)))[-velikost_populace_min:]
		r = lambda : random.randint(1,9)
		for j in range(pocet_mutace):
			populace.append([1,7,9,2,r(),r(),3,r(),r(),r(),3,r(),r(),r(),6,7,2,r(),r(),r(),r(),7,3,r(),r(),1,8,7,2,1,r(),r(),r(),r(),4,r(),r(),6,r(),r(),9,r(),2,r(),r(),r(),9,8,4,r(),r(),6,r(),3,r(),8,r(),6,r(),4,r(),r(),7,6,r(),2,9,7,5,r(),3,4,r(),4,r(),r(),r(),1,r(),r(),2])
	populace.append([])
	for j in range(81):
		(populace[-1]).append((populace[random.randint(0,len(populace)-2)])[j])
	if i % 10 == 0:
		f.write(str(i + 0.00001) + ', ' + str(fitness(populace[0]) + 0.00001) + '\n')
f.close()

os.system("echo \"set terminal png\\nset key right bottom title \\\"Podíl náhodných mutací :\\\" \nset xlabel \\\"Počet iterací\\\" \\nset ylabel \\\"Průměrné fitness\\\" \\nplot \\\"ran005.csv\\\" with lines title \\\"5%\\\", \\\"ran01.csv\\\" with lines title \\\"10%\\\", \\\"ran02.csv\\\" with lines title \\\"20%\\\"\" | gnuplot > vysledek.png")
