複雑ネットワークの勉強をしている者です。
Cでバラバシモデルの作成を行っておりますが、Pajekを使いCで書いたプログラムを動かしたいのです。
しかし、最終頂点数が20を超えると動かなかったり、クラスター係数が出なくなったりします。
原因は、
(1)i,jの値が重なっている
(2)同じ組み合わせが出現する
ことだと思われます。
(1)(2)が出なくなるプログラムにする方法を教えてください。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void ba_model(int N, int m0, int m);
int sum(int *data, int n);
int main(int argc, char *argv[])
{
int N;
int m0=atoi(argv[1]);
int m=atoi(argv[2]);
char filename[18]="ba_model.net";
FILE *fp;
if(argc == NULL) exit(0);
printf("Input Vertex Size: ");
scanf("%d", &N);
printf("Vertex Size: %d\n",N);
printf("Initial Vertex: %d\n",m0);
printf("Edge Number: %d\n",m);
fp=fopen(filename, "w");
fprintf(fp, "*Vertices %d\n", N);
fprintf(fp, "*Edges\n");
fclose(fp);
ba_model(N, m0, m);
return 0;
}
void ba_model(int N, int m0, int m) {
int i, j, n;
int output_degree[100];
int edge_number;
double p;
char filename[18]="bamodel.net";
FILE *fp;
fp=fopen(filename, "a");
if(fp==NULL) {
printf("Error FileOpen\n");
} else {
printf("FileOpen OK:%s\n",filename);
}
srand(time(NULL));
printf("乱数初期化OK\n");
printf("N=%d, m0=%d, m=%d\n",N,m0,m);
for(i=0; i<N; i++) {
edge_number=0;
for(j=m0; j<N; j++) {
p=(double)(output_degree[j]+1)/(double)sum(output_degree, i);
printf("p(%d)=%lf\n",j,p);
if(p > (double)rand()/RAND_MAX) {
output_degree[i]++;
output_degree[j]++;
edge_number++;
if((i+1)!=(j+1)) {
printf("%d %d 1\n", i+1, j+1);
}else{
break;
}
}
if( m < edge_number )
break;
}
}
fclose(fp);
}
int sum(int *data, int n) {
int k;
int sum=0;
printf("In Sum: n=%d\n",n);
if(n==0) {
sum = 1;
}
for(k=0; k<n; k++) {
printf("k=0 n=0\n");
sum = sum + data[k] + 1;
}
return sum;
}
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
> (1)(2)が出なくなるプログラムにする方法を教えてください。
> (1)i,jの値が重なっている
自己ループを含まない無向グラフでよければ,i<j となるように制限する.
> (2)同じ組み合わせが出現する
どの辺を生成したかを覚えておく必要がある.
自己ループを含まない無向グラフにおいて,頂点 i,j (0 ≦ i < j < N)
の間に辺があれば,その辺番号を次の関数で定義する.
int EdgeID(int i, int j)
{
return j * (j - 1) / 2 + i;
}
辺番号の範囲は 0 ~ EdgeID(N-2, N-1) - 1 なので,
// 辺の最大数 (辺番号の最大値+1)
int maxEdges = EdgeID(N - 2, N - 1) + 1;
// 辺が存在するか否かを示すフラグの配列
char *EdgeExists = calloc(1, (size_t)maxEdges);
とする.辺 (i, j) を追加しようとしたとき,
まず eid = EdgeId(i, j) を計算し,
・まだその辺が存在しない (EdgeExists[eid] == 0) ならば
EdgeExists[eid] に0以外の値をセットし,辺を追加する.
・既に存在しているならば追加しない.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
(int *)の意味
-
数字列を3桁ごとにカンマで区切...
-
比較回数と交換回数表示について
-
if と配列の組み合わせ
-
C言語で三目並べをするプログラ...
-
実数の整数部,小数部の取得
-
卒業研究でよく分からないとこ...
-
C言語で分からないところがあり...
-
C言語での奇数の和
-
アスタリスクで正方形
-
警告 W8065について。
-
入力された2つの整数の差を絶対...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
C言語
-
C言語初心者です、、、お助けく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報