Reputation: 202
I have this code which I'm trying to do a local search with genetic algorithm. I wanna use this data to run through :
[0 : [3,2,1],
1 : [4],
2 : [6,5],
3 : [7],
4 : [8],
5 : [9]]
The idea is to be equal this graph (but with numbers instead of letters):
This is the code I have:
import random
stringSize = 4
top = 10 * stringSize
def value(s):
return max(-abs(round(0.3*top) - s), .025 - abs(round(0.8 * top) - s))
def ga(times = 10, popSize = 20, mutation_prob = 0.001):
#population = [int(random.random() * top) for j in range(popSize)]
population = [0[3,2,1],
1[4],
2[6,5],
3[7],
4[8],
5[9]]
print(len(population))
print("---")
history = []
for i in range(times):
fitness = [value(population[j]) for j in range(popSize)]
fitMax = -float('inf')
for j in range(popSize):
if fitness[j] > fitMax:
fitMax = fitness[j]
jBest = j
history.append(population[jBest])
fit_sum = sum(fitness)
probs = [x/fit_sum for x in fitness]
cutoff = [sum(probs[:j+1]) for j in range(popSize)]
children = []
for j in range(popSize):
r = random.random()
for k in range(popSize):
if r < cutoff[k]:
break
par1 = population[k-1]
par2 = population[int(random.random() * popSize)]
split = int(random.random() * (stringSize + 1))
child = str(par1)[:split] + str(par2)[split:]
if random.random() < mutation_prob:
where = int(random.random() * stringSize)
what = str(int(random.random() * 10))
child = child[0:where] + what + child[where + 1:]
children.append(int(child))
population = children
return population
But running it throws this error :
TypeError Traceback (most recent call last)
<ipython-input-34-73e983c9ab93> in <module>()
----> 1 ga()
<ipython-input-33-a504bbf614a5> in ga(times, popSize, mutation_prob)
4 def ga(times = 10, popSize = 20, mutation_prob = 0.001):
5 #population = [int(random.random() * top) for j in range(popSize)]
----> 6 population = [0[3,2,1],
7 1[4],
8 2[6,5],
TypeError: 'int' object is not subscriptable
What can I do to perform it? Am I do it right?
Upvotes: 0
Views: 476
Reputation: 982
Your array has a semantic error. E.g. 1[2]
is not valid python. If what you want to do is to map a number to an array of numbers, use a dictionary that indexes each list by key or an array of dictionaries with value and children attributes.
As other already pointed out, you could use a dictionary like this:
population = {
0: [1,2],
1: [3,4,5],
...
}
That error you got usually means you're trying to index an object that cannot be indexed.
Upvotes: 1
Reputation: 21
just use a dict:
population = {0:[3,2,1],
1:[4],
2:[6,5],
3:[7],
4:[8],
5:[9]}
Upvotes: 1