前提・実現したいこと
Pythonのpulpを使って1機械重み付き完了時刻和ジョブスケジューリングを実装したいと思っています。
それぞれ
・処理時間p
・重要度w
・リリース時刻r
・処理開始時刻s
・順序を表すx
エラーメッセージは出ませんが、以下のコードで実装すると、sがrと同じ数値になってしまいます。
発生している問題・エラーメッセージ
ジョブ 1 を処理するのは 4 番目で作業開始時刻は 4.0 ジョブ 2 を処理するのは 8 番目で作業開始時刻は 63.0 ジョブ 3 を処理するのは 8 番目で作業開始時刻は 39.0 ジョブ 4 を処理するのは 10 番目で作業開始時刻は 70.0 ジョブ 5 を処理するのは 9 番目で作業開始時刻は 77.0 ジョブ 6 を処理するのは 10 番目で作業開始時刻は 112.0 ジョブ 7 を処理するのは 8 番目で作業開始時刻は 62.0 ジョブ 8 を処理するのは 6 番目で作業開始時刻は 6.0 ジョブ 9 を処理するのは 6 番目で作業開始時刻は 9.0 ジョブ 10 を処理するのは 8 番目で作業開始時刻は 6.0 Obj.value 2081.0
該当のソースコード
Python
1def main(): 2 3 assignment = pulp.LpProblem("minimize_weight_job_cost", pulp.LpMinimize 4# 変数宣言 5 6 #x[j][k]を定義 7 x=[[0 for j in range(job_num)]for k in range(job_num)] 8 for k in range(job_num): 9 for j in range(job_num): 10 x[k][j] = pulp.LpVariable(f"x({k},{j})", 0, 1, pulp.LpInteger) 11 12 #sを定義 13 s = [None for i in range(job_num)] 14 for i in range(job_num): 15 s[i] = pulp.LpVariable(f"s_{i}" , 0 , sys.maxsize , pulp.LpContinuous) 16 17 #Cを定義 18 C = s + p 19 #for i in range(job_num): 20 #C += [pulp.LpVariable(f"c_{i}" , 0 , sys.maxsize , pulp.LpContinuous)] 21 22 23# 目的関数 24 assignment += sum(w[j] * C[j] for j in range(job_num)) 25# 1本目 26 for j in range(job_num): 27 assignment += C[j] == s[j] + p[j] 28 29# 2本目 30 for j in range(job_num): 31 assignment += s[j] >= r[j] 32 33# 3本目 34 for j in range(job_num): 35 for k in range(job_num): 36 for i in range(job_num): 37 assignment += s[j] >= r[k] * x[k][j] + sum(p[i] * (x[i][j] - x[i][k])) 38 39# 4本目 40 for j in range(job_num): 41 for k in range(job_num): 42 if j != k: 43 assignment += x[j][k] + x[k][j] == 1 44 45# 5本目 46 for i in range(job_num): 47 for j in range(job_num): 48 if i != j: 49 for k in range(job_num): 50 if i != k and j != k: 51 assignment += x[j][k] + x[k][i] + x[i][j] <= 2 52 53 54 55 56#順番 57 job = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 58 for j in range(job_num): 59 for k in range(job_num): 60 if x[j][k].value() == 1: 61 job[j] -= 1 62 job[j] += int(job_num) 63 64 65#結果の出力 66 print(pulp.LpStatus[status]) 67 68 for i in range(job_num): 69 print("ジョブ",i + 1,"を処理するのは",job[i],"番目で作業開始時刻は",s[i].value()) 70 71 print("Obj.value", assignment.objective.value()) 72 73 74 75 76 77if __name__=="__main__": 78 main()
あなたの回答
tips
プレビュー