評価値を決める際の、時間の計算方法が全くわかりません。
具体的なジョブの表は下の通りになっています。
┏━━━┳━━━━━┳━━━━━┳━━━━━┳
┃ ┃ 第1工程 ┃ 第2工程 ┃第3工程 ┃
┣━━━╋━━━━━╋━━━━━╋━━━━━╋
┃ジョブ1┃機械1 (14)┃機械2 (4) ┃機械3 (8) ┃
┣━━━╋━━━━━╋━━━━━╋━━━━━╋
┃ジョブ2┃機械1 (4) ┃機械3 (10) ┃機械2 (10) ┃
┣━━━╋━━━━━╋━━━━━╋━━━━━╋
┃ジョブ3┃機械2 (6) ┃機械3 (16) ┃機械1 (4) ┃
┣━━━╋━━━━━╋━━━━━╋━━━━━╋
┃ジョブ4┃機械2 (10)┃機械1 (8) ┃機械3 (4) ┃
┗━━━┻━━━━━┻━━━━━┻━━━━━┻
自分が考えた構想としては、
機械1,2,3のジョブを行う順番を遺伝子に置き換え、
機械1,2,3の初期集団をに50個(仮)ずつ生成します。
例) 機械1の遺伝子(1,2,3,4) 機械2の遺伝子(1,2,3,4) 機械3の遺伝子(1,2,3,4)
この生成した50個(仮)の個体の遺伝子をランダムに入れ替え、これを初期集団としています。
次に、それぞれ生成した初期集団の先頭を見てジョブを実行し、総合の実行時間から評価値を決めます。
考え方としては、総合時間をtとし、whileの総合ループ数がジョブの総合時間と考えています。
ok配列と機械の番号を比較し、条件が揃えばジョブが実行できると判断してジョブ時間を機械の番号と対応しているt1,t2,t3それぞれに代入。
1回ループが終わるたびにt1,t2,t3に値が入っていれば-1をし、0になれば、また実行可能になったと判断し、処理部分に入りジョブを実行して計算させるといものです。
この部分の実行時間の計算の処理方法が上手く行かず悩んでおります。
具体的には、機械1が行うジョブの時間が機械2(t2)に代入されていたり等です。
お力をお貸しください
今現在プログラムはこのようになっています
かなり中途半端に書いているため、読みにくいかもしれません
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main(){
struct job{
int x; //機械番号
int y; //ジョブ時間
};
int pop1[10][4]; //機械1の初期個体
int pop2[10][4]; //機械2の初期個体
int pop3[10][4]; //機械3の初期個体
int mixs,mix1,mix2,tmp; //染色体を入れ替える際に使用
int k1=0,k2=0,k3=0;
int t=0,t1=0,t2=0,t3=0; //時間を格納
int ok[4][3]; //実行可能か判断する配列
struct job J[4][3]; //ジョブ表を格納する構造体配列
int i=0,j=0; //添え字
int s=0;
//ジョブ表のデータ化
J[0][0].x = 1;
J[0][1].x = 2;
J[0][2].x = 3;
J[1][0].x = 1;
J[1][1].x = 3;
J[1][2].x = 2;
J[2][0].x = 2;
J[2][1].x = 3;
J[2][2].x = 1;
J[3][0].x = 2;
J[3][1].x = 1;
J[3][2].x = 3;
J[0][0].y = 14;
J[0][1].y = 4;
J[0][2].y = 8;
J[1][0].y = 4;
J[1][1].y = 10;
J[1][2].y = 10;
J[2][0].y = 6;
J[2][1].y = 16;
J[2][2].y = 4;
J[3][0].y = 10;
J[3][1].y = 8;
J[3][2].y = 4;
//実行可能状態の配列の初期化
for(i=0;i<4;i++){
for(j=0;j<3;j++){
if(j == 0){
ok[i][j] = 1; //先頭が実行可能として初期化
}else ok[i][j] = 0;
}
}
// 初期集団の生成
//機械1の初期個体
for(i = 0; i < 10; i++){
for(j = 0; j < 4; j++){
pop1[i][j] = j+1; //ジョブ番号を格納
}
}
srand((unsigned) time(NULL));
//染色体をランダムに入れ替え
for(i = 0; i < 10; i++){
mixs = rand() % 10;
for(j = 0; j < mixs; j++){
mix1 = rand() % 4;
mix2 = rand() % 4;
tmp = pop1[i][mix1];
pop1[i][mix1] = pop1[i][mix2];
pop1[i][mix2] = tmp;
}
}
//機械2初期個体
for(i = 0; i < 10; i++){
for(j = 0; j < 4; j++){
pop2[i][j] = j+1;
}
}
for(i = 0; i < 10; i++){
mixs = rand() % 4;
for(j = 0; j < mixs; j++){
mix1 = rand() % 4;
mix2 = rand() % 4;
tmp = pop2[i][mix1];
pop2[i][mix1] = pop2[i][mix2];
pop2[i][mix2] = tmp;
}
}
//機械3の初期個体の生成
for(i = 0; i < 10; i++){
for(j = 0; j < 4; j++){
pop3[i][j] = j+1;
}
}
for(i = 0; i < 10; i++){
mixs = rand() % 4;
for(j = 0; j < mixs; j++){
mix1 = rand() % 4;
mix2 = rand() % 4;
tmp = pop3[i][mix1];
pop3[i][mix1] = pop3[i][mix2];
pop3[i][mix2] = tmp;
}
}
//ここから先が出来ていない部分↓
//適応度の計算
for(s=0;s<10;s++){ //個体数の数だけループ
while(1){ //処理が出来なくなるまでループ
for(i=0;i<4;i++){
for(j=0;j<3;j++){
if(t1 == 0){ //機械1処理部 //ジョブがt1 > 0ならばジョブが実行していると判断し、処理に入らない
if(ok[i][j] == 1 && J[pop1[k1][j]][j].x == 1){ //ok配列と、実行する機械が一致しているかを比較し、条件に一致するならば処理処理に入る。
t1 = J[i][j].y; //ジョブ時間を代入
if(j < 3){
ok[i][j] = 0; //実行可能状態から、非実行可能状態に変更
ok[i][j+1] = 1; //一つ右のジョブを実行可能状態に変更
}
}
}
if(t2 == 0){ //機械2処理部
if(ok[i][j] == 1 && J[pop2[k2][j]][j].x == 2){
t2 = J[i][j].y;
if(j < 3){
ok[i][j] = 0;
ok[i][j+1] = 1;
}
}
}if(t3 == 0){ //機械3処理部
if(ok[i][j] == 1 && J[pop3[k3][j]][j].x == 3){
t3 = J[i][j].y;
if(j < 3){
ok[i][j] = 0;
ok[i][j+1] = 1;
}
}
}
}
}
if(t1 > 0) t1--;
if(t2 > 0) t2--;
if(t3 > 0) t3--;
t++;
s++;
}
return 0;
}