IGJSP 0.0.4__py3-none-any.whl → 0.0.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
IGJSP/generador.py CHANGED
@@ -11,6 +11,7 @@ from pathlib import Path
11
11
  import networkx as nx
12
12
  import numpy as np
13
13
  from scipy.stats import expon, norm, uniform
14
+ from pprint import pprint
14
15
 
15
16
 
16
17
  def f(x):
@@ -26,11 +27,11 @@ class JSP:
26
27
  def __init__(self, jobs, machines, ProcessingTime=np.array([]), EnergyConsumption=np.array([]), ReleaseDateDueDate=np.array([]), Orden=np.array([])) -> None:
27
28
  self.numJobs = jobs
28
29
  self.numMchs = machines
29
- self.speed = ProcessingTime.shape[-1] if ProcessingTime else 0
30
+ self.speed = ProcessingTime.shape[-1] if ProcessingTime.size else 0
30
31
  self.ProcessingTime = ProcessingTime
31
32
  self.EnergyConsumption = EnergyConsumption
32
33
  self.Orden = Orden
33
- self.rddd = ReleaseDateDueDate.ndim - 1 if ReleaseDateDueDate else 0
34
+ self.rddd = ReleaseDateDueDate.ndim - 1 if ReleaseDateDueDate.size else 0
34
35
 
35
36
  def fill_random_values(self, speed, rddd, distribution, seed, tpm=[]):
36
37
  np.random.seed(seed)
@@ -49,10 +50,7 @@ class JSP:
49
50
 
50
51
  self.ProcessingTime = np.zeros((self.numJobs, self.numMchs, self.speed), dtype=int)
51
52
  self.EnergyConsumption = np.zeros((self.numJobs, self.numMchs, self.speed), dtype=int)
52
-
53
-
54
- if len(self.Orden) == 0:
55
- self.Orden = np.zeros((self.numJobs, self.numMchs), dtype=int)
53
+ self.Orden = np.zeros((self.numJobs, self.numMchs), dtype=int)
56
54
 
57
55
  if self.rddd == 0:
58
56
  release_date_tasks = np.array([0] * self.numJobs)
@@ -165,52 +163,56 @@ class JSP:
165
163
  json.dump(self.JSP, f, indent=4)
166
164
 
167
165
  def saveDznFile(self, InputDir, OutputDir):
168
- indexProblema = os.path.basename(os.path.normpath(OutputDir))
166
+ indexProblema = OutputDir.split("/")[-2]
167
+ OutputDir = "/".join(OutputDir.split("/")[:-2])
168
+ # indexProblema = os.path.basename(os.path.normpath(OutputDir))
169
169
  with open(f"{InputDir}", 'rb') as f:
170
170
  data: JSP = pickle.load(f)
171
- for t in [0, 1, 2]:
172
- for s0, sf, sp, s in [(2, 3, 1, 1), (0, 5, 2, 3), (0, 5, 1, 5)]:
173
- time = data.ProcessingTime[:, :, s0:sf:sp]
174
- energy = data.EnergyConsumption[:, :, s0:sf:sp]
175
- precedence = np.full((data.numJobs, data.numMchs), 0)
176
-
177
- replace_data = {
178
- "machines": data.numMchs,
179
- "jobs": data.numJobs,
180
- "Speed": s,
181
- "time": list(time.flatten()),
182
- "energy": list(energy.flatten())
183
- }
184
-
185
- if t == 1:
186
- replace_data["releaseDate"] = [data.ReleaseDueDate[job, :, 0].min() for job in range(data.numJobs)]
187
- replace_data["dueDate"] = [data.ReleaseDueDate[job, :, 0].max() for job in range(data.numJobs)]
188
- elif t == 2:
189
- replace_data["releaseDate"] = list(data.ReleaseDueDate[:, :, 0].flatten())
190
- replace_data["dueDate"] = list(data.ReleaseDueDate[:, :, 1].flatten())
191
-
192
- for job in range(data.numJobs):
193
- for i, prioridad in enumerate(range(data.numMchs)):
194
- precedence[job, data.Orden[job, prioridad]] = i
195
- replace_data["precedence"] = list(precedence.flatten())
196
-
197
- new_object = data.change_rddd_type(t).select_speeds(list(range(s0, sf, sp)))
198
-
199
- with open(f"./Minizinc/Types/RD/type{t}.dzn", "r", encoding="utf-8") as file:
200
- filedata = file.read()
201
- for kk, v in replace_data.items():
202
- filedata = filedata.replace("{" + kk + "}", str(v))
203
-
204
- os.makedirs(f"{OutputDir}", exist_ok=True)
205
-
206
- with open(f"{OutputDir}/{indexProblema}-{t}-{s}.dzn", "w+", encoding="utf-8") as new:
207
- new.write(filedata)
208
-
209
- with open(f"{OutputDir}/{indexProblema}", "wb") as new:
210
- pickle.dump(new_object, new)
171
+ # print(self.speed)
172
+ # for t in [0, 1, 2]:
173
+ t = data.rddd
174
+ for s in range(1,self.speed+1):
175
+ s0, sf, sp = [0,s,1]
176
+ time = data.ProcessingTime[:, :, s0:sf:sp]
177
+ energy = data.EnergyConsumption[:, :, s0:sf:sp]
178
+ precedence = np.full((data.numJobs, data.numMchs), 0)
179
+
180
+ replace_data = {
181
+ "machines": data.numMchs,
182
+ "jobs": data.numJobs,
183
+ "Speed": s,
184
+ "time": list(time.flatten()),
185
+ "energy": list(energy.flatten())
186
+ }
187
+ if t == 1:
188
+ replace_data["releaseDate"] = [data.ReleaseDueDate[job, 0] for job in range(data.numJobs)]
189
+ replace_data["dueDate"] = [data.ReleaseDueDate[job, 1] for job in range(data.numJobs)]
190
+ elif t == 2:
191
+ replace_data["releaseDate"] = list(data.ReleaseDueDate[:, :, 0].flatten())
192
+ replace_data["dueDate"] = list(data.ReleaseDueDate[:, :, 1].flatten())
193
+
194
+ for job in range(data.numJobs):
195
+ for i, prioridad in enumerate(range(data.numMchs)):
196
+ precedence[job, data.Orden[job, prioridad]] = i
197
+ replace_data["precedence"] = list(precedence.flatten())
198
+
199
+ new_object = data.change_rddd_type(t).select_speeds(list(range(s0, sf, sp)))
200
+ with open(f"./Minizinc/Types/RD/type{t}.dzn", "r", encoding="utf-8") as file:
201
+ filedata = file.read()
202
+ for kk, v in replace_data.items():
203
+ filedata = filedata.replace("{" + kk + "}", str(v))
204
+
205
+ os.makedirs(f"{OutputDir}/", exist_ok=True)
206
+
207
+ with open(f"{OutputDir}/{indexProblema}-{t}-{s}.dzn", "w+", encoding="utf-8") as new:
208
+ new.write(filedata)
209
+ # print(f"{OutputDir}/{indexProblema}")
210
+ # with open(f"{OutputDir}/{indexProblema}", "wb") as new:
211
+ # pickle.dump(new_object, new)
211
212
 
212
213
  def saveTaillardStandardFile(self, path):
213
- with open(path, 'w') as f:
214
+ os.makedirs("/".join(path.split("/")[:-1]),exist_ok=True)
215
+ with open(path, 'w+') as f:
214
216
  # Escribir el encabezado con el número de trabajos y máquinas
215
217
  f.write(f"Number of jobs: {self.numJobs}\n")
216
218
  f.write(f"Number of machines: {self.numMchs}\n\n")
@@ -251,9 +253,7 @@ class JSP:
251
253
  return self
252
254
  new_object = copy.deepcopy(self)
253
255
  new_object.speed = len(speeds)
254
-
255
256
  new_object.ProcessingTime = new_object.ProcessingTime[:, :, speeds]
256
-
257
257
  new_object.EnergyConsumption = new_object.EnergyConsumption[:, :, speeds]
258
258
  new_object.generate_maxmin_objective_values()
259
259
  return new_object
@@ -444,14 +444,31 @@ class JSP:
444
444
  # jsp.fill_random_values(speed=3, rddd=2, distribution="uniform", seed=1234)
445
445
  # jsp.saveTaillardStandardFile("./output_taillard.txt")
446
446
 
447
- # class generador:
448
- # def __init__( self,jobs, machines, ProcessingTime=[], EnergyConsumption=[], ReleaseDateDueDate=[], Orden=[],speed = 1, rddd = 0, distribution = "uniform" , seed = 1, tpm=[],json=False,dzn=False,taillard=False ,savepath = ""):
449
- # jsp = JSP(jobs=jobs, machines=machines,ProcessingTime=ProcessingTime,EnergyConsumption=EnergyConsumption,ReleaseDateDueDate=ReleaseDateDueDate,Orden=Orden)
450
- # jsp.fill_random_values(speed=speed, rddd=rddd, distribution=distribution, seed=seed,tpm=tpm)
451
- # if json:
452
- # jsp.saveJsonFile(f"{savepath}/"+jm_path+f"{j}x{m}_{i}.json")
453
-
454
- # if dzn:
455
- # jsp.saveTaillardStandardFile("./output_taillard.txt")
456
- # if taillard:
457
- # jsp.saveTaillardStandardFile("./output_taillard.txt")
447
+ class Generator:
448
+ def __init__( self,json = False, dzn = False, taillard = False, savepath="./"):
449
+ self.json = json
450
+ self.dzn = dzn
451
+ self.taillard = taillard
452
+ self.savepath = savepath
453
+
454
+ def generate_new_instance(self, jobs = 10, machines = 4, ProcessingTime=[], EnergyConsumption=[], Orden=[],speed = 1, ReleaseDateDueDate = 0, distribution = "uniform" , seed = 0, tpm=[]):
455
+ jsp = JSP(jobs=jobs, machines=machines,ProcessingTime=ProcessingTime,EnergyConsumption=EnergyConsumption,Orden=Orden)
456
+ jsp.fill_random_values(speed = speed, rddd = ReleaseDateDueDate, distribution = distribution, seed = seed,tpm = tpm)
457
+ if not (self.json or self.dzn or self.taillard): return jsp
458
+
459
+ j = str(jobs)
460
+ m = str(machines)
461
+ jm_path = str(j)+"_"+str(m)+"/"
462
+
463
+ i = seed
464
+
465
+ if self.json:
466
+ jsp.saveJsonFile(f"{self.savepath}/JSON/"+jm_path.split("/")[0]+f"_{j}x{m}_{i}.json")
467
+ if self.dzn:
468
+ pkl_path = f"{self.savepath}/"+jm_path.split("/")[0]+f"_{j}x{m}_{i}.pkl"
469
+ jsp.savePythonFile(pkl_path)
470
+ jsp.saveDznFile(pkl_path,f"{self.savepath}/DZN/"+jm_path)#f"{j}x{m}_{i}")
471
+ os.remove(pkl_path)
472
+ if self.taillard:
473
+ jsp.saveTaillardStandardFile(f"{self.savepath}/TAILLARD/"+jm_path.split("/")[0]+f"_{j}x{m}_{i}.txt")
474
+ return jsp
IGJSP/main.py CHANGED
@@ -17,19 +17,13 @@ try:
17
17
  # Número de Máquinas
18
18
  parser.add_argument('-M','--machines', type=json.loads, default='[4]')
19
19
  # Semilla
20
- parser.add_argument('-s','--seeds', type= json.loads, default=1)
20
+ parser.add_argument('-s','--seeds', type= json.loads, default='[0]')
21
21
  # Tipo de problema
22
22
  # 1 - JSP, 2 - FlowJSP, 3 - FlexibleJSP, 4 - OpenJSP
23
23
  # parser.add_argument('-T','--type', type=int, default=1)
24
24
  # Niveles de dificultad
25
25
  # Speed Scaling
26
26
  parser.add_argument('-S', '--speed-scaling', type=int, default=1)
27
- # Tiempo estandar de procesamiento de una máquina
28
- parser.add_argument('-mpt', '--machine-processing-time', dest='mpt', type=json.loads, default=[])
29
- # Energy
30
- parser.add_argument('-E', '--energy', type=int, default=0)
31
-
32
- parser.add_argument('-O', '--order', type=json.loads, default='[]')
33
27
 
34
28
  # Release and Due date
35
29
  # 0 -> Tiempo infinito
@@ -46,6 +40,7 @@ try:
46
40
  parser.add_argument('-Q', '--quantity', type=int, default=1)
47
41
  # Distribution
48
42
  parser.add_argument('-D','--distribution', type=str, default="normal")
43
+
49
44
  # JSON save
50
45
  parser.add_argument('-j','--json', type=bool, default=False)
51
46
  # DZN save
@@ -59,22 +54,17 @@ try:
59
54
  start = time.time()
60
55
  for j in tqdm(args.jobs,desc='Jobs',leave=False):
61
56
  for m in tqdm(args.machines,desc='Machines',leave=False):
62
- for i in trange(args.quantity,desc='Quantity',leave=False):
63
- jm_path = str(j )+"_"+str(m)+"/"
64
- jsp = JSP(jobs=j, machines=m,ProcessingTime=args.mpt,EnergyConsumption=args.energy,ReleaseDateDueDate=args.release_due,Orden=args.order)
65
- jsp.fill_random_values(speed=args.speed_scaling, rddd=args.release_due, distribution=args.distribution, seed=args.seeds)
66
- if args.json:
67
- jsp.saveJsonFile(f"{args.path}/"+jm_path+f"{j}x{m}_{i}.json")
68
- pass
69
- if args.dzn:
70
- jsp.savePythonFile(f"{args.path}/"+jm_path+str(j )+"_"+str(m)+".pkl")
71
- jsp.saveDznFile(f"{args.path}/"+jm_path+str(j )+"_"+str(m)+".pkl",f"{args.path}/"+jm_path+f"{j}x{m}_{i}.dzn")
72
- os.remove(f"{args.path}/"+jm_path+str(j )+"_"+str(m)+".pkl")
73
- if args.taillard:
74
- jsp.saveTaillardStandardFile(f"{args.path}/"+jm_path+f"{j}x{m}_{i}.txt")
75
57
 
76
-
77
-
58
+ generator = Generator(json = args.json, dzn = args.dzn, taillard = args.taillard)
59
+ if len(args.seeds) < args.quantity:
60
+ # args.seeds = args.seeds + list(np.zeros(args.quantity - len(args.seeds),dtype=np.int64))
61
+ p_s = np.linspace(0, 100, num=100,dtype=np.int64)
62
+ for s in args.seeds:
63
+ p_s = p_s[p_s!=s]
64
+ args.seeds = args.seeds+ list(p_s[:args.quantity-len(args.seeds)])
65
+ for i in trange(args.quantity,desc='Quantity',leave=False):
66
+ generator.savepath = args.path+"/instancesGenerated_"+str(i)
67
+ generator.generate_new_instance(jobs=j, machines=m,ReleaseDateDueDate =np.array(args.release_due),speed = args.speed_scaling,distribution = args.distribution, seed = args.seeds[i])
78
68
 
79
69
  except Exception as e:
80
70
  raise
@@ -0,0 +1,216 @@
1
+ Metadata-Version: 2.4
2
+ Name: IGJSP
3
+ Version: 0.0.6
4
+ Summary: Instance generator for JSP
5
+ Project-URL: Homepage, https://gps.blogs.upv.es/
6
+ Author-email: GPS-UPV <gps@dsic.upv.es>
7
+ License-File: LICENSE
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python :: 3
11
+ Requires-Python: >=3.9
12
+ Requires-Dist: numpy
13
+ Requires-Dist: scipy
14
+ Requires-Dist: tqdm
15
+ Description-Content-Type: text/markdown
16
+
17
+ # Instance Generator Job Shop Scheduling
18
+
19
+ ## Description
20
+ Benchmark generator for the Job Shop Problem (BG-JSP)
21
+
22
+ ## Generating a JSP problem instance
23
+
24
+ To generate an instance of the problem, we will use the Generator class, located in the Generador module.
25
+ To do this, we initialize the generator, giving it the following parameters:
26
+
27
+ 1. **JSON:`json`**
28
+ - **Description**: Parameter that indicates if the generated instance will be stored in JSON format.
29
+ - **Possible values**: Boolean value. Only the values True or False can be obtained.
30
+ - **Example of possible values**: `True`, `False`
31
+ - **Default value**: `False`
32
+
33
+ 2. **DZN:`dzn`**
34
+ - **Description**: Parameter that indicates if the generated instance will be stored in DZN format.
35
+ - **Possible values**: Boolean value. Only the values True or False can be obtained.
36
+ - **Example of possible values**: `True`, `False`
37
+ - **Default value**: `False`
38
+
39
+ 3. **Taillard:`taillard`**
40
+ - **Description**: Parameter that indicates if the generated instance will be stored in taillard format.
41
+ - **Possible values**: Boolean value. Only the values True or False can be obtained.
42
+ - **Example of possible values**: `True`, `False`
43
+ - **Default value**: `False`
44
+
45
+ 4. **Save Path:`savepath`**
46
+ - **Description**: Path where the problem instance file will be generated.
47
+ - **Possible values**: String.
48
+ - **Example of possible values**: `./problems`, `./instances`
49
+ - **Default value**: `./output`
50
+
51
+
52
+ Once the generator has been initialized, we proceed to generate different instances of the JSP problem with different values for this initialization; for that we use the following function using the following parameters to customize the generated instances:
53
+
54
+ 1. **Jobs:`jobs`**
55
+ - **Description**: Number of jobs that will have the problem generated.
56
+ - **Possible values**: Integer value.
57
+ - **Example of possible values**: `3`, `4`.
58
+ - **Default value**: `10`
59
+
60
+ 2. **Machines:`machines`**
61
+ - **Description**: Number of machines that will have the problem generated.
62
+ - **Possible values**: Integer value.
63
+ - **Example of possible values**: `6`, `2`.
64
+ - **Default value**: `4`
65
+
66
+ 3. **Release and Due Date:`ReleaseDateDueDate`**
67
+ - **Descripción**: Establish that each task has an instant of release and completion limit.
68
+ - **Possible values**:
69
+ - `0`: Neither the works nor the operations of each of them will have an instant release or time limit for completion.
70
+ - `1`: The work will have an instant of release and instant of completion limit.
71
+ - `2`: The operations of each job will have a release time and a limiting end time.
72
+ - **Example of possible values**: `1`, `2`
73
+ - **Default value**: `0`
74
+
75
+ 4. **Speeds:`speed`**
76
+ - **Description**: Number of speeds that will be available to perform each task.
77
+ - **Possible values**: Integer value.
78
+ - **Example of possible values**: `3`, `5`
79
+ - **Default value**: `1`
80
+
81
+ 5. **Distribution:`distribution`**
82
+ - **Description**: Type of distribution to be followed for data generation.
83
+ - **Possible values**: You can only set one of the following values: `uniform` `normal` `exponential.`
84
+ - **Example of possible values**: `uniform`, `exponential`
85
+ - **Default value**: `normal`
86
+
87
+ 6. **Seed:`seed`**
88
+ - **Description**: Base number for data generation.
89
+ - **Possible values**: Integer value.
90
+ - **Example of possible values**: `84`, `32`
91
+ - **Default value**: `1`
92
+
93
+ ## Example of JSON generated
94
+
95
+ This JSON shows how the data generated from a JSP problem with 2 machines and 4 jobs will look. For this generation, we have the following code:
96
+ ``` python
97
+ from IGJSP.generador import Generator
98
+ generator = Generator(json=True,savepath="output")
99
+ generator.generate_new_instance(jobs=4,machines=2,ReleaseDateDueDate=2,distribution="exponential",seed=53)
100
+ ```
101
+
102
+ ```json
103
+ {
104
+ "nbJobs": [
105
+ 0,
106
+ 1
107
+ ],
108
+ "nbMchs": [
109
+ 0,
110
+ 1,
111
+ 2,
112
+ 3
113
+ ],
114
+ "speed": 1,
115
+ "timeEnergy": [
116
+ {
117
+ "jobId": 0,
118
+ "operations": {
119
+ "0": {
120
+ "speed-scaling": [
121
+ {
122
+ "procTime": 8,
123
+ "energyCons": 92
124
+ }
125
+ ],
126
+ "release-date": 30,
127
+ "due-date": 41
128
+ },
129
+ "2": {
130
+ "speed-scaling": [
131
+ {
132
+ "procTime": 17,
133
+ "energyCons": 84
134
+ }
135
+ ],
136
+ "release-date": 41,
137
+ "due-date": 77
138
+ },
139
+ "3": {
140
+ "speed-scaling": [
141
+ {
142
+ "procTime": 3,
143
+ "energyCons": 97
144
+ }
145
+ ],
146
+ "release-date": 77,
147
+ "due-date": 80
148
+ },
149
+ "1": {
150
+ "speed-scaling": [
151
+ {
152
+ "procTime": 7,
153
+ "energyCons": 93
154
+ }
155
+ ],
156
+ "release-date": 80,
157
+ "due-date": 88
158
+ }
159
+ },
160
+ "release-date": 30,
161
+ "due-date": 88
162
+ },
163
+ {
164
+ "jobId": 1,
165
+ "operations": {
166
+ "1": {
167
+ "speed-scaling": [
168
+ {
169
+ "procTime": 4,
170
+ "energyCons": 96
171
+ }
172
+ ],
173
+ "release-date": 0,
174
+ "due-date": 5
175
+ },
176
+ "3": {
177
+ "speed-scaling": [
178
+ {
179
+ "procTime": 3,
180
+ "energyCons": 97
181
+ }
182
+ ],
183
+ "release-date": 5,
184
+ "due-date": 9
185
+ },
186
+ "2": {
187
+ "speed-scaling": [
188
+ {
189
+ "procTime": 1,
190
+ "energyCons": 99
191
+ }
192
+ ],
193
+ "release-date": 9,
194
+ "due-date": 10
195
+ },
196
+ "0": {
197
+ "speed-scaling": [
198
+ {
199
+ "procTime": 6,
200
+ "energyCons": 94
201
+ }
202
+ ],
203
+ "release-date": 10,
204
+ "due-date": 17
205
+ }
206
+ },
207
+ "release-date": 0,
208
+ "due-date": 17
209
+ }
210
+ ],
211
+ "minMakespan": 35,
212
+ "minEnergy": 752,
213
+ "maxMinMakespan": 14,
214
+ "maxMinEnergy": 0
215
+ }
216
+ ```
@@ -0,0 +1,15 @@
1
+ IGJSP/generador.py,sha256=D9seek6pHT5dIl7Mdr8d_ChUHsahvCexDLvvUvsRjMA,22112
2
+ IGJSP/main.py,sha256=qnpAdI9Nymfbb2t674EHKCZr1vG80tGyVT5RKMiGvZM,2727
3
+ IGJSP/Minizinc/Models/RD/JSP0.mzn,sha256=cfN_E3RQ6nBulGfaOOYTd-zAgA5SI6E2saDlYtKCflg,2282
4
+ IGJSP/Minizinc/Models/RD/JSP1.mzn,sha256=5B8cyw2WyKR8yEL1fFd0TaCAVhjPoxEJRJDPPEjJGEk,2840
5
+ IGJSP/Minizinc/Models/RD/JSP2.mzn,sha256=ATqpg-Ow_VzjQJ_hZSSXiTXmwmqNqFsq81TZgcnjTks,2941
6
+ IGJSP/Minizinc/Types/RD/JSP0.mzn,sha256=cfN_E3RQ6nBulGfaOOYTd-zAgA5SI6E2saDlYtKCflg,2282
7
+ IGJSP/Minizinc/Types/RD/JSP1.mzn,sha256=5B8cyw2WyKR8yEL1fFd0TaCAVhjPoxEJRJDPPEjJGEk,2840
8
+ IGJSP/Minizinc/Types/RD/JSP2.mzn,sha256=ATqpg-Ow_VzjQJ_hZSSXiTXmwmqNqFsq81TZgcnjTks,2941
9
+ IGJSP/Minizinc/Types/RD/type0.dzn,sha256=alo54TrPd2svp-YeOq8rNhb42Aj5w4N1y1WYRxZ-aWM,225
10
+ IGJSP/Minizinc/Types/RD/type1.dzn,sha256=r3f1uOoDnscjpXHbpvOWPGhGN0tmwkJ3NYIRP-NGk5M,298
11
+ IGJSP/Minizinc/Types/RD/type2.dzn,sha256=ddJxLqR_WlUpycHhA_QulxiTx3o9neIzNESEt59VUx0,344
12
+ igjsp-0.0.6.dist-info/METADATA,sha256=fzgMOdpgHvFW965MBHFLFySr5UHJFfzKWRfla_LgsUw,7406
13
+ igjsp-0.0.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
14
+ igjsp-0.0.6.dist-info/licenses/LICENSE,sha256=f7RDRO-z_nMoooAya7NAb8sXtrHR6WnttYtyUc9fB-c,1116
15
+ igjsp-0.0.6.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 GPS
3
+ Copyright (c) 2025 Planning and Scheduling Research Group
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
Binary file
Binary file
@@ -1,8 +0,0 @@
1
- %SETS
2
- JOBS = 1..10;
3
- MACHINES = 1..4;
4
- SPEED = 1;
5
-
6
- time = array3d(JOBS,MACHINES,1..SPEED,[]);
7
- energy = array3d(JOBS,MACHINES,1..SPEED,[]);
8
- precedence = array2d(JOBS,MACHINES,[3, 2, 1, 0, 2, 1, 3, 0, 1, 0, 3, 2, 0, 2, 1, 3, 1, 2, 0, 3, 2, 1, 0, 3, 3, 0, 2, 1, 1, 2, 0, 3, 2, 3, 1, 0, 2, 1, 3, 0]);