[docs]defgenerate_duration_matrix(num_jobs:int,num_machines:int,duration_range:tuple[int,int],rng:np.random.Generator|None=None,)->NDArray[np.int32]:"""Generates a duration matrix. Args: num_jobs: The number of jobs. num_machines: The number of machines. duration_range: The range of the duration values. rng: A numpy random number generator. Returns: A duration matrix with shape (num_jobs, num_machines). """rng=rngornp.random.default_rng()ifduration_range[0]>duration_range[1]:raiseValidationError("The lower bound of the duration range must be less than or equal ""to the upper bound.")ifnum_jobs<=0:raiseValidationError("The number of jobs must be greater than 0.")ifnum_machines<=0:raiseValidationError("The number of machines must be greater than 0.")returnrng.integers(duration_range[0],duration_range[1]+1,size=(num_jobs,num_machines),dtype=np.int32,)
[docs]defgenerate_machine_matrix_with_recirculation(num_jobs:int,num_machines:int,rng:np.random.Generator|None=None)->NDArray[np.int32]:"""Generate a machine matrix with recirculation. Args: num_jobs: The number of jobs. num_machines: The number of machines. rng: A numpy random number generator. Returns: A machine matrix with recirculation with shape (num_machines, num_jobs). """rng=rngornp.random.default_rng()ifnum_jobs<=0:raiseValidationError("The number of jobs must be greater than 0.")ifnum_machines<=0:raiseValidationError("The number of machines must be greater than 0.")num_machines_is_correct=Falsewhilenotnum_machines_is_correct:machine_matrix:np.ndarray=rng.integers(0,num_machines,size=(num_machines,num_jobs),dtype=np.int32)num_machines_is_correct=(len(np.unique(machine_matrix))==num_machines)returnmachine_matrix
[docs]defgenerate_machine_matrix_without_recirculation(num_jobs:int,num_machines:int,rng:np.random.Generator|None=None)->NDArray[np.int32]:"""Generate a machine matrix without recirculation. Args: num_jobs: The number of jobs. num_machines: The number of machines. rng: A numpy random number generator. Returns: A machine matrix without recirculation. """rng=rngornp.random.default_rng()ifnum_jobs<=0:raiseValidationError("The number of jobs must be greater than 0.")ifnum_machines<=0:raiseValidationError("The number of machines must be greater than 0.")# Start with an arange repeated:# m1: [0, 1, 2]# m2: [0, 1, 2]# m3: [0, 1, 2]machine_matrix=np.tile(np.arange(num_machines).reshape(1,num_machines),(num_jobs,1),)# Shuffle the columns:machine_matrix=np.apply_along_axis(rng.permutation,1,machine_matrix)returnmachine_matrix