今現在大学4年生でネットワーク攻撃についての研究をしていますが知識が余りにもなくプログラムが書けなくて困っています。
予備実験すら出来ていない状況です。。。
100個のノードをばらまいて2個(ランダムに選択)を攻撃ノードとして設定
始点と終点(こちらもランダムに設定)を設定し、最短経路を探索
攻撃ノードを含む経路をカウントするプログラムが作れません。(どこに入れたらいいのか分からない)
ちなみに最短経路は全てのノードの二点間の距離を宣言した隣接行列に代入してある閾値以上になるとINFにして故意に通らないようにしています。
改善点やアドバイス等(こうした方がいいよとかなんでもいいので)よろしくお願いします。
よく分からないと思いますすが、プログラム載せます。(windows, visual studio 2012, C言語)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
# define N 100 /*ノード数*/
# define M 100 /*ノード数の上限*/
# define INF 999999
# define FALSE 0;
//乱数の発生
int rnd(void) {
return (int)((rand()/(RAND_MAX+1.0)*M)+1);
}
double adjacent[N+1][N+1]; //隣接行列の宣言
int main()
{
srand(1);
//変数の宣言
int i, j, k, p, s, t,
start,
goal,
count,
W1, //攻撃ノード
W2,
x[N+1],
y[N+1],
vertex[N+1],
index[N+1];
double dist,
min,
leng[N+1];
//変数の初期化
W1=rnd();
W2=rnd();
count=0;
dist=0;
start=rnd();
goal=rnd();
if(start==goal){ return FALSE; }
printf("スタートは%d\tゴールは%d\n", start, goal);
//乱数を配列に格納
for(s=1; s<=N; s++) {
x[s]=rnd();
y[s]=rnd();
}
//二重ループで距離計算
for(s=1; s<=N; s++) {
for(t=1; t<=N; t++) {
// printf("%d %d %d %d %d %d\n", s, x[s], y[s], t, x[t], y[t]);
dist=pow((x[s]-x[t])*(x[s]-x[t])+(y[s]-y[t])*(y[s]-y[t]), 0.5);
// printf("距離は%f\n", dist);
if(dist<25){
adjacent[s][t]=dist;
}
else{
dist=INF;
adjacent[s][t]=dist;
}
}
}
printf("攻撃ノードは%dと%dです\n", W1, W2);
// printf("始点"); scanf("%d", &start);
for(k=1; k<=N; k++) {
leng[k]=INF;
vertex[k]=0;
}
leng[start]=0;
index[start]=0;
for(j=1; j<=N; j++) {
min=INF;
for(k=1; k<=N; k++) {
if(vertex[k]==0 && leng[k]<min) {
p=k;
min=leng[k];
}
}
vertex[p]=1;
for(k=1; k<=N; k++) {
if((leng[p]+adjacent[p][k]<leng[k])) {
leng[k]=leng[p]+adjacent[p][k];
index[k]=p;
}
}
}
j=goal;
printf("%3f : %d", leng[j], j);
p=j;
while(index[p]!=0) {
printf("<-- %d", index[p]);
p=index[p];
}
printf("\n");
}