私は遺伝的アルゴリズムを実装して、グラフを切断するエッジのセットを見つけようとしています。より具体的には、私は頂点とエッジからなる有向非循環グラフを使用しています。各エッジにはコストまたは重量があります。遺伝的アルゴリズムは、多くのセットCを生成する(すなわち、2つの頂点の間のいくつかのエッジを選択する)。今私の問題は、この一連のエッジがカットセットを表すかどうか、またはグラフを切断するかどうかをチェックすることです。次に、遺伝的アルゴリズムは、カットセットに含まれるエッジコストの可能な最小合計を探している。2つの頂点間のグラフ接続をチェックする方法
私は、接続アルゴリズムをテストするために、「グラフアルゴリズムと最適化のJavaライブラリ」という本から取られたConnected Graph Testingというメソッドを使用しました。これは、頂点の隣人だけをスキャンするので、私のためには機能しません。我々は次のエッジ削除する場合
number of vertices = 4
number of edges = 5
1->2
1->3
1->4
2->4
3->4
:そして
1->2
1->3
2->4
を、方法がまだある間、このグラフが切断されていることを返し、次の非循環有向グラフを考える
public static boolean isConnected(Individual ind)
{
int n= Settings.numOfNodes;
int m= Settings.numOfEdges-ind.cutSet.size();
int nodei[]= new int[m+1];
int nodej[]= new int[m+1];
int tempi[]= new int[m];
int tempj[]= new int[m];
int[] temp= (int[])Settings.nodei.clone();
for(int edg:ind.cutSet)
temp[edg]= -1;
int count=0;
for(int i=0; i<Settings.numOfEdges; i++)
{
if(temp[i]!=-1)
{
tempi[count]=Settings.nodei[i];
tempj[count]=Settings.nodej[i];
count++;
}
}
nodei[0]=0;
nodej[0]=0;
for(int i=0; i<tempi.length;i++)
{
nodei[i+1]=tempi[i];
nodej[i+1]=tempj[i];
}
int i,j,k,r,connect;
int neighbor[] = new int[m + m + 1];
int degree[] = new int[n + 1];
int index[] = new int[n + 2];
int aux1[] = new int[n + 1];
int aux2[] = new int[n + 1];
for (i=1; i<=n; i++)
degree[i] = 0;
for (j=1; j<=m; j++) {
degree[nodei[j]]++;
degree[nodej[j]]++;
}
index[1] = 1;
for (i=1; i<=n; i++) {
index[i+1] = index[i] + degree[i];
degree[i] = 0;
}
for (j=1; j<=m; j++) {
neighbor[index[nodei[j]] + degree[nodei[j]]] = nodej[j];
degree[nodei[j]]++;
neighbor[index[nodej[j]] + degree[nodej[j]]] = nodei[j];
degree[nodej[j]]++;
}
for (i=2; i<=n; i++)
aux1[i] = 1;
aux1[1] = 0;
connect = 1;
aux2[1] = 1;
k = 1;
while (true) {
i = aux2[k];
k--;
for (j=index[i]; j<=index[i+1]-1; j++) {
r = neighbor[j];
if (aux1[r] != 0) {
connect++;
if (connect == n) {
connect /= n;
if (connect == 1) return true;
return false;
}
aux1[r] = 0;
k++;
aux2[k] = r;
}
}
if (k == 0) {
connect /= n;
if (connect == 1) return true;
return false;
}
}
}
間のパス:
1->4
私はいくつかのエッジを削除するかどうかを確認するアルゴリズムや方法を探していますが、グラフはまだ開始点と目標点の間に接続されています。言い換えると、グラフにはまだこれらの2つの頂点の間に他のいくつかのパスが存在しています。
グラフが接続されていない取り除か有効なセットの例:
1->2
1->3
1->4
または
2->4
1->4
3->4
してください、私はこの問題を解決するための任意の考えやアイデアを開いています。
おかげ接続の確認
Dijkstraのアルゴリズムのようなものを使って最小のパスを見つけるのはなぜですか?それはパスが存在するかどうかを教えてくれるでしょう。または、投稿したアルゴリズムの問題を探していますか? – vmpstr
@vmpstr:各エッジ除去後のグラフを再探索するのは、一般に「ジェネティックアルゴリズム」とほぼすべてのAIアルゴリズムで、実際には、各ステップの計算を簡単に保つことが重要です。多くのステップ。 – amit
コメントありがとうございますが、Dijkstraのアルゴリズムは私が間違っていないと最短経路しか与えないと思います。私は他のパスで他のエッジをチェックする必要があります。 – malhom