def run_full_flow(self, flow, energy_harvest=None, routing_algs=None): energy_harvest = energy_harvest or self.energy_harvest routing_algs = routing_algs or self.the_routing_algs can_sustain = [] el = copy.copy(self.energy_init) seg_pos = 0 for seg_idx in range(NUM_SEGMENTS): f = flow[seg_idx] ra = routing_algs[seg_pos] eh = energy_harvest[seg_idx] consume_energy = sc.consume_energy_calculation(f, ra) el = np.array(el) + np.array(eh) - np.array(consume_energy) can_sustain.append(False if any(v < 0 for v in el) else True) el = [ v if v > 0 else 0 for v in el ] el = self.battery_limit(el) seg_pos = 0 if seg_pos == NUM_SEGS_PERDAY - 1 else seg_pos + 1 return can_sustain
def step_3(self): """In this step the self.the_flow is set """ # Step 3: particle filter print "Step 3: particle filter" # Get the mean of flows in the previous step # mean_flows = [0] * NUM_SEGS_PERDAY # for i in range(len(self.flows_the_routing_algs)): # mean_flows[i % NUM_SEGS_PERDAY] += self.flows_the_routing_algs[i] # mean_flows = [ f / float(NUM_SEGMENTS / NUM_SEGS_PERDAY) for f in mean_flows ] self.the_flow = [ 0, 0, 0 ] mean_flows = [800, 200, 200] sigmas = [ f * 0.2 for f in mean_flows ] # Initialize flows = [ mean_flows ] * NUM_PARTICLES weights = [1.0 / NUM_PARTICLES] * NUM_PARTICLES # Resample flows = self.resample(flows, weights, sigmas) seg_idx = 0 seg_pos = 0 els = [ self.energy_init for i in range(NUM_PARTICLES) ] is_dead = [ False for i in range(NUM_PARTICLES) ] tmp_cnt = 0 while (1): print "*", eh = self.energy_harvest[seg_idx] for j in range(NUM_PARTICLES): flow = flows[j][seg_pos] ra = self.the_routing_algs[seg_pos] consume_energy = sc.consume_energy_calculation(flow, ra) els[j] = np.array(els[j]) + np.array(eh) - np.array(consume_energy) day_begin = seg_idx / NUM_SEGS_PERDAY day_end = seg_idx / NUM_SEGS_PERDAY + NUM_SEGS_PERDAY if self.in_two_sigma(self.energy_harvest[day_begin:day_end]): is_dead[j] = True if any(v < 0 for v in els[j]) else is_dead[j] else: tmp_cnt += 1 els[j] = [ v if v > 0 else 0 for v in els[j] ] els[j] = self.battery_limit(els[j]) seg_pos = 0 if seg_pos == NUM_SEGS_PERDAY - 1 else seg_pos + 1 seg_idx = 0 if seg_idx == NUM_SEGMENTS - 1 else seg_idx + 1 if seg_idx == 0: print '' print print 'Count: ' + str(tmp_cnt) tmp_cnt = 0 print np.mean(flows, axis = 0), print ' ', print np.std(flows, axis = 0) #print el_mean best_sum = 0 best_flow = [] best_flow_idx = -1 d_cnt = 0 for f, d, k in zip(flows, is_dead, range(len(flows))): if sum(f) > best_sum and not d: best_sum = sum(f) best_flow = f best_flow_idx = k elif d: d_cnt += 1 print "dead: " + str(d_cnt) print best_flow_idx, print best_sum, print best_flow if sum(best_flow) > 0 and np.abs(sum(self.the_flow) - sum(best_flow)) < 1: break else: self.the_flow = best_flow els = [ self.energy_init for i in range(NUM_PARTICLES) ] weights = self.assign_weight(is_dead, flows) is_dead = [ False for i in range(NUM_PARTICLES) ] flows = self.resample(flows, weights, sigmas)