import randomimport openpyxlfrom openpyxl.chart import BarChart, Referencefrom enum import Enum
work_book = openpyxl.load_workbook("课堂实验报告-姓名-学号.xlsx")sheet = work_book.get_sheet_by_name("Sheet1")
optimal_genome = [2, 1, 3, 3, 4]lowest_fitness = 0highest_fitness = 10
class genome:alive = Truegene = []
def __init__(self):self.gene = [random.randint(1, 4),random.randint(1, 4),random.randint(1, 4),random.randint(1, 4),random.randint(1, 4)]
def fitness(self):if self.alive == False:return 0
result = 0for i in range(5):result += 2 if self.gene[i] == optimal_genome[i] else 0
return result
def variant(self, targer):self.gene[targer] = random.randint(1, 4)
def overlap(self, other_genome, targer):self.gene[targer], other_genome.gene[targer] = \other_genome.gene[targer], self.gene[targer]
def dead(self):self.alive = False
end_flag = Falsegenome_result = []operation_result = []
while end_flag == False:genome_set = []genome_result = [[[]*5]*20 for i in range(20)]operation_result = [[""]*20 for i in range(20)]for i in range(20):genome_set.append(genome())
for i in range(20):if genome_set[i].fitness() == highest_fitness:continue
for times in range(20):alive_genome = []for i in range(20):if genome_set[i].fitness() <= lowest_fitness:genome_set[i].dead()if genome_set[i].alive == True:alive_genome.append(i)
for i in range(20):genome_result[times][i] = genome_set[i].gene[:]
operation_set = [""]*20while len(alive_genome) > 0:genome1 = random.choices(alive_genome)[0]genome2 = random.choices(alive_genome)[0]target_gene = random.randint(0, 4)tmp = genome_set[genome1].gene[target_gene]if genome1 == genome2:while tmp == genome_set[genome1].gene[target_gene]:genome_set[genome1].variant(target_gene)operation_set[genome1] = "m,"+str(target_gene+1)alive_genome.remove(genome1)else:genome_set[genome1].overlap(genome_set[genome2], target_gene)operation_set[genome1] = "c," + \str(genome2+1)+","+str(target_gene+1)operation_set[genome2] = "c," + \str(genome1+1)+","+str(target_gene+1)alive_genome.remove(genome1)alive_genome.remove(genome2)
operation_result[times] = operation_set[:]
for i in range(20):if genome_set[i].fitness() == highest_fitness:end_flag = True
for i in range(0, 20):for j in range(3, 23):for k in range(7, 12):sheet.cell((i*8)+k, j).value = genome_result[i][j-3][k-7]sheet.cell((i*8)+13, j).value = operation_result[i][j-3]
for i in range(0, 20):sheet.cell(i+12, 23).value = "=AVERAGE(C" + \str(12+i*8)+":V"+str(12+i*8)+")"sheet.cell(12+i, 24).value = "=MAX(C"+str(12+i*8)+":V"+str(12+i*8)+")"sheet.cell(165, i+3).value = ""
sheet.cell(168, 11).value = "遗传算法所找到的适应度值最大的染色体是"+str(optimal_genome)
chart = BarChart()data = Reference(sheet, min_row=12, max_row=31, min_col=23, max_col=23)chart.add_data(data)chart.title = "平均值"sheet.add_chart(chart, "K169")
chart1 = BarChart()data1 = Reference(sheet, min_row=12, max_row=31, min_col=24, max_col=24)chart1.add_data(data1)chart1.title = "最大值"sheet.add_chart(chart1, "Q169")
work_book.save("output.xlsx")
work_book = openpyxl.load_workbook("课堂实验报告-姓名-学号.xlsx")sheet = work_book.get_sheet_by_name("Sheet1")
optimal_genome = [2, 1, 3, 3, 4]lowest_fitness = 0highest_fitness = 10
class genome:alive = Truegene = []
def __init__(self):self.gene = [random.randint(1, 4),random.randint(1, 4),random.randint(1, 4),random.randint(1, 4),random.randint(1, 4)]
def fitness(self):if self.alive == False:return 0
result = 0for i in range(5):result += 2 if self.gene[i] == optimal_genome[i] else 0
return result
def variant(self, targer):self.gene[targer] = random.randint(1, 4)
def overlap(self, other_genome, targer):self.gene[targer], other_genome.gene[targer] = \other_genome.gene[targer], self.gene[targer]
def dead(self):self.alive = False
end_flag = Falsegenome_result = []operation_result = []
while end_flag == False:genome_set = []genome_result = [[[]*5]*20 for i in range(20)]operation_result = [[""]*20 for i in range(20)]for i in range(20):genome_set.append(genome())
for i in range(20):if genome_set[i].fitness() == highest_fitness:continue
for times in range(20):alive_genome = []for i in range(20):if genome_set[i].fitness() <= lowest_fitness:genome_set[i].dead()if genome_set[i].alive == True:alive_genome.append(i)
for i in range(20):genome_result[times][i] = genome_set[i].gene[:]
operation_set = [""]*20while len(alive_genome) > 0:genome1 = random.choices(alive_genome)[0]genome2 = random.choices(alive_genome)[0]target_gene = random.randint(0, 4)tmp = genome_set[genome1].gene[target_gene]if genome1 == genome2:while tmp == genome_set[genome1].gene[target_gene]:genome_set[genome1].variant(target_gene)operation_set[genome1] = "m,"+str(target_gene+1)alive_genome.remove(genome1)else:genome_set[genome1].overlap(genome_set[genome2], target_gene)operation_set[genome1] = "c," + \str(genome2+1)+","+str(target_gene+1)operation_set[genome2] = "c," + \str(genome1+1)+","+str(target_gene+1)alive_genome.remove(genome1)alive_genome.remove(genome2)
operation_result[times] = operation_set[:]
for i in range(20):if genome_set[i].fitness() == highest_fitness:end_flag = True
for i in range(0, 20):for j in range(3, 23):for k in range(7, 12):sheet.cell((i*8)+k, j).value = genome_result[i][j-3][k-7]sheet.cell((i*8)+13, j).value = operation_result[i][j-3]
for i in range(0, 20):sheet.cell(i+12, 23).value = "=AVERAGE(C" + \str(12+i*8)+":V"+str(12+i*8)+")"sheet.cell(12+i, 24).value = "=MAX(C"+str(12+i*8)+":V"+str(12+i*8)+")"sheet.cell(165, i+3).value = ""
sheet.cell(168, 11).value = "遗传算法所找到的适应度值最大的染色体是"+str(optimal_genome)
chart = BarChart()data = Reference(sheet, min_row=12, max_row=31, min_col=23, max_col=23)chart.add_data(data)chart.title = "平均值"sheet.add_chart(chart, "K169")
chart1 = BarChart()data1 = Reference(sheet, min_row=12, max_row=31, min_col=24, max_col=24)chart1.add_data(data1)chart1.title = "最大值"sheet.add_chart(chart1, "Q169")
work_book.save("output.xlsx")