#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);
}

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS