ジョブショップスケジューリング問題について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
西花
記事: 4
登録日時: 8年前

ジョブショップスケジューリング問題について

#1

投稿記事 by 西花 » 8年前

C言語で、ジョブショップスケジューリング問題をGAを用いて解こうと思っているのですが
評価値を決める際の、時間の計算方法が全くわかりません。
具体的なジョブの表は下の通りになっています。
┏━━━┳━━━━━┳━━━━━┳━━━━━┳
┃   ┃ 第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;
}
最後に編集したユーザー 西花 on 2017年1月15日(日) 12:15 [ 編集 4 回目 ]

Math

Re: ジョブショップスケジューリング問題について

#2

投稿記事 by Math » 8年前

取り敢えずいま出来ているC言語のプログラムを見せてください。(それと一応ここの”ルール”http://dixq.net/board/board.htmlを読んでそれに則って質問された方が分かり易いと思われます。)

誰かの学士論文に

[遺伝アルゴリズム(Genetic Algorithm: GA)] とは, 問題の解に相当するものを記号列と
して表現した染色体を考え, 個々の染色体をもつ個体が生存する環境を想定し, 生物の遺伝
機構と自然選択を比較的忠実に模倣して, 個体集合による離散的な探索空間での適応や最適
化を扱う. 個体間で遺伝情報を交換する交叉演算を用いて新しい探索点を生成することを特
徴としている.

とあって面白そうですね。

西花
記事: 4
登録日時: 8年前

Re: ジョブショップスケジューリング問題について

#3

投稿記事 by 西花 » 8年前

返信ありがとうございます。
質問内容を修正しました。

Math

Re: ジョブショップスケジューリング問題について

#4

投稿記事 by Math » 8年前

エラーはないのですが延々と0が出るだけで意味が分かりません。プログラムに説明を入れて下さいませんか。出来るだけ詳しくお願い致します。

コード:

///--------------------------------------------------------------------------------
#include <stdio.h>///[ C言語で、ジョブショップスケジューリング問題をGAを用いて解く]
#include <stdlib.h>//<評価値を決める際の、時間の計算方法が全くわかりません>
#include <time.h>////  :具体的なジョブの表あり:
#include <math.h>////  :機械1,2,3のジョブを行う順番を遺伝子に置き換える:
///----------------//
int main(){//////////
                   //
    struct job{ //   構造体:タグ名=job
        int x; //機械番号  :メンバ=x
        int y; //ジョブ時間:メンバ=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]; //ジョブ表を格納する構造体配列: job=4:機械番号=3
    int i=0,j=0; //添え字
 
    //ジョブ表のデータ化①        4-job=y(time)   3-工程   3-機械=x
    J[0][0].x = 1;//           ┏━━━━┳━━━━━━┳━━━━━━┳━━━━━┳
    J[0][1].x = 2;//           ┃        ┃ 第1工程   ┃ 第2工程   ┃ 第3工程 ┃
    J[0][2].x = 3;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[1][0].x = 1;//           ┃ジョブ1┃機械1 (14) ┃機械2 (4)  ┃機械3 (8 ┃
    J[1][1].x = 3;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[1][2].x = 2;//           ┃ジョブ2┃機械1 (4)  ┃機械3 (10)  ┃機械2 (10)┃
    J[2][0].x = 2;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[2][1].x = 3;//           ┃ジョブ3┃機械2 (6)  ┃機械3 (16)  ┃機械1 (4) ┃
    J[2][2].x = 1;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[3][0].x = 2;//           ┃ジョブ4┃機械2 (10) ┃機械1 (8)   ┃機械3 (4)┃
    J[3][1].x = 1;//           ┗━━━━┻━━━━━━┻━━━━━━┻━━━━━┻
    J[3][2].x = 3;//
                  //            J[ジョブ番号][工程番号].x=機械番号
    J[0][0].y = 14;//           -----------------------------------
    J[0][1].y = 4;//
    J[0][2].y = 8;//            J[ジョブ番号][工程番号].y=ジョブ時間
    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;
 
    // 初期集団の生成②
    //機械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;
        }
    }
 
    //適応度の計算⑩
 
    while(1){//Loop:終了条件?
 
        for(i=0;i<4;i++){ 
            for(j=0;j<3;j++){
                if(t1 = 0){ //機械1処理部
                    if( 1 == J[k1][j].x && ok[i][j] == 1){
                        t1 = J[i][j].y ;
                        if(j < 3){
                            ok[i][j] = 0;
                            ok[i][j+1] = 1;
                        }
                    }
                }
            }
        }
        printf("%d",t1);
        if(t1 > 0) t1--;
        
        t++;
    }
 
    return 0;
}
/*
機械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)に代入されていたり等です。
*/
///----------------------------------------------------------------------------

西花
記事: 4
登録日時: 8年前

Re: ジョブショップスケジューリング問題について

#5

投稿記事 by 西花 » 8年前

Math さんが書きました:エラーはないのですが延々と0が出るだけで意味が分かりません。プログラムに説明を入れて下さいませんか。出来るだけ詳しくお願い致します。

制作途中だったため、whileのbreak条件などを書いておりませんでした。申し訳ありません。
処理の部分が出来ていないため、ループはしないものと考えてください。

コード:

///--------------------------------------------------------------------------------
#include <stdio.h>///[ C言語で、ジョブショップスケジューリング問題をGAを用いて解く]
#include <stdlib.h>//<評価値を決める際の、時間の計算方法が全くわかりません>
#include <time.h>////  :具体的なジョブの表あり:
#include <math.h>////  :機械1,2,3のジョブを行う順番を遺伝子に置き換える:
///----------------//
int main(){//////////
                   //
    struct job{ //   構造体:タグ名=job
        int x; //機械番号  :メンバ=x
        int y; //ジョブ時間:メンバ=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]; //ジョブ表を格納する構造体の2次元配列: job=4:機械番号=3
    int i=0,j=0; //添え字
 
    //ジョブ表のデータ化①        4-job=y(time)   3-工程   3-機械=x
 //構造体の2次元配列でジョブ表を格納
    J[0][0].x = 1;//           ┏━━━━┳━━━━━━┳━━━━━━┳━━━━━┳
    J[0][1].x = 2;//           ┃        ┃ 第1工程   ┃ 第2工程   ┃ 第3工程 ┃
    J[0][2].x = 3;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[1][0].x = 1;//           ┃ジョブ1┃機械1 (14) ┃機械2 (4)  ┃機械3 (8 ┃
    J[1][1].x = 3;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[1][2].x = 2;//           ┃ジョブ2┃機械1 (4)  ┃機械3 (10)  ┃機械2 (10)┃
    J[2][0].x = 2;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[2][1].x = 3;//           ┃ジョブ3┃機械2 (6)  ┃機械3 (16)  ┃機械1 (4) ┃
    J[2][2].x = 1;//           ┣━━━━╋━━━━━━╋━━━━━━╋━━━━━╋
    J[3][0].x = 2;//           ┃ジョブ4┃機械2 (10) ┃機械1 (8)   ┃機械3 (4)┃
    J[3][1].x = 1;//           ┗━━━━┻━━━━━━┻━━━━━━┻━━━━━┻
    J[3][2].x = 3;//
                  //            J[ジョブ番号][工程番号].x=機械番号
    J[0][0].y = 14;//           -----------------------------------
    J[0][1].y = 4;//
    J[0][2].y = 8;//            J[ジョブ番号][工程番号].y=ジョブ時間
    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;
 
    // 初期集団の生成② //ジョブを実行させるために、機械1のジョブ番号を、遺伝子と置き換えた個体を10個生成。
    //機械1の初期個体③ //配列に1から順番に数字を入れていく
    for(i = 0; i < 10; i++){
        for(j = 0; j < 4; j++){
            pop1[i][j] = j+1; //ジョブ番号を格納④ //ジョブ番号が分かりやすいように、0,1,2,3ではなく+1して1,2,3,4を遺伝子とする。
        }
    }
    srand((unsigned) time(NULL));
 
    //染色体をランダムに入れ替え⑤ //この状態では全ての個体が1,2,3,4の遺伝子なので、ランダムに入れ替える。
    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初期個体⑥ //上記同様、同じ方法で機械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;
        }
    }

	printf("機械1 遺伝子: "); //機械1の先頭個体の遺伝子を表示
	for(i=0;i<1;i++){
		for(j=0;j<4;j++){
			printf("%d ",pop1[i][j]);
		}
		printf("\n");
	}
	printf("機械2 遺伝子: "); //機械2の先頭個体の遺伝子を表示
	for(i=0;i<1;i++){
		for(j=0;j<4;j++){
			printf("%d ",pop2[i][j]);
		}
		printf("\n");
	}
	printf("機械3 遺伝子: "); //機械3の先頭個体の遺伝子を表示
	for(i=0;i<1;i++){
		for(j=0;j<4;j++){
			printf("%d ",pop3[i][j]);
		}
		printf("\n");
	}
 
    //適応度の計算⑩ // 適応度の計算を行う。ジョブの総合時間が、少なければ少ないほど良い組み合わせなので、評価値が高い。
 
   //	for(s=0;s<10;s++){
	//while(s < 2){

		for(i=0;i<4;i++){ 
			for(j=0;j<3;j++){
				if(t1 == 0){	//機械1処理部
					if(ok[pop1[k1][j]-1][j] == 1 && J[pop1[k1][j]-1][j].x == 1){ //機械番号とok配列を比較し、実行可能ならばt1にジョブ時間を代入
						t1 = J[pop1[k1][j]-1][j].y;                             //機械1の処理部なので、機械番号は1で固定

						if(j < 3){ 
							ok[pop1[k1][j]-1][j] = 0; //実行した場所を非実行可能状態に変更
							ok[pop1[k1][j]-1][j+1] = 1; ////実行可能状態を右にひとつずらす
						}
						else if(j == 2) ok[pop1[k2][j]-1][j] = 0; //一番最後までジョブが終わった場合、その部分を非実行可能状態に変更
					}
				}
				if(t2 == 0){	//機械2処理部
					if(ok[pop2[k2][j]-1][j] == 1 && J[pop2[k2][j]-1][j].x == 2){
						t2 = J[pop2[k2][j]-1][j].y;
						
						if(j < 3){
							ok[pop2[k2][j]-1][j] = 0;
							ok[pop2[k2][j]-1][j+1] = 1;
						}
						else if(j == 3) ok[pop2[k2][j]-1][j] = 0;
					}
				}if(t3 == 0){	//機械3処理部
					if(ok[pop3[k1][j]-1][j] == 1 && J[pop3[k3][j]-1][j].x == 3){
						t3 = J[pop2[k3][j]-1][j].y;
						if(j < 3){
							ok[pop3[k3][j]-1][j] = 0;
							ok[pop3[k3][j]-1][j+1] = 1;
						}
						else if(j == 3) ok[pop3[k2][j]-1][j] = 0;
					}
				}
			}
		}
	
		printf("%d %d %d",t1,t2,t3); //ジョブ時間に何が代入されているか表示
		if(t1 > 0) t1--;
		if(t2 > 0) t2--;
		if(t3 > 0) t3--;
	t++;
	s++;
	//}

	return 0;
}
/*
機械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)に代入されていたり等です。
*/
///----------------------------------------------------------------------------

Math

Re: ジョブショップスケジューリング問題について

#6

投稿記事 by Math » 8年前

コメントをプログラムに説明として書いてください。最低限のプログラム原則です。


Math

Re: ジョブショップスケジューリング問題について

#8

投稿記事 by Math » 8年前

なにか参考にしてるホームページとか文献がありますか。

西花
記事: 4
登録日時: 8年前

Re: ジョブショップスケジューリング問題について

#9

投稿記事 by 西花 » 8年前

あまり参考にした文献はないのですが
http://www.kochi-tech.ac.jp/library/ron ... 100303.pdf
こちらのPDFの内容と同じような形で、プログラムを組んでみたいと考えています

閉鎖

“C言語何でも質問掲示板” へ戻る