예제 #1
0
def reward(g: nx.MultiGraph, edge: Tuple[int, int], const_amt: int, fee_type: str, fee: int = None) -> int:
    # debugging
    # print_flag = fee is not None

    u, v = edge
    if fee is not None:
        g.update_fee(u, v, fee, fee_type)
    else:
        fee = getattr(g.get_policy(u, v), fee_type)

    ebc = edge_betweenness(g, const_amt)[edge]

    # debugging
    # if print_flag:
    #     print('({:>3d}, {:>3d})  fee {:>9d}  ebc {:>9f}  '.format(
    #         u, v, fee, ebc), end='')

    return fee * ebc
예제 #2
0
def build_node(g: nx.MultiGraph, new_node: int, n: int, const_amt: int, fee_type: str) -> List:

    selected = []

    # 2 initial edges so routes can pass through new node
    while len(selected) < n:
        max_reward = 0
        best_channel = None

        # try all channels
        for node in g.nodes():
            if node == new_node or node in g[new_node]:
                continue

            # create new channel
            g.add_edge_with_init(new_node, node, default=True)
            # calculate max reward
            reward, fee = maximise_fee(
                g, (new_node, node), const_amt, fee_type)

            # select channel if highest reward
            if max_reward <= reward:
                max_reward = reward
                best_channel = (node, fee)

            # reset graph for next channel
            g.remove_edge(new_node, node)

        if best_channel is None:
            raise Exception('Profit not possible.')

        # add selected channel and redo for next channel
        selected.append((new_node, best_channel[0], best_channel[1]))

        g.add_edge_with_init(new_node, best_channel[0], default=True)
        g.update_fee(new_node, best_channel[0], best_channel[1], fee_type)

    # return node with selected channels
    return selected