#author("2018-12-06T14:12:34+09:00","","") #author("2018-12-06T14:48:59+09:00","","") [[卒論]] 内容:ファジィ・ランダム変数の等価変換に必要なパラメータの生成 (入力データ) 1.各工程の最小日数、最大日数(標準日数)と平均日数 2.各工程の最小費用(標準費用)、最大費用とその平均費用 3.属性数(晴れ/雨/雪) 4.従事者数 (出力データ) 1.日数tに関するファジィ・ランダム変数のメンバシップ関数のL.C.R(広がりと中心値) 2.費用勾配cに関するファジィ・ランダム変数のメンバシップ関数のL.C.R(広がりと中心値) 3.費用切片bに関するファジィ・ランダム変数のメンバシップ関数のL.C.R(広がりと中心値) #include<stdio.h> #include<math.h> #include<limits.h> #include"../../hdr/random.h" #include"../../hdr/util_okuhara.h" #ifdef _Cdecl #define drand() ((double)(rand() + 1) / 0x7fff - 0.5) #else #define drand() ((double)(rand() + 1) / 0x7fffffff - 0.5) #endif #define SEED 32767 #define STR_MAX 256 #define Proc_MAX 105 //最大作業工程数 #define Worker_MAX 105 //最大作業者数 #define Attri_MAX 5 #define ITE_MAX 105 //最大繰り返し回数 struct particle{ int process; //作業工程 int attribute; //属性 int period; int reward; }; static unsigned long seed = 1; /* 任意 */ int flag, Num_Proc, Num_Worker, Num_Attri; double Ave_Proc[Proc_MAX], Var_Proc[Proc_MAX]; double Ave_Cost[Proc_MAX], Var_Cost[Proc_MAX]; double Std_Day[Proc_MAX], Std_Cost[Proc_MAX]; /************************************************************************/ /************************************************************************/ void Load_Data() { int i; FILE *fp_out; char fname[STR_MAX]; sprintf( fname, "../../out_dat/CPM.csv" ); fp_out = save_file( fname ); fclose(fp_out); printf("乱数は一様(0)、正規(1)\n"); scanf("%d", &flag); printf("作業工程数を入力\n"); scanf("%d", &Num_Proc); printf("作業従事者数を入力\n"); scanf("%d", &Num_Worker); printf("属性数を入力\n"); scanf("%d", &Num_Attri); if( flag == 0 ){ for( i = 1; i <= Num_Proc; i++ ){ printf("作業工程%dの最小を入力\n", i); scanf("%lf", &Ave_Proc[i]); printf("作業工程%dの最大を入力(標準作業時間)\n", i); scanf("%lf", &Var_Proc[i]); } for( i = 1; i <= Num_Proc; i++ ){ printf("作業賃金%dの最小を入力(標準費用)\n", i); scanf("%lf", &Ave_Cost[i]); printf("作業賃金%dの最大を入力\n", i); scanf("%lf", &Var_Cost[i]); } for( i = 1; i <= Num_Proc; i++ ){ Std_Day[i] = Ave_Proc[i] + 3.*sqrt(Var_Proc[i]); Std_Cost[i] = Ave_Cost[i] - 3.*sqrt(Var_Cost[i]); } } if( flag == 1 ){ for( i = 1; i <= Num_Proc; i++ ){ printf("作業工程%dの平均を入力\n", i); scanf("%lf", &Ave_Proc[i]); printf("作業工程%dの分散を入力(標準作業時間:mean+2sigma) \n", i); scanf("%lf", &Var_Proc[i]); } for( i = 1; i <= Num_Proc; i++ ){ printf("作業賃金%dの平均を入力(標準費用::mean-2sigma)\n", i); scanf("%lf", &Ave_Cost[i]); printf("作業賃金%dの分散を入力\n", i); scanf("%lf", &Var_Cost[i]); } for( i = 1; i <= Num_Proc; i++ ){ Std_Day[i] = Var_Proc[i]; Std_Cost[i] = Ave_Cost[i]; } } } /************************************************************************/ /************************************************************************/ void Fuzzy_Data() { int i, j, k; int wor, pro, att, per, rew; int count[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_L[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_R[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_C[Worker_MAX][Proc_MAX][Attri_MAX]; double trend, seppen; double Fuzzy_CL[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_CR[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_CC[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_BL[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_BR[Worker_MAX][Proc_MAX][Attri_MAX]; double Fuzzy_BC[Worker_MAX][Proc_MAX][Attri_MAX]; FILE *fp_in, *fp_out; char fname[STR_MAX]; if( flag == 0 ) sprintf( fname, "../../out_dat/CPM.csv" ); fp_in = load_file( fname ); if ( fp_in == NULL ){ printf ( "Cant open file !\n" ); exit(0); } for( i = 1; i <= Num_Worker; i++ ){ for( j = 1; j <= Num_Proc; j++ ){ for( k = 1; k <= Num_Attri; k++ ){ Fuzzy_L[i][j][k] = 10000.; Fuzzy_R[i][j][k] = -10000.; Fuzzy_C[i][j][k] = 0.; Fuzzy_CL[i][j][k] = 10000.; Fuzzy_CR[i][j][k] = -10000.; Fuzzy_CC[i][j][k] = 0.; Fuzzy_BL[i][j][k] = 10000.; Fuzzy_BR[i][j][k] = -10000.; Fuzzy_BC[i][j][k] = 0.; count[i][j][k] = 0; } } } while( fscanf( fp_in, "%d %d %d %d %d", &wor, &pro, &att, &per, &rew ) != EOF ){ count[wor][pro][att] ++; // 作業日数のファジィ if( per < Fuzzy_L[wor][pro][att] ) Fuzzy_L[wor][pro][att] = per; if( per > Fuzzy_R[wor][pro][att] ) Fuzzy_R[wor][pro][att] = per; Fuzzy_C[wor][pro][att] += per; // 費用効果の傾きのファジィ trend = (double)(rew-Std_Cost[pro])/(double)(per-Std_Day[pro]); printf("%lf(%d,%d,%d)\n", trend, wor, pro, att); if( trend < Fuzzy_CL[wor][pro][att] ) Fuzzy_CL[wor][pro][att] = trend; if( trend > Fuzzy_CR[wor][pro][att] ) Fuzzy_CR[wor][pro][att] = trend; Fuzzy_CC[wor][pro][att] += trend; // 費用効果の切片のファジィ seppen = Std_Cost[pro] - trend*Std_Day[pro]; if( seppen < Fuzzy_BL[wor][pro][att] ) Fuzzy_BL[wor][pro][att] = seppen; if( seppen > Fuzzy_BR[wor][pro][att] ) Fuzzy_BR[wor][pro][att] = seppen; Fuzzy_BC[wor][pro][att] += seppen; } fclose( fp_in ); for( i = 1; i <= Num_Worker; i++ ){ for( j = 1; j <= Num_Proc; j++ ){ for( k = 1; k <= Num_Attri; k++ ){ Fuzzy_C[i][j][k] /= (double)(count[i][j][k]); Fuzzy_CC[i][j][k] /= (double)(count[i][j][k]); Fuzzy_BC[i][j][k] /= (double)(count[i][j][k]); } } } sprintf( fname, "../../out_dat/CPM_Fuzzy_period.csv" ); fp_out = save_file( fname ); for( i = 1; i <= Num_Worker; i++ ){ for( j = 1; j <= Num_Proc; j++ ){ for( k = 1; k <= Num_Attri; k++ ){ fprintf( fp_out, "%d\t %d\t %d\t %lf\t %lf\t %lf\n", i, j, k, Fuzzy_L[i][j][k], Fuzzy_C[i][j][k], Fuzzy_R[i][j][k] ); } } } fclose(fp_out); sprintf( fname, "../../out_dat/CPM_Fuzzy_cost-period.csv" ); fp_out = save_file( fname ); for( i = 1; i <= Num_Worker; i++ ){ for( j = 1; j <= Num_Proc; j++ ){ for( k = 1; k <= Num_Attri; k++ ){ fprintf( fp_out, "%d\t %d\t %d\t %lf\t %lf\t %lf\t %lf\t %lf\t %lf\n", i, j, k, Fuzzy_CL[i][j][k], Fuzzy_CC[i][j][k], Fuzzy_CR[i][j][k], Fuzzy_BL[i][j][k], Fuzzy_BC[i][j][k], Fuzzy_BR[i][j][k] ); } } } fclose(fp_out); } /************************************************************************/ /************************************************************************/ void Save_Data(struct particle personal[], int i) { FILE *fp_out; char fname[STR_MAX]; sprintf( fname, "../../out_dat/CPM.csv" ); fp_out = save_add_file( fname ); fprintf( fp_out, "%d\t %d\t %d\t %d\t %d\n", i, personal[i].process, personal[i].attribute, personal[i].period, personal[i].reward ); fclose(fp_out); } /************************************************************************/ /************************************************************************/ //実数乱数 double frand(void) { double result; while((result=(double)rand()/RAND_MAX)>=1); return result; } /************************************************************************/ /************************************************************************/ int main(int argc, char **argv) { int i, j, k, l, total_data; struct particle personal[Worker_MAX]; //作業者ごとの活動履歴 srand(SEED); //乱数の初期化 Load_Data(); for( i = 1; i <= Num_Worker; i++ ){ for( j = 1; j <= ITE_MAX; j++ ){ if( frand() < 0.9 ){ k = Random(1, Num_Proc); personal[i].process = k; personal[i].attribute = Random(1, Num_Attri); if( flag == 0 ){ personal[i].period = Random( Ave_Proc[k], Var_Proc[k] ); personal[i].reward = Random( Ave_Cost[k], Var_Cost[k] ); } if( flag == 1 ){ personal[i].period = (int)(rand_normal( Ave_Proc[k], Var_Proc[k] )); personal[i].reward = (int)(rand_normal( Ave_Cost[k], Var_Cost[k] )); } if( ( (personal[i].period < Std_Day[k]) && (personal[i].reward > Std_Cost[k]) ) || ( (personal[i].period == Std_Day[k]) && (personal[i].reward == Std_Cost[k]) ) ){ Save_Data(personal, i); } } } } Fuzzy_Data(); printf("Finish! \n"); getchar(); getchar(); return(0); }