-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathShakespeare-Monkey-Algorithm.py
More file actions
85 lines (78 loc) · 2.17 KB
/
Shakespeare-Monkey-Algorithm.py
File metadata and controls
85 lines (78 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import sys
import random
import os
data = {}
pop =0
char="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
mutationrate = 0.1
sys.setrecursionlimit(10000)
#Population
def population(data,userdata):
global pop
pop+=1
for j in range(random.randint(0,1000)):
text=""
for i in range(0,len(userdata)):
text+=char[random.randint(0,len(char)-1)]
data[text]=0
fitness(data,userdata)
#print(population())
#Fitness
def fitness(data,userdata):
st = []
for key in data.items():
st.append(key[0])
fit = []
for i in range(len(data)):
fit.append(0)
for i in range(len(data)):
t=c=0
for j in range(len(st[i])):
if st[i][j] == userdata[j]:
t = t + 1
if st[i].count(st[i][j]) == userdata.count(userdata[j]):
c = c + 1
c = c / st[i].count(st[i][j])
t = t / len(st[i])
fit[i] = fit[i] + t + c
for i in range(len(fit)):
data[st[i]]=fit[i]
crossover(data,userdata)
#Crossover
def crossover(data,userdata):
global mutationrate,pop,char
d = data
data = sorted(data.items(),key=lambda x:x[1],reverse=True)
if(data[0][0]==userdata):
print(data[0][0])
return data[0][0]
else:
mutation = []
for i in range(int(mutationrate * 100)):
mutation.append(1)
for i in range(int(100 - mutationrate * 100)):
mutation.append(0)
m = random.choice(mutation)
child = ""
l = []
for i in range(pop):
for j in range(int(data[i][1] * 10)):
l.append(data[i][0])
#print(l)
c1 = random.choice(l)
c2 = random.choice(l)
child = c1[int(len(c1) / 2):] + c2[-(int(len(c2) / 2)):]
child = list(child)
if m == 1:
child[random.randint(0, len(child) - 1)] = random.choice(char)
child = ''.join(child)
print(str(data[0][0])+"-pop:"+str(pop))
if (child != userdata):
d[child] = 0
data = d
population(data, userdata)
else:
print("done")
return child
userdata = "RAAJ"
population(data,userdata)