import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import random
def size(n1,n2):
p_num = np.empty((n1, n2))
for i in range(n1):
for j in range(n2):
p_num[i][j] = random.randint(0, 1)
return p_num
def select(obj, n1, n2, p_num):
a = np.zeros(n1)
temp = []
s = []
p_num = np.array(p_num)
for i in range(n1):
for j in range(n2):
if j < n2/2:
a[i] += 2 ** (n2/2 - j - 1) * p_num[i,j]
else:
a[i] += 2 ** (n2-j) * 0.1 * p_num[i,j]
#print(a)
for i in a:
temp = np.append(temp,obj(i))
#print(temp)
b = np.argsort(temp)
for i in range(int(n1/2)):
s = np.append(s, b[i])
#print(s)
return s, temp[b[0]]
def cross(p_num, s, n1, n2):
temp = np.empty((n1, n2))
for i in range(len(s)):
temp[i] = p_num[int(s[i])]
#print(temp)
s1 = s
random.shuffle(s1)
for i in range(len(s1)):
if i / 2 != 0:
n = random.randint(0, n2)
for j in range(n):
index = random.randint(0, n2-1)
#print(index)
t1 = p_num[(int(s1[i])-1), index]
#print(t1)
t2 = p_num[int(s1[i]), index]
#print(t1,t2)
p_num[int(s[i-1]), index] = t2
p_num[int(s1[i]), index] = t1
temp[int(n1/2 + i -1)] = p_num[int(s[i-1])]
temp[int(n1/2 + i)] = p_num[int(s1[i])]
#print(temp)
return temp
def hete(p, m, n1, n2):
l = random.random()
i = random.randint(0, n1-1)
j = random.randint(0, n2-1)
if l < m:
#print('------------------------')
#print(i,j)
if p[i,j] == 1:
p[i,j] = 0
else:
p[i,j] = 1
return p
def main():
plt.ion()
n1 = 8; n2 = 18;
obj = lambda x : (x-50) ** 2 + 10
p = size(n1, n2)
e = 2000
for i in range(e):
s, r = select(obj, n1, n2, p)
p = cross(p, s, n1, n2)
#print(p)
p = hete(p, 0.8, n1, n2)
print(r)
if i == 0:
y_axis = r
plt.xlim(0, e)
plt.ylim(0, y_axis)
plt.scatter(i, r, c='b')
plt.pause(0.001)
plt.ioff()
plt.pause(0)
plt.show
if __name__ == '__main__':
main()
遗传算法python实现
最新推荐文章于 2023-06-24 22:59:03 发布