1

我有一个包含 14 个节点和 21 个链接的图表。该图显示了一个光网络。链接是双向的,每个链接都有一些资源。假设有一条从源到目的地的工作路径,该路径携带包含数据的数据包并使用一些资源(它所经过的链路的一定带宽)。对于每个源和目的地,我必须提前同时建立一个工作和保护路径,以防链路故障,但它们必须是链路不相交的。(它们不能遍历任何公共链路)

例如,我通过 route<1,2,3,4> 作为工作路径从 node1 向 node4 发送一个数据包。如果链路 1-2 发生故障,我必须通过预先建立的保护路径发送数据包,并且与工作路径不相交。例如我的保护路径可能是<1,9,3,4>。

目的是用 C/C++ 编写代码来找到与工作路径不相交的保护路径。实际上,我无法想到这样做。任何帮助将不胜感激。

这是我为工作路径分配资源的一段代码,我不知道如何在必须与工作路径不相交的情况下建立保护路径。

 int required_fs;
    int des;
    int idpk;
    double holding;
    int src;

  //get the information about the packet that is sent from source to destination.    
    Packet *pkptr;
    pkptr = op_pk_get (0);
    op_pk_nfd_get(pkptr,"bw_fs",&required_fs);
    op_pk_nfd_get(pkptr,"des",&des);
    op_pk_nfd_get(pkptr,"src",&src);
    op_pk_nfd_get(pkptr,"id",&idpk);
    op_pk_nfd_get(pkptr,"ht",&holding);


    bw_req=bw_req + required_fs;
    number_of_req=number_of_req+1;

    if (number_of_req > 1000000)
        {
            FILE* file1=fopen("C:/400f_rsa.txt","a+");
            fprintf(file1,"\n");
            fprintf(file1,"number_of_req ,number_of_nack,number_of_ack , bw_req , bw_nack , bw_ack " );
            fprintf(file1,"\n");
            fprintf(file1,"  %d , %d , %d , %d , %d , %d   ", number_of_req, number_of_nack ,number_of_ack,bw_req,bw_nack,bw_ack );
            fprintf(file1,"\n");
            fprintf(file1,"------------------------------- ");
            fclose (file1);
            op_sim_end("1000000 paket","","","");

        }

 //  Allocate the resources on each link to the working path, This part must be the same for the protection path too.
    int determined_t=0;
    int determined_r=0;
    int determined_p_f=0;
    int determined_p_e=0;
    int determined_k=0;

    for ( int i=1; i<=10; i++)
        {
            if (transmitter[src][i]==0)
                {
                    determined_t=i;
                    break;
                }
        }

    if (determined_t!=0)
        {
            for ( int i=1; i<=10; i++)
                {
                    if (reciever[des][i]==0)
                        {
                            determined_r=i;
                            break;
                        }
                }

            if (determined_r!=0)
                {

                    for ( int k=1; k<=2 ; k++)
                        {

                            determined_p_f=0;
                            determined_p_e=0;
                            int count = paths_node[src][des][k][2][14];

                            zero_array();

                            for (int i=1; i<=count; i++)
                                {
                                    finding_fs( k, i, des, src );
                                }
                            if ( ff_rr==0)
                                {//ff
                                    ////checking gap
                                    determined_p_f=find_first_free_gap(required_fs);
                                    if (determined_p_f!=0)
                                        {   
                                            determined_p_e=determined_p_f+required_fs-1;
                                            if (determined_p_e != 1000)
                                                {
                                                    determined_p_e=determined_p_e+1;
                                                }
                                            determined_k=k;
                                            break;
                                        }


                                }
                            else if (ff_rr==1)
                                {//rr
                                    clear_rr_gap();
                                    find_rr_gap(required_fs);
                                    int index=rr_spectrum();
                                    determined_p_f=ary_rr[index].first;
                                    if (determined_p_f!=0)
                                        {
                                            determined_p_e=ary_rr[index].last;
                                            determined_k=k;
                                            break;
                                        }

                                }


                        }

                    if (determined_p_f!=0)
                        {
                            //add to ls , applying
                         int count_link = paths_node[src][des][determined_k][2][14];

                         for ( int i=1; i<=count_link ; i++)
                             {
                                int num_link_p=paths_node[src][des][determined_k][2][i];

                                for ( int j=determined_p_f ; j<=determined_p_e; j++)
                                    {
                                        links_fs[num_link_p][j]=1;

                                    }
                             }

                         reciever[des][determined_r]=1;
                         transmitter[src][determined_t]=1;
                         ls(determined_p_f,determined_p_e,determined_r,determined_t,determined_k,src,des,idpk);

                            number_of_ack= number_of_ack +1 ;
                            bw_ack= bw_ack + required_fs;
                            op_intrpt_schedule_self(op_sim_time ()+ holding,idpk);
                            op_pk_destroy(pkptr);
                        }
                    else
                        {
                            number_of_nack=number_of_nack+1;
                            bw_nack= bw_nack + required_fs;
                            op_pk_destroy(pkptr);
                        }
                }
            else
                {
                    number_of_nack=number_of_nack+1;
                    bw_nack= bw_nack + required_fs;
                    op_pk_destroy(pkptr);
                }
        }
    else
        {
            number_of_nack=number_of_nack+1;
            bw_nack= bw_nack + required_fs;
            op_pk_destroy(pkptr);
        }
4

1 回答 1

0

我有一个包含 14 个节点和 21 个链接的图表。[...] 对于每个源和目标,我必须提前同时建立一条工作和保护路径,以防链路故障,但它们必须是链路不相交的。(它们不能遍历任何公共链路)

首先请注意,您提供的信息绝不会确保任何两个特定节点之间甚至存在一条路径,更不用说两条不相交的路径了。但是,如果您的图形的结构保证每对节点之间有两条不相交的路径,那么您最好的选择可能是利用您对该结构的了解来找到所需的路径对。例如,如果您知道该图包含一个遍历所有节点的循环,那么您可以通过从一个到另一个以相反的方向遍历该循环来获得每个节点对之间的两条不相交的路径。

另一方面,如果你试图在它们存在的地方找到这样的不相交的路径对,并在其他地方确定不存在这样的路径对,那么你有一些选择。

从概念上讲,最简单的方法是为每对节点确定它们之间的所有非循环路径,然后寻找两个只有开始和结束节点共有的路径。您可以对路径枚举使用深度优先或广度优先搜索。这在一般图上具有计算挑战性,因为路径的数量呈指数增长,但是对于您描述的相对较小且相当稀疏的图,它可能会起作用。

您可以通过测试每条新路径来改进该方法,当您发现它时,针对所有先前发现的路径。您有时可能会发现可用的对,而无需枚举每条路径。如果你这样做,那么基于 BFS 的方法往往会比基于 DFS 的方法更快地找到可用的对。当没有不相交的对时,这仍将枚举节点之间的所有路径。

我可以想象更复杂的方法,您可以一起搜索不相交的,而不是搜索单独的路径,但我倾向于认为这些方法往往效率低下,因为涉及大量重复工作。这表明通过动态编程可能解决问题,但在这一点上,我相当沉迷于猜测。

不能可靠地做的是简单地选择一条路径,然后寻找穿过剩余节点的另一条路径。完全有可能存在合适的路径对,但您选择的第一条路径不是此类路径对的成员。

于 2018-06-19T21:05:26.540 回答