前提・実現したいこと
多腕バンディット問題をc言語で扱うプログラムをLinux環境でコンパイル・実行しようとしています。
エディタはemacsでコンパイラはgccを使っています。
エラーメッセージがないため解決方法が分からず質問させていただきました。
どなたかご回答お願いします。m(__)m
発生している問題・エラーメッセージ
コンパイルまではできるのですが、実行するとエラーメッセージは何も出ず、そのまま止まってしまいます。
処理に時間がかかっているのかと思い待ちましたが全く進みません。
該当のソースコード
c
1#include<stdio.h> 2#include<time.h> 3#define M (5) 4#define N (500) 5#define L (100) 6 7int ID[L][N]; 8int Reward[L][N]; 9double ave_R[N]; 10double CDR[N]; 11double mu[L][M]; 12double R[L][M]; 13double T[L][M]; 14 15/* Mersenne Twister */ 16void init_genrand64(unsigned long long seed); // initialzes mt 17long long genrand64_int63(void); // generates a random number on [0, 2^63-1]-interval 18double genrand64_real1(void); 19 20int mySlotMachine( int id, double *p ){ 21 if(p[id] > genrand64_real1()) 22 return 1; 23 else return 0; 24} 25 26int main(void){ 27 int n, l, k, s, i, a; 28 double r, e, E, max; 29 30 unsigned long long seed; 31 double p[M+1]={ -1, 0.3, 0.1, 0.9, 0.7, 0.5 }; // 確率は固定.p[0] は欠番 32 seed = (unsigned long long)time(NULL); 33 init_genrand64( seed ); 34 35 for(e = 1; e < 11; e++){ 36 a = e; 37 if(e == 0) 38 E = 0; 39 else 40 E = e / 10; 41 42 for(l = 0; l < L; l++){ 43 44 for(n = 0; n < N; n++){ 45 r = genrand64_real1(); 46 max = 0.0; 47 48 if(r < E)//探索フェーズ 49 { 50 k = genrand64_int63() % M; 51 ID[l][n] = k + 1; 52 T[l][k] += 1; 53 Reward[l][n] = mySlotMachine(k, p);//スロットの結果 54 R[l][k] += Reward[l][n]; 55 mu[l][k] = R[l][k] / T[l][k]; 56 } 57 else //活用フェーズ 58 { 59 s = 0; 60 for(i = 0; i < M; i++){ 61 if(max < mu[l][i]){ 62 s = i; 63 max = mu[l][i]; 64 } 65 } 66 67 ID[l][n] = s + 1; 68 T[l][s] += 1; 69 Reward[l][n] = mySlotMachine(s, p);//スロットの結果 70 R[l][s] += Reward[l][n]; 71 mu[l][s] = R[l][s] / T[l][s]; 72 } 73 } 74 } 75 double sum[N]; 76 //平均報酬 77 sum[0] = 0; 78 for(l = 0; l < L; l++) 79 sum[0] += Reward[l][0]; 80 81 for(n = 1; n < N; n++){ 82 sum[n] = sum[n-1]; 83 for(l = 0; l < L; l++){ 84 sum[n] += Reward[l][n]; 85 } 86 } 87 88 for(n = 0; n < N; n++) 89 ave_R[n] = sum[n] / (L*(n+1)); 90 91 //平均正答率 92 for(n = 0; n < N; i++){ 93 sum[n] = 0; 94 for(l = 0; l < L; l++){ 95 if(ID[l][n] == 3) 96 sum[n] += 1; 97 } 98 } 99 100 for(n = 0; n < N; n++) 101 CDR[n] = sum[n] / L; 102 103 printf("%f %f %f\n",E, ave_R[N-1], CDR[N-1]); 104 } 105 106 107 return 0; 108} 109
試したこと
https://teratail.com/questions/296945
この質問と状況が似ていたため、ローカル変数をグローバル変数に変えました、が上手くいきませんでした。
補足情報
Ubuntu18.04 LTSでLinux環境を使い、エディタはemacsコンパイルにはgccコンパイラを使用しています。
コードの最初の方にある/* Mersenne Twister */の部分には配布された別のプログラムが必要で、それも一緒にコンパイルしています。別のプログラムと一緒にそのプログラムをコンパイルしたときには問題なく実行までできていたのでそのプログラムには問題がないと思われます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/02 07:12
2020/12/02 07:20
2020/12/02 08:03