Exemple #1
0
class OML(object):
    def __init__(self, output_path = False, **kwargs):
        self.net = RandomAdHocNetwork(**kwargs)
        self.output_path = output_path
    def run(self):
        if self.net.connected:
            self.all_requests = list(self.net.requests)
            self.remaining_requests = list(self.net.requests)
            self.satisfied_requests = []
            self.request_solutions = []
            self.c = 1000
            self.lmbda = 10000
            net_prime = None
            net_double_prime = None
            total_energy = 0
            while self.remaining_requests:
                request = self.remaining_requests.pop()
                src, dest = request 

                # Step 1

                if net_prime is None:
                    net_prime = self.net.copy()
                net_prime.prune_edges()
                try:
                    p_prime = net_prime.shortest_path(src, dest, weight="cost")
                except NetworkXNoPath:
                    print "Cannot satisfy request: {} -> {}".format(src, dest)
                    break

                min_edge, min_re = net_prime.min_residual_energy(p_prime)
                min_src, min_dest = min_edge
        
                net_double_prime = net_prime.copy()
                net_double_prime.prune_edges(min_re)

                # Step 2

                for edge_src, edge_dest in net_double_prime.edges():
                    w_double_prime = self._w_double_prime(net_double_prime, edge_src, edge_dest, min_re)
                    net_double_prime.set_weight(edge_src, edge_dest, w_double_prime)
                try:
                    p_double_prime = net_double_prime.shortest_path(src, dest, weight="weight")
                except NetworkXNoPath:
                    print "Cannot satisfy request on net_double_prime: {} -> {}".format(src, dest)
                    break

                net_double_prime.update_along_path(p_double_prime)
                path_total_energy = net_prime.update_along_path(p_double_prime)
                total_energy += path_total_energy

                self.satisfied_requests.append((src, dest))
                self.request_solutions.append(((src, dest), p_double_prime, path_total_energy))

            if self.request_solutions:
                print "Satisfied requests:"
            for request, path, energy in self.request_solutions:
                print
                print "Request: {} -> {}".format(request[0], request[1])
                if self.output_path is True:
                    print "Path: {}".format(" -> ".join(path))
                print "Energy Consumed: {}".format(energy)
            
            #self.net.draw(requests=self.satisfied_requests)
            print
            print "**************************************************************************************"
            print "Total Requests Satisfied: {}".format(len(self.satisfied_requests))
            print "Total Energy Consumed: {}".format(total_energy)

    def _e_min(self, net, node):
        min_node = min(net[node], key=lambda dest: net.weight(node, dest))
        return net.weight(node, min_node)

    def _alpha(self, net, node, min_re):
        return float(min_re) / net.get_energy(node)

    def _rho(self, net, src, dest):
        if net.get_energy(src) - net.weight(src, dest) > self._e_min(net, src):
            return 0
        else:
            return self.c

    def _w_double_prime(self, net, src, dest, min_re):
        if net[src][dest]["type"] == "external":
            value = net.weight(src, dest) + self._rho(net, src, dest)
            alpha = self._alpha(net, src, min_re)
            weight = (self.lmbda**alpha - 1)
            return value * weight
        else:
            return net.weight(src, dest)

    def draw(self, output_file=None, requests=None):
        if self.net.connected:
            if requests is None:
                requests = self.satisfied_requests
            self.net.draw(output_file=output_file, requests=requests)
Exemple #2
0
class MECBE(object):
    def __init__(self, output_path = False, **kwargs):
        self.net = RandomAdHocNetwork(**kwargs)
        self.output_path = output_path
    def run(self):
        if self.net.connected:
            self.all_requests = list(self.net.requests)
            self.remaining_requests = list(self.net.requests)
            self.satisfied_requests = []
            self.request_solutions = []
            total_energy = 0
            net_prime = self.net.copy()
            while self.remaining_requests:
                net_prime.prune_edges()
                request = self.remaining_requests.pop()
                src, dest = request 

                try:
                    minimum_path = self.minimum_metric_path(net_prime, src, dest)
                except NetworkXNoPath:
                    print "Stopping, cannot satisfy request: {} -> {}".format(src, dest)
                    break

                request_energy = net_prime.update_along_path(minimum_path)

                self.satisfied_requests.append((src, dest))
                self.request_solutions.append(((src, dest), minimum_path, request_energy))

                total_energy += request_energy

            if self.request_solutions:
                print "Satisfied requests:"
            for request, path, energy in self.request_solutions:
                print
                if self.output_path is True:
                    print "Path: {}".format(" -> ".join(path))
                print "Request {} -> {}".format(request[0], request[1])
                print "Energy Consumed: {}".format(energy)
     
            #self.net.draw(requests=self.satisfied_requests)
            print
            print "**************************************************************************************"
            print "Total Requests Satisfied: {}".format(len(self.satisfied_requests))
            print "Total Energy Consumed: {}".format(total_energy)

    def minimum_metric_path(self, net, src, dest):
        for edge in net.edges():
            temp_src, temp_dest = edge
            if net[temp_src][temp_dest]["type"] == "external":
                net[temp_src][temp_dest]["metric"] = 1/net.node[temp_src]["energy"]
            else:
                net[temp_src][temp_dest]["metric"] = 0

        shortest_path = net.shortest_path(src, dest, weight="metric")

        return shortest_path

    def draw(self, output_file=None, requests=None):
        if self.net.connected:
            if requests is None:
                requests = self.satisfied_requests
            self.net.draw(output_file=output_file, requests=requests)