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