【数据结构 课程设计】识别结点(node) 故障和边缘(edge)故障中的网络断层扫描

题目:识别结点(node) 故障和边缘(edge)故障中的网络断层扫描

介绍

构造随机连接网络用于网络分析,你可能要考虑: number of nodes (节点的数量), number of edge (边的数量),number of neighbor (邻居的数量), the size of network (网络的大小)可能会影响您的分析。

提示

  1. 你对网络是“盲”的,假设你只能观察到 boundary node (边界节点), 你也许需要一些其他假设。
  2. 找到网络的boundarie (边界), 因为往往将探针/探测器(probe) 从一些边界节点传送到另一些边界节点(boundaries nodes)是最好的办法。
  3. 如何建立网络模型?
    (1)一个延时小的边(edge) , 设1 unit of time (一单位) ; 一条延时大的边(edge), 设9999 units of time (9999单位)
    (2)一个失败的/故障的节点(node) 也许会导致连接到该节点的所有的边(edge) 都
    出现很大的延迟
  4. 你只允许发送探针/探测器(probe) ,一旦接受到探针,就知道探针的路径了。因此,你可能希望在发送探针时使用随机路径,在经过一定数量的观察后,如果没有任何的边缘故障或者节点故障,你应该能够“猜测”网络拓扑。
  5. 考虑最简单的情况,网络中只有一条边 (edge)存在较大的延迟,平均需要发送多少个探针?你可以一直发送探针知道你能识别到边(edge) ; 或者您 可以根据您的观察设置探针数量 (number of probe)的上线,思考您猜测的边(edge) 与实际的边 (edge)有多远?
  6. 自己问问题,从更多的分析(从不同角度)而不是仅仅是我所描述的最简单的情况和解决方法。
  7. 从准确性,复杂性,需要发送的探针数 量或任何你能想到的方面对算法进行基准测试。

允许使用的包:

  • numpy
  • matplotlib
  • pandas
  • sklearn
  • network
  • scipy
  • default packages(比如math, random…)

代码如下

main.py

生成一个固定节点数、连接率为某一值的连通性网络;并且将和网络有关的信息存储至xml文件中。

import random
import networkx as nx
import matplotlib.pylab as plt

from methods import *

print('Number of node in ER rangom network is 30, The probability of connection is 0.2')  # ER随机网络中的节点数为30.连接概率为0.2
NETWORK_SIZE = 30  # 网络节点数为30
p = 0.6  # 连接概率为0.2
boundary = 2  # 小于2默认为边界点
edgewidth = random.uniform(0, 1) * 10  # 生成随机数
edge_widths = []  # 存放权重边的集合
G = nx.erdos_renyi_graph(n=NETWORK_SIZE, p=p)
# 用erdos_renyi_graph(n,p)方法生成一个含有n个节点、以概率p连接的ER随机图
nodes_list = list(G.nodes())  # 转成list便于操作
edges_list = list(G.edges())
for i in range(0, len(edges_list)):
    # edge_widths.append(edgewidth)
    edge_widths.append(random.uniform(0, 1) * 10)

boundary_node_list = []
ps = nx.spring_layout(G)
print(edges_list[0])  # 输出第一个连通的结点
print("nodes:", G.nodes())
print("edges:", G.edges())
print("edge_widths:", edge_widths)

print(len(G.edges))
print(len(edge_widths))

# 1
for node in G.nodes():
    i = 0
    for edge in [data[0] for data in edges_list]:
        if node == edge:
            i = i + 1
    if i < boundary:
        boundary_node_list.append(node)
print("boundary_node:", boundary_node_list)

# 2
network = [[0] * 30 for i in range(30)]
hang = [data[0] for data in G.edges()]
print(hang)
print(len(hang))
lie = [data[1] for data in G.edges()]
print(lie)
print(len(lie))
i = 0
j = 0
k = 0
for obj in range(len(edge_widths)):
    temp1 = hang[i]
    temp2 = lie[j]
    network[temp1][temp2] = edge_widths[k]
    i = i + 1
    j = j + 1
    k = k + 1

print(network)

# 4
colors_node = Dijkstra(network, 1, 12)
p = 0
print("colors_node", colors_node)
print("nodes_list",nodes_list)
aaa=['']*30
bbb=['']*len(edges_list)
for i in range(0, len(nodes_list)):

    # print("p:",p)
    # print(colors_node[p])
    if (i == colors_node[p]):
        if (p < len(colors_node)-1):
            # print('执行')
            p = p + 1
        aaa[i] = 'r'
    else:
        aaa[i] = 'y'

colors_edge = []
for i in range(0,len(edges_list)):
    bbb[i]='black'
# nx.draw(G, ps, width=1.0, node_size=10)  # 绘制边的宽度为0.6,节点尺寸为10的网络G图
nx.draw(G,pos=ps,with_labels=True,node_color=aaa,edge_color=bbb)


plt.savefig('fig.png', bbox_inches='tight')  # 将图像存为一个png格式的图片文件
plt.show()  # 在窗口中显示这幅图像
nx.write_gexf(G, 'suiji_file.gexf')  # 此图写成.gexf格式

红色结点为探针,连通性与可达性在suiji_file.gexf中可以得出。

在这里插入图片描述

methods.py

import os
import sys
import random

def Dijkstra(network, s, d):  # 迪杰斯特拉算法算s-d的最短路径,并返回该路径和值
    print("Start Dijstra Path……")
    path = []  # 用来存储s-d的最短路径
    n = len(network)  # 邻接矩阵维度,即节点个数
    fmax = float('inf')
    w = [[0 for _ in range(n)] for j in range(n)]  # 邻接矩阵转化成维度矩阵,即0→max

    book = [0 for _ in range(n)]  # 是否已经是最小的标记列表
    dis = [fmax for i in range(n)]  # s到其他节点的最小距离
    book[s - 1] = 1  # 节点编号从1开始,列表序号从0开始
    midpath = [-1 for i in range(n)]  # 上一跳列表
    for i in range(n):
      for j in range(n):
        if network[i][j] != 0:
          w[i][j] = network[i][j]  # 0→max
        else:
          w[i][j] = fmax
        if i == s - 1 and network[i][j] != 0:  # 直连的节点最小距离就是network[i][j]
          dis[j] = network[i][j]
    for i in range(n - 1):  # n-1次遍历,除了s节点
      min = fmax
      for j in range(n):
        if book[j] == 0 and dis[j] < min:  # 如果未遍历且距离最小
          min = dis[j]
          u = j
      book[u] = 1
      for v in range(n):  # u直连的节点遍历一遍
        if dis[v] > dis[u] + w[u][v]:
          dis[v] = dis[u] + w[u][v]
          midpath[v] = u + 1  # 上一跳更新
    j = d - 1  # j是序号
    path.append(d)  # 因为存储的是上一跳,所以先加入目的节点d,最后倒置
    while (midpath[j] != -1):
      path.append(midpath[j])
      j = midpath[j] - 1
    path.append(s)
    path.reverse()  # 倒置列表
    print("path:",path)
    # print(midpath)
    print("dis:",dis)
    return path

suiji_file.gexf

生成图片的 .gexf文件如下:

<?xml version='1.0' encoding='utf-8'?>
<gexf xmlns="http://www.gexf.net/1.2draft" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gexf.net/1.2draft http://www.gexf.net/1.2draft/gexf.xsd" version="1.2">
  <meta lastmodifieddate="2021-11-06">
    <creator>NetworkX 2.5</creator>
  </meta>
  <graph defaultedgetype="undirected" mode="static" name="">
    <nodes>
      <node id="0" label="0" />
      <node id="1" label="1" />
      <node id="2" label="2" />
      <node id="3" label="3" />
      <node id="4" label="4" />
      <node id="5" label="5" />
      <node id="6" label="6" />
      <node id="7" label="7" />
      <node id="8" label="8" />
      <node id="9" label="9" />
      <node id="10" label="10" />
      <node id="11" label="11" />
      <node id="12" label="12" />
      <node id="13" label="13" />
      <node id="14" label="14" />
      <node id="15" label="15" />
      <node id="16" label="16" />
      <node id="17" label="17" />
      <node id="18" label="18" />
      <node id="19" label="19" />
      <node id="20" label="20" />
      <node id="21" label="21" />
      <node id="22" label="22" />
      <node id="23" label="23" />
      <node id="24" label="24" />
      <node id="25" label="25" />
      <node id="26" label="26" />
      <node id="27" label="27" />
      <node id="28" label="28" />
      <node id="29" label="29" />
    </nodes>
    <edges>
      <edge source="0" target="1" id="0" />
      <edge source="0" target="4" id="1" />
      <edge source="0" target="5" id="2" />
      <edge source="0" target="6" id="3" />
      <edge source="0" target="8" id="4" />
      <edge source="0" target="10" id="5" />
      <edge source="0" target="11" id="6" />
      <edge source="0" target="12" id="7" />
      <edge source="0" target="14" id="8" />
      <edge source="0" target="15" id="9" />
      <edge source="0" target="16" id="10" />
      <edge source="0" target="18" id="11" />
      <edge source="0" target="19" id="12" />
      <edge source="0" target="22" id="13" />
      <edge source="0" target="23" id="14" />
      <edge source="0" target="25" id="15" />
      <edge source="0" target="26" id="16" />
      <edge source="0" target="28" id="17" />
      <edge source="0" target="29" id="18" />
      <edge source="1" target="3" id="19" />
      <edge source="1" target="7" id="20" />
      <edge source="1" target="8" id="21" />
      <edge source="1" target="10" id="22" />
      <edge source="1" target="12" id="23" />
      <edge source="1" target="14" id="24" />
      <edge source="1" target="15" id="25" />
      <edge source="1" target="16" id="26" />
      <edge source="1" target="17" id="27" />
      <edge source="1" target="18" id="28" />
      <edge source="1" target="20" id="29" />
      <edge source="1" target="21" id="30" />
      <edge source="1" target="22" id="31" />
      <edge source="1" target="23" id="32" />
      <edge source="1" target="24" id="33" />
      <edge source="1" target="25" id="34" />
      <edge source="1" target="26" id="35" />
      <edge source="1" target="28" id="36" />
      <edge source="1" target="29" id="37" />
      <edge source="2" target="5" id="38" />
      <edge source="2" target="6" id="39" />
      <edge source="2" target="7" id="40" />
      <edge source="2" target="8" id="41" />
      <edge source="2" target="10" id="42" />
      <edge source="2" target="12" id="43" />
      <edge source="2" target="13" id="44" />
      <edge source="2" target="14" id="45" />
      <edge source="2" target="15" id="46" />
      <edge source="2" target="16" id="47" />
      <edge source="2" target="17" id="48" />
      <edge source="2" target="18" id="49" />
      <edge source="2" target="20" id="50" />
      <edge source="2" target="21" id="51" />
      <edge source="2" target="22" id="52" />
      <edge source="2" target="24" id="53" />
      <edge source="2" target="25" id="54" />
      <edge source="2" target="28" id="55" />
      <edge source="3" target="5" id="56" />
      <edge source="3" target="7" id="57" />
      <edge source="3" target="9" id="58" />
      <edge source="3" target="10" id="59" />
      <edge source="3" target="11" id="60" />
      <edge source="3" target="12" id="61" />
      <edge source="3" target="13" id="62" />
      <edge source="3" target="14" id="63" />
      <edge source="3" target="15" id="64" />
      <edge source="3" target="16" id="65" />
      <edge source="3" target="18" id="66" />
      <edge source="3" target="20" id="67" />
      <edge source="3" target="22" id="68" />
      <edge source="3" target="23" id="69" />
      <edge source="3" target="24" id="70" />
      <edge source="3" target="27" id="71" />
      <edge source="4" target="5" id="72" />
      <edge source="4" target="6" id="73" />
      <edge source="4" target="7" id="74" />
      <edge source="4" target="8" id="75" />
      <edge source="4" target="10" id="76" />
      <edge source="4" target="12" id="77" />
      <edge source="4" target="13" id="78" />
      <edge source="4" target="14" id="79" />
      <edge source="4" target="16" id="80" />
      <edge source="4" target="18" id="81" />
      <edge source="4" target="19" id="82" />
      <edge source="4" target="20" id="83" />
      <edge source="4" target="24" id="84" />
      <edge source="4" target="25" id="85" />
      <edge source="4" target="27" id="86" />
      <edge source="4" target="29" id="87" />
      <edge source="5" target="8" id="88" />
      <edge source="5" target="9" id="89" />
      <edge source="5" target="11" id="90" />
      <edge source="5" target="12" id="91" />
      <edge source="5" target="13" id="92" />
      <edge source="5" target="16" id="93" />
      <edge source="5" target="17" id="94" />
      <edge source="5" target="18" id="95" />
      <edge source="5" target="20" id="96" />
      <edge source="5" target="21" id="97" />
      <edge source="5" target="22" id="98" />
      <edge source="5" target="25" id="99" />
      <edge source="5" target="27" id="100" />
      <edge source="5" target="28" id="101" />
      <edge source="5" target="29" id="102" />
      <edge source="6" target="8" id="103" />
      <edge source="6" target="10" id="104" />
      <edge source="6" target="13" id="105" />
      <edge source="6" target="15" id="106" />
      <edge source="6" target="16" id="107" />
      <edge source="6" target="18" id="108" />
      <edge source="6" target="20" id="109" />
      <edge source="6" target="21" id="110" />
      <edge source="6" target="23" id="111" />
      <edge source="6" target="25" id="112" />
      <edge source="6" target="27" id="113" />
      <edge source="6" target="28" id="114" />
      <edge source="6" target="29" id="115" />
      <edge source="7" target="9" id="116" />
      <edge source="7" target="10" id="117" />
      <edge source="7" target="13" id="118" />
      <edge source="7" target="14" id="119" />
      <edge source="7" target="16" id="120" />
      <edge source="7" target="18" id="121" />
      <edge source="7" target="19" id="122" />
      <edge source="7" target="20" id="123" />
      <edge source="7" target="21" id="124" />
      <edge source="7" target="22" id="125" />
      <edge source="7" target="23" id="126" />
      <edge source="7" target="25" id="127" />
      <edge source="7" target="26" id="128" />
      <edge source="7" target="28" id="129" />
      <edge source="7" target="29" id="130" />
      <edge source="8" target="9" id="131" />
      <edge source="8" target="11" id="132" />
      <edge source="8" target="14" id="133" />
      <edge source="8" target="15" id="134" />
      <edge source="8" target="17" id="135" />
      <edge source="8" target="18" id="136" />
      <edge source="8" target="19" id="137" />
      <edge source="8" target="21" id="138" />
      <edge source="8" target="23" id="139" />
      <edge source="8" target="24" id="140" />
      <edge source="8" target="26" id="141" />
      <edge source="8" target="27" id="142" />
      <edge source="8" target="29" id="143" />
      <edge source="9" target="10" id="144" />
      <edge source="9" target="14" id="145" />
      <edge source="9" target="16" id="146" />
      <edge source="9" target="18" id="147" />
      <edge source="9" target="19" id="148" />
      <edge source="9" target="21" id="149" />
      <edge source="9" target="24" id="150" />
      <edge source="9" target="26" id="151" />
      <edge source="9" target="27" id="152" />
      <edge source="9" target="29" id="153" />
      <edge source="10" target="11" id="154" />
      <edge source="10" target="15" id="155" />
      <edge source="10" target="16" id="156" />
      <edge source="10" target="17" id="157" />
      <edge source="10" target="18" id="158" />
      <edge source="10" target="19" id="159" />
      <edge source="10" target="23" id="160" />
      <edge source="10" target="24" id="161" />
      <edge source="10" target="26" id="162" />
      <edge source="10" target="27" id="163" />
      <edge source="10" target="28" id="164" />
      <edge source="11" target="14" id="165" />
      <edge source="11" target="17" id="166" />
      <edge source="11" target="20" id="167" />
      <edge source="11" target="22" id="168" />
      <edge source="11" target="24" id="169" />
      <edge source="11" target="26" id="170" />
      <edge source="12" target="16" id="171" />
      <edge source="12" target="20" id="172" />
      <edge source="12" target="24" id="173" />
      <edge source="12" target="25" id="174" />
      <edge source="12" target="26" id="175" />
      <edge source="13" target="15" id="176" />
      <edge source="13" target="18" id="177" />
      <edge source="13" target="19" id="178" />
      <edge source="13" target="20" id="179" />
      <edge source="13" target="21" id="180" />
      <edge source="13" target="22" id="181" />
      <edge source="13" target="23" id="182" />
      <edge source="13" target="24" id="183" />
      <edge source="13" target="25" id="184" />
      <edge source="13" target="26" id="185" />
      <edge source="13" target="28" id="186" />
      <edge source="14" target="15" id="187" />
      <edge source="14" target="17" id="188" />
      <edge source="14" target="21" id="189" />
      <edge source="14" target="23" id="190" />
      <edge source="14" target="24" id="191" />
      <edge source="14" target="25" id="192" />
      <edge source="14" target="26" id="193" />
      <edge source="14" target="27" id="194" />
      <edge source="14" target="28" id="195" />
      <edge source="14" target="29" id="196" />
      <edge source="15" target="16" id="197" />
      <edge source="15" target="18" id="198" />
      <edge source="15" target="19" id="199" />
      <edge source="15" target="20" id="200" />
      <edge source="15" target="21" id="201" />
      <edge source="15" target="23" id="202" />
      <edge source="15" target="26" id="203" />
      <edge source="15" target="27" id="204" />
      <edge source="15" target="28" id="205" />
      <edge source="15" target="29" id="206" />
      <edge source="16" target="17" id="207" />
      <edge source="16" target="20" id="208" />
      <edge source="16" target="22" id="209" />
      <edge source="16" target="23" id="210" />
      <edge source="16" target="24" id="211" />
      <edge source="16" target="25" id="212" />
      <edge source="16" target="27" id="213" />
      <edge source="16" target="29" id="214" />
      <edge source="17" target="19" id="215" />
      <edge source="17" target="22" id="216" />
      <edge source="17" target="23" id="217" />
      <edge source="17" target="26" id="218" />
      <edge source="17" target="27" id="219" />
      <edge source="17" target="28" id="220" />
      <edge source="18" target="20" id="221" />
      <edge source="18" target="25" id="222" />
      <edge source="18" target="27" id="223" />
      <edge source="18" target="28" id="224" />
      <edge source="18" target="29" id="225" />
      <edge source="19" target="21" id="226" />
      <edge source="19" target="22" id="227" />
      <edge source="19" target="23" id="228" />
      <edge source="19" target="25" id="229" />
      <edge source="19" target="27" id="230" />
      <edge source="19" target="29" id="231" />
      <edge source="20" target="21" id="232" />
      <edge source="20" target="22" id="233" />
      <edge source="20" target="24" id="234" />
      <edge source="20" target="25" id="235" />
      <edge source="20" target="27" id="236" />
      <edge source="20" target="29" id="237" />
      <edge source="21" target="25" id="238" />
      <edge source="21" target="26" id="239" />
      <edge source="22" target="23" id="240" />
      <edge source="22" target="24" id="241" />
      <edge source="22" target="26" id="242" />
      <edge source="22" target="27" id="243" />
      <edge source="22" target="28" id="244" />
      <edge source="22" target="29" id="245" />
      <edge source="23" target="24" id="246" />
      <edge source="23" target="26" id="247" />
      <edge source="23" target="29" id="248" />
      <edge source="24" target="25" id="249" />
      <edge source="24" target="26" id="250" />
      <edge source="24" target="27" id="251" />
      <edge source="24" target="28" id="252" />
      <edge source="24" target="29" id="253" />
      <edge source="25" target="26" id="254" />
      <edge source="25" target="27" id="255" />
      <edge source="26" target="27" id="256" />
      <edge source="26" target="28" id="257" />
      <edge source="28" target="29" id="258" />
    </edges>
  </graph>
</gexf>

test.py

模拟退火多次迭代寻最优解

import numpy as np
import matplotlib.pyplot as plt
import pdb

# coordinates可自行假设
coordinates = np.array([[565.0, 575.0], [25.0, 185.0], [345.0, 750.0], [945.0, 685.0], [845.0, 655.0],
                        [880.0, 660.0], [25.0, 230.0], [525.0, 1000.0], [580.0, 1175.0], [650.0, 1130.0],
                        [1605.0, 620.0], [1220.0, 580.0], [1465.0, 200.0], [1530.0, 5.0], [845.0, 680.0],
                        [725.0, 370.0], [145.0, 665.0], [415.0, 635.0], [510.0, 875.0], [560.0, 365.0],
                        [300.0, 465.0], [520.0, 585.0], [480.0, 415.0], [835.0, 625.0], [975.0, 580.0],
                        [1215.0, 245.0], [1320.0, 315.0], [1250.0, 400.0], [660.0, 180.0], [410.0, 250.0],
                        [420.0, 555.0], [575.0, 665.0], [1150.0, 1160.0], [700.0, 580.0], [685.0, 595.0],
                        [685.0, 610.0], [770.0, 610.0], [795.0, 645.0], [720.0, 635.0], [760.0, 650.0],
                        [475.0, 960.0], [95.0, 260.0], [875.0, 920.0], [700.0, 500.0], [555.0, 815.0],
                        [830.0, 485.0], [1170.0, 65.0], [830.0, 610.0], [605.0, 625.0], [595.0, 360.0],
                        [1340.0, 725.0], [1740.0, 245.0]])


def getdistmat(coordinates):
    num = coordinates.shape[0]
    distmat = np.zeros((52, 52))
    for i in range(num):
        for j in range(i, num):
            distmat[i][j] = distmat[j][i] = np.linalg.norm(coordinates[i] - coordinates[j])
    return distmat


def initpara():
    alpha = 0.99
    t = (1, 100)
    markovlen = 1000

    return alpha, t, markovlen


num = coordinates.shape[0]
distmat = getdistmat(coordinates)

solutionnew = np.arange(num)
# valuenew = np.max(num)

solutioncurrent = solutionnew.copy()
valuecurrent = 99000

solutionbest = solutionnew.copy()
valuebest = 99000

alpha, t2, markovlen = initpara()
t = t2[1]

result = []  # 记录迭代过程中的最优解
while t > t2[0]:
    for i in np.arange(markovlen):

        if np.random.rand() > 0.5:
            while True:
                loc1 = np.int(np.ceil(np.random.rand() * (num - 1)))
                loc2 = np.int(np.ceil(np.random.rand() * (num - 1)))

                if loc1 != loc2:
                    break
            solutionnew[loc1], solutionnew[loc2] = solutionnew[loc2], solutionnew[loc1]
        else:
            while True:
                loc1 = np.int(np.ceil(np.random.rand() * (num - 1)))
                loc2 = np.int(np.ceil(np.random.rand() * (num - 1)))
                loc3 = np.int(np.ceil(np.random.rand() * (num - 1)))

                if ((loc1 != loc2) & (loc2 != loc3) & (loc1 != loc3)):
                    break

            if loc1 > loc2:
                loc1, loc2 = loc2, loc1
            if loc2 > loc3:
                loc2, loc3 = loc3, loc2
            if loc1 > loc2:
                loc1, loc2 = loc2, loc1

            tmplist = solutionnew[loc1:loc2].copy()
            solutionnew[loc1:loc3 - loc2 + 1 + loc1] = solutionnew[loc2:loc3 + 1].copy()
            solutionnew[loc3 - loc2 + 1 + loc1:loc3 + 1] = tmplist.copy()

        valuenew = 0
        for i in range(num - 1):
            valuenew += distmat[solutionnew[i]][solutionnew[i + 1]]
        valuenew += distmat[solutionnew[0]][solutionnew[51]]
        if valuenew < valuecurrent:

            valuecurrent = valuenew
            solutioncurrent = solutionnew.copy()

            if valuenew < valuebest:
                valuebest = valuenew
                solutionbest = solutionnew.copy()
        else:
            if np.random.rand() < np.exp(-(valuenew - valuecurrent) / t):
                valuecurrent = valuenew
                solutioncurrent = solutionnew.copy()
            else:
                solutionnew = solutioncurrent.copy()
    t = alpha * t
    result.append(valuebest)
    print(t)

plt.plot(np.array(result))
plt.ylabel("valuebest")
plt.xlabel("t")
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值