Пример #1
0
 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
Пример #2
0
    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)