## Collective Intelligence (Segaran) – Chapter 5 – NoneType error

Been working through this excellent book when I stumbled upon the following error:

```File "optimization.py", line 163, in geneticoptimize
scores=[(costf(v),v) for v in pop]
File "dorm.py", line 42, in dormcost
for i in range(len(vec)):
TypeError: object of type 'NoneType' has no len()
```

After running the code on and before page 109. It took me a while to get to the bottom of it, so I thought I would share my findings. I did numerous searches on Google and eventually came across this posting, belonging to wentrue.

I had to translate it and found that the function mutate(vec) in genticoptimize has a “bug” in it. This “bug” (using the term very lightly) is because the condition to decide what to return appears to have a hole in it and sometimes nothing will be returned because the value being compared falls outside the criteria. To make live easy I simply added an else clause to the function and chose to return the first criteria result.

```	def mutate(vec):
i=random.randint(0,len(domain)-1)
if random.random()<0.5 and vec[i]>domain[i][0]:
return vec[0:i]+[vec[i]-step]+vec[i+1:]
elif vec[i]<domain[i][1]:
return vec[0:i]+[vec[i]+step]+vec[i+1:]
else:
return vec[0:i]+[vec[i]-step]+vec[i+1:]

```

Further to this I found on the errdata (search for page 109), for the book, a better way of running the code which is:

```s=optimize.randomoptimize(dorm.domain,dorm.dormcost)
dorm.printsolution(s)
dorm.dormcost(s)
r=optimize.geneticoptimize(dorm.domain,dorm.dormcost)
dorm.printsolution(r)
```

Thats it, back to having fun with the book. Hope this helps others.