卒論

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<limits.h>
#include"C:/Users/桃香/source/cpm_frm/header/random.h"
#include"C:/Users/桃香/source/cpm_frm/header/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];
/************************************************************************/
/************************************************************************/
void Load_Data()
{
	int 	i;
	FILE	*fp_out;
	char	fname[STR_MAX];
	sprintf(fname, "C:/Users/桃香/source/cpm_frm/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]);
		}
	}
	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]);
		}
	}

}

	
/************************************************************************/
/************************************************************************/
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  Std_Day[Proc_MAX], Std_Cost[Proc_MAX];
	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, "C:/Users/桃香/source/cpm_frm/out_dat/CPM.csv");
	fp_in = load_file(fname);
	if (fp_in == NULL) {
		printf("Cant open file !\n");
		exit(0);
	}
	for (j = 1; j <= Num_Proc; j++) {
		for (i = 1; i <= Num_Worker; i++) {
			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;
			}
		}
		if (flag == 0) {
			Std_Day[j] = Ave_Proc[j] + 2.*Var_Proc[j];
			Std_Cost[j] = Ave_Cost[j] - 2.*Var_Cost[j];
		}
		if (flag == 1) {
			Std_Day[j] = Var_Proc[j];
			Std_Cost[j] = Ave_Cost[j];
		}
	}
	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]);
		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_CR[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,"C:/Users/桃香/source/cpm_frm/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, "C:/Users/桃香/source/cpm_frm/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_BL[i][j][k], Fuzzy_BC[i][j][k], Fuzzy_BR[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, "C:/Users/桃香/source/cpm_frm/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]);/*intからdoubleへの変換*/
					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]));
				}
				Save_Data(personal, i);
			}
		}
	}
	Fuzzy_Data();
	printf("Finish! \n");
	getchar();
	getchar();
	return(0);
}

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS