Untitled
unknown
plain_text
8 months ago
4.6 kB
11
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