Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import os
- import sys
- # hours_per_time_step should be greater than 1
- hours_per_step = 2
- class PainModel():
- def __init__(self, seed):
- # pain -1 is bad
- # pain 1 is good
- self.pain = 0
- # initial start point for date -
- # TODO - make this random according to what weather data that you have
- self.datetime = 0
- # use random state so that it is repeatable
- self.random_state = np.random.RandomState(seed)
- self.precipitation_options = ['rain', 'sunny', 'snow', 'fog']
- self.activity_options = ['sleep', 'exercise', 'work', 'stressful', 'leisure']
- self.last_activities = []
- def step(activity):
- # activity is string matching one of 'activity_options'
- assert activity in self.activity_options
- recent_activities = self.activity_options[:max(self.hist_len, 24/hours_per_step)]
- hist_len = len(self.last_activities)
- if activity == 'sleep':
- self.pain-=.01
- if activity == 'exercise':
- self.pain-=.1
- # if you exercise too often, you may get hurt
- if 'exercise' in recent_activities:
- self.pain+=0.5
- if activity == 'work':
- self.pain+=.01
- if activity == 'stressful':
- self.pain+=0.5
- if activity == 'leisure':
- self.pain-=.01
- sleep_instances = [x if x=='sleep' for x in recent_activities]
- # reward getting 8 hours of sleep per night
- if 7/float(hours_per_step) < len(sleep_instances) < 12/float(hours_per_step):
- self.pain+=0.1
- # determine what the state was when this was experienced
- self.pain = np.clip(self.pain, -1, 1)
- self.state = [self.pain, self.datetime, self.get_precipitation()]
- # todo - turn datetime into day of week, workdayornot
- # state = [self.datetim, self.get_precipitation(), self.get_temperature(), day_of_week, day_of_year, workday_or_holiday]
- # update datetime to prepare for next step
- self.datetime += hours_per_step
- self.last_activities.append(activity)
- # prevent pain from going outside bounds
- return self.state
- def get_day_of_week(self):
- # todo - find according to datetime in python
- return 0
- def get_precipitation(self):
- # todo - find according to datetime
- return self.random_state.randint(0,len(self.precipitation_options))
- def generate_perfect_person():
- pain_model = PainModel(seed=103)
- stressful_random_state = np.random.RandomState(3949)
- sleep_random_state = np.random.RandomState(949)
- states = []
- for workday in [0, 1, 1, 1, 1, 1, 0]:
- if workday:
- # is time step is 2 and day restarts at midnight
- # 0-2
- if sleep_random_state.rand() < 0.95:
- states.append(pain_model('sleep'))
- else:
- states.append(pain_model('leisure'))
- # 2-4
- if sleep_random_state.rand() < 0.98:
- states.append(pain_model('sleep'))
- else:
- states.append(pain_model('stressful'))
- # 4-6
- if sleep_random_state.rand() < 0.98:
- states.append(pain_model('sleep'))
- else:
- states.append(pain_model('stressful'))
- # 6-8
- if sleep_random_state.rand() < 0.85:
- states.append(pain_model('sleep'))
- else:
- states.append(pain_model('exercise'))
- # 8-4
- for i in range(4):
- if stressful_random_state.rand()<0.95:
- states.append(pain_model('work'))
- else:
- states.append(pain_model('stressful'))
- # 4-12
- for i in range(4):
- afw = stressful_random_state.rand()
- if afw < 0.1:
- states.append(pain_model('stressful'))
- if afw < 0.2:
- states.append(pain_model('exercise'))
- elif < 0.95:
- states.append(pain_model('leisure'))
- else:
- states.append(pain_model('sleep'))
- else:
- # yay it is the weekend
- # is time step is 2 and day restarts at midnight
- for i in range(4):
- # sleep in on the weekend
- states.append(pain_model('sleep'))
- for i in range(7):
- states.append(pain_model('leisure'))
- states.append(pain_model('sleep'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement