コード例 #1
0
    def calculate_adjacent_jitter(graph, u):
        """计算一个节点的jitter"""

        jitter_sum = 0
        for v in range(graph.number_of_nodes()):
            if u == v:
                pass
            else:
                path = Network.k_shortest_path(graph, u, v, 1)[0]
                jitter_sum += Evaluation.calculate_jitter(graph, path)
        return jitter_sum / (graph.number_of_nodes() - 1)
コード例 #2
0
    def cut_then_map(sub, req, node_map, algorithm_name):
        """求解链路映射问题"""

        link_map = {}
        sub_copy = copy.deepcopy(sub)
        for vLink in req.edges:
            vn_from, vn_to = vLink[0], vLink[1]
            resource = req[vn_from][vn_to]['bw']
            # 剪枝操作,先暂时将那些不满足当前待映射虚拟链路资源需求的底层链路删除
            sub_tmp = copy.deepcopy(sub_copy)
            sub_edges = []
            for sLink in sub_tmp.edges:
                sub_edges.append(sLink)
            for edge in sub_edges:
                sn_from, sn_to = edge[0], edge[1]
                if sub_tmp[sn_from][sn_to]['bw_remain'] <= resource:
                    sub_tmp.remove_edge(sn_from, sn_to)

            vdl = req.graph['delay']
            vjt = req.graph['jitter']
            vpl = req.graph['packetloss']
            k = Network.get_qos_class(req)

            # 在剪枝后的底层网络上寻找一条可映射的最短路径
            sn_from, sn_to = node_map[vn_from], node_map[vn_to]
            if nx.has_path(sub_tmp, source=sn_from, target=sn_to):
                for path in Network.k_shortest_path(sub_tmp, sn_from, sn_to,
                                                    1):
                    if algorithm_name == "MC":
                        sdl = Evaluation.calculate_delay(sub, path)
                        if sdl <= req.graph['delay']:
                            link_map.update({vLink: path})
                            # 这里的资源分配是暂时的
                            start = path[0]
                            for end in path[1:]:
                                bw_tmp = sub_copy[start][end][
                                    'bw_remain'] - resource
                                sub_copy[start][end]['bw_remain'] = round(
                                    bw_tmp, 6)
                                start = end
                            break
                        else:
                            continue
                    elif algorithm_name == "RLD":
                        sdl = Evaluation.calculate_delay(sub, path)
                        if sdl <= k * vdl:
                            link_map.update({vLink: path})
                            # 这里的资源分配是暂时的
                            start = path[0]
                            for end in path[1:]:
                                bw_tmp = sub_copy[start][end][
                                    'bw_remain'] - resource
                                sub_copy[start][end]['bw_remain'] = round(
                                    bw_tmp, 6)
                                start = end
                            break
                        else:
                            continue
                    elif algorithm_name == "RLJ":
                        sdl = Evaluation.calculate_delay(sub, path)
                        sjt = Evaluation.calculate_jitter(sub, path)
                        if sdl <= k * vdl and sjt <= k * vjt:
                            link_map.update({vLink: path})
                            # 这里的资源分配是暂时的
                            start = path[0]
                            for end in path[1:]:
                                bw_tmp = sub_copy[start][end][
                                    'bw_remain'] - resource
                                sub_copy[start][end]['bw_remain'] = round(
                                    bw_tmp, 6)
                                start = end
                            break
                        else:
                            continue
                    elif algorithm_name == "RLQ":
                        sdl = Evaluation.calculate_delay(sub, path)
                        sjt = Evaluation.calculate_jitter(sub, path)
                        spl = Evaluation.calculate_packet_loss(sub, path)
                        if sdl <= k * vdl and sjt <= k * vjt and spl <= k * vpl:
                            link_map.update({vLink: path})
                            # 这里的资源分配是暂时的
                            start = path[0]
                            for end in path[1:]:
                                bw_tmp = sub_copy[start][end][
                                    'bw_remain'] - resource
                                sub_copy[start][end]['bw_remain'] = round(
                                    bw_tmp, 6)
                                start = end
                            break
                        else:
                            continue

                else:
                    break
        # 返回链路映射集合
        return link_map