Untitled
unknown
plain_text
2 months ago
4.6 kB
10
Indexable
import math import gurobipy as gp from gurobipy import GRB import time def read_instance(instance_name): with open(instance_name, 'r') as file: n = int(file.readline()) m = int(file.readline()) processing_times = [] release_dates = [] due_dates = [] w1 = [] w = [] for line in range(n): parts = list(map(int, file.readline().split())) processing_times.append(parts[0]) release_dates.append(parts[1]) due_dates.append(parts[2]) w1.append(parts[3]) w.append(parts[4]) return n, m, processing_times, release_dates, due_dates, w1, w def disjunctive_model(n, m, p, r, d, w1, w): # Define the model model = gp.Model('disjunctive_E_T') #model name #scheduling horizon T = max(d) + max(p) + math.ceil(sum(p)/m) # model variables x = gp.tupledict() for i in range(m): for j in range(n): x[i, j] = model.addVar(vtype=GRB.INTEGER, lb = 0, name=f"x_{i}_{j}") z = gp.tupledict() for i in range(m): for j in range(n): for k in range(n): z[i,j,k] = model.addVar(vtype = GRB.BINARY, name = f"z_{i}_{j}_{k}") y1 = gp.tupledict() for j in range(n): y1[j] = model.addVar(vtype = GRB.INTEGER, lb = 0, name = f"y1_{j}") y = gp.tupledict() for j in range(n): y[j] = model.addVar(vtype = GRB.INTEGER, lb = 0, name = f"y_{j}") # register the variables model.update() # define V as a big number V = sum(p[j] for j in range(n)) # model objective function model.setObjective(gp.quicksum(w1[j] * y1[j] + w[j] * y[j] for j in range(n)), GRB.MINIMIZE) # model constraints model.addConstrs( ((d[j] - sum(x[i,j] for i in range(m))) <= y1[j] for j in range(n)) , name="Earliness_Constraint" ) model.addConstrs( ((sum(x[i,j] for i in range(m)) - d[j]) <= y[j] for j in range(n)) , name="Tardiness_Constraint") #model.addConstrs((sum(x[i,j] for i in range(m)) >= r[j] for j in range(n)), name= "Release_Constraint") for i in range(m): for j in range(n): for k in range(n): if k > j: model.addConstr((x[i,j] >= x[i,k] + p[k] - V*z[i,j,k]), name = f"Precedence_Constraint_1_{i}_{j}_{k}") for i in range(m): for j in range(n): for k in range(n): if k > j: model.addConstr((x[i,k] >= x[i,j] + p[j] - V*(1 - z[i,j,k])), name = f"Precedence_Constraint_2_{i}_{j}_{k}") #set time limit model.setParam("TimeLimit", 300) start_time = time.time() model.optimize() end_time = time.time() model.write("Model.lp") model.write("Model.sol") status = GRB.OPTIMAL objective = model.ObjVal if model.Status == GRB.TIME_LIMIT: runtime = 'Time limit exceeded' else: r_time = end_time - start_time runtime = f"{r_time:.4f} secondi" # Extract the results results = [] for i in range(m): for j in range(n): start_time = x[i,j] end_time = start_time + p[j] earliness = y1[j] tardiness = y[j] results.append((range(1,n+1), start_time, end_time, earliness, tardiness)) break return(status, objective, results, runtime) # Write the results to a file def output_results(status, objective, results, runtime): with open("results.txt", "w") as file: file.write("Model status = " + str(status)) file.write("\nExecution time = " + runtime) file.write("\nObjective function value = "+ str(objective)) file.write("\nJob\tStart\tEnd\tEarliness\tTardiness\n") for job, start, end, earliness, tardiness in results: file.write(f"{job}\t{start}\t{end}\t{earliness}\t{tardiness}\n") return file # Run the functions and print the results instance_name = "2m_wetrs_10_0_5_25_1.dat" n, m, p, r, d, w1, w = read_instance(instance_name) status, objective, results, runtime = disjunctive_model(n, m, p, r, d, w1, w) file = output_results(status, objective, results, runtime)
Editor is loading...
Leave a Comment