1 import random
2 from PIL import Image
3 from copy import deepcopy
4
5
6 img_chrome = Image.open('chrome.png')
7 h_chrome = img_chrome.size[1]
8 w_chrome = img_chrome.size[0]
9
10
11 img = Image.open('test1.png')
12 h = img.size[1]
13 w = img.size[0]
14
15
16 img_color = []
17 img_color_chrome = []
18
19
20 def info_pic(): # 获取图片信息
21
22 for x in range(w):
23
24 img_color_tmp = [] # 先获得每一列rgb信息
25 for y in range(h):
26
27 r, g, b = img.getpixel((x, y))[:3]
28 # print(r,g,b)
29 img_color_tmp.append([r, g, b])
30 img_color.append(img_color_tmp)
31
32 print(img_color)
33 print(img.size)
34 return img_color, img.size
35
36
37 def info_chrome(): # 获取图片信息
38
39 for x in range(w_chrome):
40
41 img_color_tmp = [] # 先获得每一列rgb信息
42 for y in range(h_chrome):
43
44 r, g, b = img_chrome.getpixel((x, y))[:3]
45 # print(r,g,b)
46 img_color_tmp.append([r, g, b])
47 img_color_chrome.append(img_color_tmp)
48
49 # print(img_color_chrome)
50 print(img_chrome.size)
51 return img_color_chrome, img_chrome.size
52
53
54 # info_chrome()
55 # print(img_color_chrome[10][10][0])
56
57 population = []
58
59
60 def initial_population(number=300): # 编码
61
62 for i in range(number):
63 chromosome = []
64 for x in range(w):
65 row = []
66 for y in range(h):
67 r = random.randint(0, 255)
68 g = random.randint(0, 255)
69 b = random.randint(0, 255)
70 row.append([r, g, b])
71 chromosome.append(row)
72 population.append(chromosome)
73 print("随机基因初始化完成")
74 return population
75
76 # initial_population()
77 # info_chrome()
78
79
80 def fitness(chromosome): # 计算适应度函数
81 print("开始处理基因")
82
83 diff = 0
84 # for index1, item1 in enumerate(population):
85
86 for index2, item2 in enumerate(chromosome): # chromosome , index2表示图片的第几列
87
88 for index3, item3 in enumerate(item2): # row,index3表示某一列的第几行
89
90 for index4, item4 in enumerate(item3): # 像素值,index4表示rgb的位置
91
92
93 diff += abs(img_color_chrome[index2][index3][index4]-item4)
94 print(diff)
95 return diff
96
97 def population_fitness(population):
98 for index1, item1 in enumerate(population):
99 fitness(item1)
100
101
102 # fitness(population[1])
103
104 class ga(object):
105 def __init__(self,population):
106 pass
107
108 def evolution(self, retain_rate=0.3, random_select_rate=0.5, mutation_rate=0.01):
109 """
110 对当前种群依次进行选择、交叉并生成新一代种群,然后对新一代种群进行变异
111 """
112 parents = self.selection(retain_rate, random_select_rate)
113 self.crossover(parents)
114 self.mutation(mutation_rate)
115
116 def selection(self, retain_rate, random_select_rate):
117 graded = [(fitness(chromosome), chromosome) for chromosome in population]
118 sort = [x[1] for x in sorted(graded)] # 正向排序
119 retain_length = int(len(sort) * retain_rate)
120 # 选出适应性强的个体,精英选择
121 parents = sort[:retain_length]
122 for chromosome in sort[retain_length:]:
123 if random.random() < random_select_rate:
124 parents.append(chromosome)
125 return parents
126
127 def crossover(self, parents,population): # 交叉
128 children = []
129 # 需要繁殖的子代数量
130 target_number = len(population) - len(parents)
131 # 开始繁殖
132 while len(children) < target_number:
133 father = random.randint(0, len(parents) - 1) # 选择交叉父代
134 mother = random.randint(0, len(parents) - 1) # 选择交叉母代
135 if father != mother:
136 # 随机选取交叉点
137 cross_point_x = random.randint(0, w)
138 cross_point_y = random.randint(0, h)
139
140 new_gene = deepcopy(population[father][0][:cross_point_x])
141 new_gene = [new_gene, 0]
142 new_gene[0][cross_point_x:] = deepcopy(population[mother][0][cross_point_x:])
143 new_gene[0][cross_point_x][:cross_point_y] = deepcopy(population[father][0][cross_point_x][:cross_point_y])
144 children.append(new_gene)
145 # 经过繁殖后,孩子和父母的数量与原始种群数量相等,在这里可以更新种群。
146 population = parents + children
147
148 def variation(genes, size):
149 rate = 0.5
150 print("开始变异")
151 for i, gene in enumerate(genes):
152 for x, row in enumerate(gene[0]):
153 for y, col in enumerate(row):
154 if random.randint(1, 100) / 100 <= rate:
155 # 图片由 r g b 三种颜色混合而成 变异就是改变他们的值
156 # a b c 分别对应 r_ g_ b_ 改变的值 可自行修改
157 # r g b 的最大值为255
158 # ------------------------------请修改这里-------------------------------------#
159 a = [-1, 1][random.randint(0, 1)] * random.randint(3, 10)
160 b = [-1, 1][random.randint(0, 1)] * random.randint(3, 10)
161 c = [-1, 1][random.randint(0, 1)] * random.randint(3, 10)
162 # ------------------------------请修改这里-------------------------------------#
163 genes[i][0][x][y][0] += a
164 genes[i][0][x][y][0] += b
165 genes[i][0][x][y][0] += c
166 genes[i][0][x][y][3] += a + b + c
167 print("变异结束")
168
169 def result(self):
170 '''
171 获得近优值
172 '''
173 graded = [(self.fitness_function(chromosome), chromosome) for chromosome in self.population]
174 graded = [x[1] for x in sorted(graded, reverse=True)]
175 # print('近优的x值为:', self.decode(graded[0]),
176 # '近优的y值为:', self.fitness_function(graded[0]))
177 # 将每一步迭代的结果存储到列表中
178 y_label.append(self.fitness_function(graded[0]))
179 return self.decode(graded[0])
180
181 def iteration(self, iter_number):
182 for i in range(iter_number):
183 self.evolution()
184 self.result()
185 x_label.append(i)