コード例 #1
0
def experiment_four(node_num, model):
    '''
    函数功能:q随时间减小的情况下观察实验结果
    node_num:代表初始网络的节点总数
    model:代表ER随机网络的类
    '''
    step = 0  #步长代表横坐标,从0开始
    len_dict = len(model.dict_G)  #记录剩余节点个数,初始值为未攻击前总节点数
    min_node_degree = fc.min_degree(
        model.dict_G)  #将随机网络的字典传入函数,获得度最小节点的度,min_node_degree表示度数最小的节点的度
    degree_dict = {}  #degree_dict用来记录每个节点的初始度
    for key in model.dict_G.keys():
        degree_dict[key] = len(model.dict_G[key])
    remain_node_rate = 1  #remain_node_rate代表剩余节点比例,初始值为1
    is_crash = 0  #is_crash记录是否发生崩溃,0代表未崩溃,1代表崩溃
    start_time = fc.GetNowTime()  #获取当前时间作为起始时间
    crash_time = 0  #crash_time代表系统崩溃的时间
    data_file = open("ex_data4/datafile" + str(timestamp) + ".txt",
                     'a')  #在ex_data1文件夹下创建记录实验数据的txt文件
    data_file.write('step_size,residual_node_ratio\n')
    while step < 1000000:  #小于一定步数进行迭代
        for key in list(model.dict_G.keys()
                        ):  #遍历节点,item代表节点的键,由于遍历过程中不能修改字典元素,所以将字典转为列表后处理
            if min_node_degree <= model.er_ks or (
                    degree_dict[key] - len(model.dict_G[key])
            ) / degree_dict[key] > model.er_q:  #满足条件k<=ks或者损失邻居节点比例超过q
                step += 1  #步长每次加1
                if step % 20000 == 0:
                    model.er_q -= 0.01
                    data_file.write(str(step))
                    data_file.write(',')
                    data_file.write(str(len_dict / node_num))
                    data_file.write('\n')
                if len(model.dict_G[key]
                       ) == min_node_degree:  #如果满足k<=ks,从度数最小的节点开始删除
                    probability = random.random()  #取一个0-1之间的随机数
                    if probability < model.er_f:  #按照概率f删除节点
                        model.dict_G = fc.del_node(model.dict_G,
                                                   key)  #删除k<ks的节点和其所连接的边
                        del degree_dict[key]  #删除存储初始度节点的字典中的相关项
                    else:
                        continue
                else:
                    continue
            else:
                break
        len_dict = len(model.dict_G)  #更新剩余节点个数
        min_node_degree = fc.min_degree(model.dict_G)  #更新度数最小的节点的度
        remain_node_rate = len_dict / node_num  #计算剩余节点比例
        if len_dict < int(model.er_threshold):  #达到崩溃阈值时,认定崩溃
            is_crash = 1
            crash_time = fc.GetNowTime()  #获取系统奔溃时的时间
        if len_dict < int(model.er_threshold) * 0.1:  #剩余节点数过少时,跳出循环
            break
    end_time = fc.GetNowTime()  #获取实验结束时的时间
    data_file.close()  #关闭记录实验数据的文件
コード例 #2
0
def experiment_one(node_num, model):
    '''
    函数功能:从节点的度小于ks的节点开始攻击,即传统的k核模型,同时考虑q的影响
    node_num:代表初始网络的节点总数
    model:代表ER随机网络的类
    '''
    step = 0  #步长代表横坐标,从0开始
    step_threshold = 1000000  #设定实验总步长的阈值,达到阈值停止迭代
    len_dict = len(model.dict_G)  #记录剩余节点个数,初始值为未攻击前总节点数
    min_node_degree = fc.min_degree(
        model.dict_G)  #将随机网络的字典传入函数,获得度最小节点的度,min_node_degree表示度数最小的节点的度
    for key in model.dict_G.keys():
        degree_dict[key] = len(model.dict_G[key])
    data_file = open("ex_data1/datafile" + str(timestamp) + ".txt",
                     'a')  #在ex_data1文件夹下创建记录实验数据的txt文件
    data_file.write('step_size,residual_node_ratio\n')
    while step < step_threshold:  #小于一定步数进行迭代
        for key in list(model.dict_G.keys()
                        ):  #遍历节点,item代表节点的键,由于遍历过程中不能修改字典元素,所以将字典转为列表后处理
            if min_node_degree <= model.er_ks or (
                    degree_dict[key] - len(model.dict_G[key])
            ) / degree_dict[key] > model.er_q:  #满足条件k<=ks或者损失邻居节点比例超过q
                if step % 2000 == 0:
                    data_file.write(str(step))
                    data_file.write(',')
                    data_file.write(str(len_dict / node_num))
                    data_file.write('\n')
                if len(model.dict_G[key]
                       ) == min_node_degree:  #如果满足k<=ks,从度数最小的节点开始删除
                    probability = random.random()  #取一个0-1之间的随机数
                    if probability < model.er_f:  #按照概率f删除节点
                        model.dict_G = fc.del_node(model.dict_G,
                                                   key)  #删除k<ks的节点和其所连接的边
                        del degree_dict[key]  #删除存储初始度节点的字典中的相关项
                        step += 1  #步长每次加1
                    else:
                        continue
                else:
                    continue
            else:
                break
        len_dict = len(model.dict_G)  #更新剩余节点个数
        min_node_degree = fc.min_degree(model.dict_G)  #更新度数最小的节点的度
        remain_node_rate = len_dict / node_num  #计算剩余节点比例
        if len_dict < int(model.er_threshold):  #达到崩溃阈值时,认定崩溃
            is_crash = 1
            crash_time = fc.GetNowTime()  #获取系统奔溃时的时间
        if len_dict < int(model.er_threshold) * 0.1:  #剩余节点数过少时,跳出循环
            break
    end_time = fc.GetNowTime()  #获取实验结束时的时间
    data_file.close()  #关闭记录实验数据的文件
コード例 #3
0
import random  #引入随机数模块
import function as fc  #引入功能函数模块
import time  #引入时间模块
#这个模块实现不同顺序的攻击,一是传统的k-shell分解,从度数小的节点开始攻击,二是从度数大的节点开始攻击,三是先从度数小的节点开始攻击,然后交替攻击
#记录一些全局变量
degree_dict = {}  #degree_dict用来记录每个节点的初始度
is_crash = 0  #is_crash记录是否发生崩溃,0代表未崩溃,1代表崩溃
remain_node_rate = 1  #remain_node_rate代表剩余节点比例,初始值为1
start_time = fc.GetNowTime()  #获取当前时间作为起始时间
crash_time = 0  #crash_time代表系统崩溃的时间
timestamp = time.time()  #获取当前时间戳用于文件命名


#实验一 从度数小的节点开始攻击
def experiment_one(node_num, model):
    '''
    函数功能:从节点的度小于ks的节点开始攻击,即传统的k核模型,同时考虑q的影响
    node_num:代表初始网络的节点总数
    model:代表ER随机网络的类
    '''
    step = 0  #步长代表横坐标,从0开始
    step_threshold = 1000000  #设定实验总步长的阈值,达到阈值停止迭代
    len_dict = len(model.dict_G)  #记录剩余节点个数,初始值为未攻击前总节点数
    min_node_degree = fc.min_degree(
        model.dict_G)  #将随机网络的字典传入函数,获得度最小节点的度,min_node_degree表示度数最小的节点的度
    for key in model.dict_G.keys():
        degree_dict[key] = len(model.dict_G[key])
    data_file = open("ex_data1/datafile" + str(timestamp) + ".txt",
                     'a')  #在ex_data1文件夹下创建记录实验数据的txt文件
    data_file.write('step_size,residual_node_ratio\n')
    while step < step_threshold:  #小于一定步数进行迭代
コード例 #4
0
def experiment(ex_num):
    '''
    函数功能:从节点的度小于ks的节点开始攻击,即传统的k核模型,同时考虑q的影响
    node_num:代表初始网络的节点总数
    model:代表ER随机网络的类
    '''
    mkdir_name = str(timestamp) #创建的文件夹名
    paper_file = "E:\\project\\kq\\kq_cascade\\ex_data\\%s" %mkdir_name #文件夹创建路径
    os.makedirs(paper_file) #在ex_data文件夹下创建本次试验的文件夹
    for i in range(ex_num):
        step = 0 #步长代表横坐标,从0开始
        is_crash = 0 #is_crash记录是否发生崩溃,0代表未崩溃,1代表崩溃
        #每次实验选择实验中的模型,1代表er,2代表exp,3代表sf,4代表facebook真实网络,5代表epa真实网络
        model_select = int(input("please input the select of model:")) #选择实验中使用的模型
        if model_select == 1:
            model = nm.ER_network_model()
            my_model = "er"
        elif model_select == 2:
            model = nm.EXP_network_model()
            my_model = "exp"
        elif model_select == 3:
            model = nm.SF_network_model()
            my_model = "sf"
        elif model_select == 4:
            model = nm.facebook_network_model()
            my_model = "facebook"
        elif model_select == 5:
            model = nm.epa_network_model()
            my_model = "epa"
        initial_nodes = len(model.dict_G) #记录初始节点总度数
        len_dict = len(model.dict_G) #记录剩余节点个数,初始值为未攻击前总节点数
        k_max = fc.max_degree(model.dict_G) #当前网络所有节点中度的最大值
        k_min = fc.min_degree(model.dict_G) #当前网络所有节点中度的最小值
        for key in model.dict_G.keys():
            degree_dict[key] = len(model.dict_G[key])
        ex_select = int(input("please input the type of attack:")) #选择进行的实验,1代表传统kq模型,2代表从大节点开始攻击,3代表q与节点的初始度值成正比,4代表q与节点的初始度值成反比,5代表先删除10%的大节点
        if ex_select == 1:
            data_file = open(paper_file + "\\" + str(i) + ".txt",'a') #在ex_data文件夹下的本次试验的文件夹下创建记录实验数据的txt文件
            data_file.write('step_size,residual_node_ratio\n') #文件里写入抬头
            k = int(input("please input k:")) #输入每次实验的k值
            q = float(input("please input q:")) #输入每次实验的q值
            f = float(input("please input f:")) #输入每次实验的f值
            insert_sql = "insert into experimental_data(model,k,q,f,paper_file)values('%s',%f,%f,%f,'%s')"%(str(my_model),k,q,f,str(mkdir_name))
            #print(insert_sql)
            cursor.execute(insert_sql)
            er_threshold = initial_nodes*0.05 #er_threshold代表临界阈值,即损失超过原始节点的5%视为崩溃
            while step < 100000 :
                if len_dict < 100:
                    break
                step +=1 #步长每次加1
                if step % 5 == 0:
                        data_file.write(str(step))
                        data_file.write(',')
                        data_file.write(str(len_dict / initial_nodes))
                        data_file.write('\n')
                for key in list(model.dict_G.keys()): #遍历节点,item代表节点的键,由于遍历过程中不能修改字典元素,所以将字典转为列表后处理
                    if len_dict < int(er_threshold): #达到崩溃阈值时,认定崩溃
                        is_crash = 1
                        crash_time = fc.GetNowTime() #获取系统奔溃时的时间
                    if len(model.dict_G[key]) <= k or (degree_dict[key] - len(model.dict_G[key])) / degree_dict[key] > q: #满足条件k<=ks或者损失邻居节点比例超过q
                        probability = random.random() #取一个0-1之间的随机数
                        if probability < f: #按照概率f删除节点
                            model.dict_G = fc.del_node(model.dict_G,key) #删除k<ks的节点和其所连接的边
                            del degree_dict[key] #删除存储初始度节点的字典中的相关项
                            len_dict = len(model.dict_G) #更新剩余节点个数
                            remain_node_rate = len_dict / initial_nodes #计算剩余节点比例
                        else:
                            continue
                else:
                    continue
        elif ex_select == 2:
             data_file = open(paper_file + "\\" + str(i) + ".txt",'a') #在ex_data文件夹下的本次试验的文件夹下创建记录实验数据的txt文件
             data_file.write('step_size,residual_node_ratio\n') #文件里写入抬头
             k = int(input("please input k:")) #输入每次实验的k值
             q = float(input("please input q:")) #输入每次实验的q值
             f = float(input("please input f:")) #输入每次实验的f值
             insert_sql = "insert into experimental_data(model,k,q,f)values('%s',%f,%f,%f)"%(str(my_model),k,q,f)
             #print(insert_sql)
             cursor.execute(insert_sql)
             er_threshold = initial_nodes*0.05 #er_threshold代表临界阈值,即损失超过原始节点的5%视为崩溃
             while step < 100000 :
                if len_dict < 100:
                    break
                step +=1 #步长每次加1
                if step % 1 == 0:
                        data_file.write(str(step))
                        data_file.write(',')
                        data_file.write(str(len_dict / initial_nodes))
                        data_file.write('\n')
                for key in list(model.dict_G.keys()): #遍历节点,item代表节点的键,由于遍历过程中不能修改字典元素,所以将字典转为列表后处理
                    if len_dict < int(er_threshold): #达到崩溃阈值时,认定崩溃
                        is_crash = 1
                        crash_time = fc.GetNowTime() #获取系统奔溃时的时间
                    if len(model.dict_G[key]) > k or (degree_dict[key] - len(model.dict_G[key])) / degree_dict[key] > q: #满足条件k>ks或者损失邻居节点比例超过q
                        probability = random.random() #取一个0-1之间的随机数
                        if probability < f: #按照概率f删除节点
                            model.dict_G = fc.del_node(model.dict_G,key) #删除k>ks的节点和其所连接的边
                            del degree_dict[key] #删除存储初始度节点的字典中的相关项
                            len_dict = len(model.dict_G) #更新剩余节点个数
                            remain_node_rate = len_dict / initial_nodes #计算剩余节点比例
                        else:
                            continue
                else:
                    continue
        elif ex_select == 3:
            data_file = open(paper_file + "\\" + str(i) + ".txt",'a') #在ex_data文件夹下的本次试验的文件夹下创建记录实验数据的txt文件
            data_file.write('step_size,residual_node_ratio\n') #文件里写入抬头
            while step < 100000 :
                if len_dict < 100:
                    break
                step +=1 #步长每次加1
                if step % 1 == 0:
                        data_file.write(str(step))
                        data_file.write(',')
                        data_file.write(str(len_dict / 10000))
                        data_file.write('\n')
                for key in list(model.dict_G.keys()): #遍历节点,item代表节点的键,由于遍历过程中不能修改字典元素,所以将字典转为列表后处理
                    k_now = len(model.dict_G[key]) #k_now代表当前节点的度数
                    var_q = (k_now-k_min)/(k_max-k_min) #变量q的公式
                    if len_dict < int(er_threshold): #达到崩溃阈值时,认定崩溃
                        is_crash = 1
                        crash_time = fc.GetNowTime() #获取系统奔溃时的时间
                    if len(model.dict_G[key]) > k or (degree_dict[key] - len(model.dict_G[key])) / degree_dict[key] > var_q: #满足条件k>ks或者损失邻居节点比例超过var_q
                        probability = random.random() #取一个0-1之间的随机数
                        if probability < f: #按照概率f删除节点
                            model.dict_G = fc.del_node(model.dict_G,key) #删除k>ks的节点和其所连接的边
                            del degree_dict[key] #删除存储初始度节点的字典中的相关项
                            len_dict = len(model.dict_G) #更新剩余节点个数
                            remain_node_rate = len_dict / 10000 #计算剩余节点比例
                        else:
                            continue
                else:
                    continue
        elif ex_select == 4:
             data_file = open(paper_file + "\\" + str(i) + ".txt",'a') #在ex_data文件夹下的本次试验的文件夹下创建记录实验数据的txt文件
             data_file.write('step_size,residual_node_ratio\n') #文件里写入抬头
             while step < 100000 :
                if len_dict < 100:
                    break
                step +=1 #步长每次加1
                if step % 1 == 0:
                        data_file.write(str(step))
                        data_file.write(',')
                        data_file.write(str(len_dict / 10000))
                        data_file.write('\n')
                for key in list(model.dict_G.keys()): #遍历节点,item代表节点的键,由于遍历过程中不能修改字典元素,所以将字典转为列表后处理
                    k_now = len(model.dict_G[key]) #k_now代表当前节点的度数
                    var_q = (k_max-k_now)/(k_max-k_min) #变量q的公式
                    if len_dict < int(er_threshold): #达到崩溃阈值时,认定崩溃
                        is_crash = 1
                        crash_time = fc.GetNowTime() #获取系统奔溃时的时间
                    if len(model.dict_G[key]) > k or (degree_dict[key] - len(model.dict_G[key])) / degree_dict[key] > var_q: #满足条件k>ks或者损失邻居节点比例超过var_q
                        probability = random.random() #取一个0-1之间的随机数
                        if probability < f: #按照概率f删除节点
                            model.dict_G = fc.del_node(model.dict_G,key) #删除k>ks的节点和其所连接的边
                            del degree_dict[key] #删除存储初始度节点的字典中的相关项
                            len_dict = len(model.dict_G) #更新剩余节点个数
                            remain_node_rate = len_dict / 10000 #计算剩余节点比例
                        else:
                            continue
                else:
                    continue
        elif ex_select == 5:
            data_file = open(paper_file + "\\" + str(i) + ".txt",'a') #在ex_data文件夹下的本次试验的文件夹下创建记录实验数据的txt文件
            data_file.write('step_size,residual_node_ratio\n') #文件里写入抬头
            k = int(input("please input k:")) #输入每次实验的k值
            q = float(input("please input q:")) #输入每次实验的q值
            f = float(input("please input f:")) #输入每次实验的f值
            insert_sql = "insert into experimental_data(model,k,q,f,paper_file)values('%s',%f,%f,%f,'%s')"%(str(my_model),k,q,f,str(mkdir_name))
            #print(insert_sql)
            cursor.execute(insert_sql)
            er_threshold = initial_nodes*0.05 #er_threshold代表临界阈值,即损失超过原始节点的5%视为崩溃
            fc.max_delete(model.dict_G) #调用函数删除1%的最大节点
            while step < 100000 :
                if len_dict < 100:
                    break
                step +=1 #步长每次加1
                if step % 5 == 0:
                        data_file.write(str(step))
                        data_file.write(',')
                        data_file.write(str(len_dict / initial_nodes))
                        data_file.write('\n')
                for key in list(model.dict_G.keys()): #遍历节点,item代表节点的键,由于遍历过程中不能修改字典元素,所以将字典转为列表后处理
                    if len_dict < int(er_threshold): #达到崩溃阈值时,认定崩溃
                        is_crash = 1
                        crash_time = fc.GetNowTime() #获取系统奔溃时的时间
                    if len(model.dict_G[key]) <= k or (degree_dict[key] - len(model.dict_G[key])) / degree_dict[key] > q: #满足条件k<=ks或者损失邻居节点比例超过q
                        probability = random.random() #取一个0-1之间的随机数
                        if probability < f: #按照概率f删除节点
                            model.dict_G = fc.del_node(model.dict_G,key) #删除k<ks的节点和其所连接的边
                            del degree_dict[key] #删除存储初始度节点的字典中的相关项
                            len_dict = len(model.dict_G) #更新剩余节点个数
                            remain_node_rate = len_dict / initial_nodes #计算剩余节点比例
                        else:
                            continue
                else:
                    continue

        data_file.close() #关闭记录实验数据的文件
        end_time = fc.GetNowTime() #获取实验结束的时间