Untitled

 avatar
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