Skip to content

Instantly share code, notes, and snippets.

@ollybritton
Created February 20, 2017 19:33
Show Gist options
  • Save ollybritton/3248701a2dcc6280f19111c887164b5c to your computer and use it in GitHub Desktop.
Save ollybritton/3248701a2dcc6280f19111c887164b5c to your computer and use it in GitHub Desktop.
# coding=utf-8
""" A genetic algorithm to brew the perfect cup of tea. """
import numpy as np
import random, heapq, math
# Milk (1 = Lots), Sweeteners, Brew Time (In mins).
starting_teas = 10
adjectives = ["wonderous", "heroic", "bold", "daring", "epic", "fearless", "courageous", "grand", "gallent", "gusty", "nobel", "dauntless", "fire-eating", "dragon-slaying", "unafraid", "lion-hearted"]
nouns = ["brew", "tea", "cuppa", "cup", "blend", "drink", "mélange", "medley"]
teas = {}
def random_name():
return random.choice(adjectives) + " " + random.choice(nouns)
def random_milk(gen = 1, prev = 0):
# Start at 0.5**2 = 0.25
if(gen == 1):
return round(random.uniform(0.3, 0.9), 1)
else:
return prev + round(random.uniform(-(0.5**gen), 0.5**gen), gen)
def random_sweetners(gen = 1, prev = 0):
# Roughly 1 to 3.
if(gen == 1):
return round(random.uniform(1, 3), 0)
else:
return prev + round(random.uniform(-(0.5**gen), 0.5**gen), gen)
def random_brew_time(gen = 1, prev = 0):
# Roughly 2mins to 4mins
if(gen == 1):
return round(random.uniform(2, 4), 0)
else:
return prev + round(random.uniform(-(0.5**(gen-1)), 0.5**(gen-1)), (gen-1))
soft_random = {
"name": random_name,
"milk": random_milk,
"sweeteners": random_sweetners,
"brew_time": random_brew_time
}
base_tea = {
"brew_time": 0,
"milk": 0,
"sweeteners": 0,
"name": "",
"fitness": 0,
}
def create_base_teas():
for i in range(0, starting_teas):
curr = base_tea.copy()
curr["brew_time"] = soft_random["brew_time"]()
curr["milk"] = soft_random["milk"]()
curr["sweeteners"] = soft_random["sweeteners"]()
curr["name"] = soft_random["name"]()
teas[i] = curr
def evole_single_tea(index, gen):
curr = teas[index]
curr["brew_time"] = soft_random["brew_time"](gen, curr["brew_time"])
curr["milk"] = soft_random["milk"](gen, curr["milk"])
curr["sweeteners"] = soft_random["sweeteners"](gen, curr["sweeteners"])
def rank_tea(arr):
for i in range(0, len(teas)):
teas[i]["fitness"] = arr[i]
def selection():
teaCopy = teas.copy()
fitnesses = []
for i in range(0, len(teaCopy)):
fitnesses.append(teas[i]["fitness"])
print(fitnesses)
max_fitnesses_indicies = sorted(range(len(fitnesses)), key=lambda x: fitnesses[x])
print(max_fitnesses_indicies)
len_array = []
print(len_array)
for i in range(0, len(teas)):
len_array.append(i)
to_be_del = list( set(max_fitnesses_indicies) - set(len_array) )
print(to_be_del)
create_base_teas()
print(teas)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment