如何在双向图中找到两条不相交的路径?

How to find two disjoint paths in a bidirectional graph?

本文关键字:两条 路径      更新时间:2023-10-16

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

例如,我通过 route<1,2,3,4> 将数据包从节点 1 发送到节点 4 作为工作路径。 如果链路 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);
}

我有一个包含 14 个节点和 21 个链接的图表。[...]对于每个源和目的地,我必须建立一个工作和 在链路故障时提前同时提供保护路径 但他们缪斯是链接脱节的。(它们不能遍历任何公共链接(

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

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

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

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

我可以想象更精细的方法,其中你一起搜索不相交的对,而不是搜索单个路径,但我倾向于认为由于涉及大量重复工作,这些往往效率低下。 这表明可以通过动态编程解决,但在这一点上,我沉迷于猜测。

您无法可靠地选择一条路径,然后寻找另一条遍历其余节点的路径。 完全有可能有合适的路径对,但您选择的第一个路径不是此类路径对的成员。