Skip to content

Commit 6a5d6e4

Browse files
committed
add dmu generator
1 parent 2ed09f6 commit 6a5d6e4

2 files changed

Lines changed: 189 additions & 58 deletions

File tree

include/sched/shop/instance/JobShopInstanceGenerator.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@ namespace sched::shop {
3030
int32_t seed;
3131
};
3232

33-
SCHED_API JobShopInstance compute_dmu_legacy_instance(const DemirkolMehtaUzsoyInstance& instance);
33+
SCHED_API JobShopInstance compute_dmu_legacy_instance_1(const DemirkolMehtaUzsoyInstance& instance);
34+
SCHED_API JobShopInstance compute_dmu_legacy_instance_2(const DemirkolMehtaUzsoyInstance& instance);
3435

36+
constexpr std::size_t DmuInstanceCount = 40;
37+
SCHED_API std::span<const DemirkolMehtaUzsoyInstance, DmuInstanceCount> load_dmu_benchmark_1();
38+
SCHED_API std::span<const DemirkolMehtaUzsoyInstance, DmuInstanceCount> load_dmu_benchmark_2();
3539

3640
}
3741

library/sched/shop/instance/JobShopInstanceGenerator.cc

Lines changed: 184 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
#include <cstdint>
55
#include <cmath>
66

7+
#include <algorithm>
8+
#include <ranges>
9+
710
#include <sched/shop/instance/JobShopInstanceGenerator.h>
8-
#include "sched/shop/instance/JobShopData.h"
911

1012
namespace sched::shop {
1113

@@ -179,64 +181,189 @@ namespace sched::shop {
179181
return static_cast<float>(extended_seed) / static_cast<float>(M + 1);
180182
}
181183

184+
constexpr int32_t DmuMinProcessingTime = 1;
185+
constexpr int32_t DmuProcessingTimeRange = 200;
186+
187+
}
188+
189+
JobShopInstance compute_dmu_legacy_instance_1(const DemirkolMehtaUzsoyInstance& instance)
190+
{
191+
JobShopData instance_data;
192+
instance_data.machines = instance.machines;
193+
194+
int32_t seed = instance.seed;
195+
196+
struct MachineValue {
197+
MachineId machine;
198+
float value;
199+
};
200+
201+
for (std::size_t job = 0; job < instance.jobs; ++job) {
202+
JobData job_data;
203+
204+
std::vector<MachineValue> sequence;
205+
sequence.reserve(instance.machines);
206+
207+
for (std::size_t i = 0; i < instance.machines; ++i) {
208+
sequence.emplace_back(to_machine(i), dmu_uniform(seed));
209+
}
210+
211+
std::ranges::sort(sequence, {}, &MachineValue::value);
212+
213+
for (std::size_t i = 0; i < instance.machines; ++i) {
214+
const OperationData operation_data = {
215+
.machine = sequence[i].machine,
216+
.processing = static_cast<Time>(DmuMinProcessingTime + (dmu_uniform(seed) * DmuProcessingTimeRange))
217+
};
218+
219+
job_data.operations.push_back(operation_data);
220+
}
221+
222+
instance_data.jobs.push_back(std::move(job_data));
223+
}
224+
225+
return instance_data;
226+
}
227+
228+
JobShopInstance compute_dmu_legacy_instance_2(const DemirkolMehtaUzsoyInstance& instance)
229+
{
230+
JobShopData instance_data;
231+
instance_data.machines = instance.machines;
232+
233+
int32_t seed = instance.seed;
234+
const std::size_t half = instance.machines / 2;
235+
236+
struct MachineValue {
237+
MachineId machine;
238+
float value;
239+
};
240+
241+
for (std::size_t job = 0; job < instance.jobs; ++job) {
242+
JobData job_data;
243+
244+
std::vector<MachineValue> sequence;
245+
sequence.reserve(instance.machines);
246+
247+
for (std::size_t i = 0; i < instance.machines; ++i) {
248+
sequence.emplace_back(to_machine(i), dmu_uniform(seed));
249+
}
250+
251+
std::ranges::sort(sequence | std::views::take(half), {}, &MachineValue::value);
252+
std::ranges::sort(sequence | std::views::drop(half), {}, &MachineValue::value);
253+
254+
for (std::size_t i = 0; i < instance.machines; ++i) {
255+
const OperationData operation_data = {
256+
.machine = sequence[i].machine,
257+
.processing = static_cast<Time>(DmuMinProcessingTime + (dmu_uniform(seed) * DmuProcessingTimeRange))
258+
};
259+
260+
job_data.operations.push_back(operation_data);
261+
}
262+
263+
instance_data.jobs.push_back(std::move(job_data));
264+
}
265+
266+
return instance_data;
267+
}
268+
269+
namespace {
270+
271+
constexpr DemirkolMehtaUzsoyInstance DmuInstances1[] = {
272+
{ .jobs = 20, .machines = 15, .seed = 155125852 },
273+
{ .jobs = 20, .machines = 15, .seed = 2029877925 },
274+
{ .jobs = 20, .machines = 15, .seed = 196931796 },
275+
{ .jobs = 20, .machines = 15, .seed = 2109450727 },
276+
{ .jobs = 20, .machines = 15, .seed = 1017664806 },
277+
{ .jobs = 20, .machines = 20, .seed = 704263516 },
278+
{ .jobs = 20, .machines = 20, .seed = 658766149 },
279+
{ .jobs = 20, .machines = 20, .seed = 1918985685 },
280+
{ .jobs = 20, .machines = 20, .seed = 263171901 },
281+
{ .jobs = 20, .machines = 20, .seed = 1630638936 },
282+
{ .jobs = 30, .machines = 15, .seed = 311313093 },
283+
{ .jobs = 30, .machines = 15, .seed = 316280323 },
284+
{ .jobs = 30, .machines = 15, .seed = 1237221727 },
285+
{ .jobs = 30, .machines = 15, .seed = 982174120 },
286+
{ .jobs = 30, .machines = 15, .seed = 899442265 },
287+
{ .jobs = 30, .machines = 20, .seed = 1970680013 },
288+
{ .jobs = 30, .machines = 20, .seed = 491806903 },
289+
{ .jobs = 30, .machines = 20, .seed = 7335742 },
290+
{ .jobs = 30, .machines = 20, .seed = 554421187 },
291+
{ .jobs = 30, .machines = 20, .seed = 1227925003 },
292+
{ .jobs = 40, .machines = 15, .seed = 180026511 },
293+
{ .jobs = 40, .machines = 15, .seed = 86633815 },
294+
{ .jobs = 40, .machines = 15, .seed = 800808272 },
295+
{ .jobs = 40, .machines = 15, .seed = 2104225727 },
296+
{ .jobs = 40, .machines = 15, .seed = 1193746195 },
297+
{ .jobs = 40, .machines = 20, .seed = 1510794207 },
298+
{ .jobs = 40, .machines = 20, .seed = 1656193480 },
299+
{ .jobs = 40, .machines = 20, .seed = 1020622462 },
300+
{ .jobs = 40, .machines = 20, .seed = 425341562 },
301+
{ .jobs = 40, .machines = 20, .seed = 1111362916 },
302+
{ .jobs = 50, .machines = 15, .seed = 1140902718 },
303+
{ .jobs = 50, .machines = 15, .seed = 319220731 },
304+
{ .jobs = 50, .machines = 15, .seed = 1200567745 },
305+
{ .jobs = 50, .machines = 15, .seed = 408890368 },
306+
{ .jobs = 50, .machines = 15, .seed = 668339743 },
307+
{ .jobs = 50, .machines = 20, .seed = 1353154750 },
308+
{ .jobs = 50, .machines = 20, .seed = 1756084517 },
309+
{ .jobs = 50, .machines = 20, .seed = 444307538 },
310+
{ .jobs = 50, .machines = 20, .seed = 618487528 },
311+
{ .jobs = 50, .machines = 20, .seed = 1509456066 },
312+
};
313+
314+
constexpr DemirkolMehtaUzsoyInstance DmuInstances2[] = {
315+
{ .jobs = 20, .machines = 15, .seed = 963246540 },
316+
{ .jobs = 20, .machines = 15, .seed = 571501185 },
317+
{ .jobs = 20, .machines = 15, .seed = 1064792308 },
318+
{ .jobs = 20, .machines = 15, .seed = 500883009 },
319+
{ .jobs = 20, .machines = 15, .seed = 486487743 },
320+
{ .jobs = 20, .machines = 20, .seed = 366904335 },
321+
{ .jobs = 20, .machines = 20, .seed = 193063992 },
322+
{ .jobs = 20, .machines = 20, .seed = 1708102606 },
323+
{ .jobs = 20, .machines = 20, .seed = 1111794661 },
324+
{ .jobs = 20, .machines = 20, .seed = 1759497606 },
325+
{ .jobs = 30, .machines = 15, .seed = 1085428258 },
326+
{ .jobs = 30, .machines = 15, .seed = 808544005 },
327+
{ .jobs = 30, .machines = 15, .seed = 810658329 },
328+
{ .jobs = 30, .machines = 15, .seed = 142450034 },
329+
{ .jobs = 30, .machines = 15, .seed = 694627358 },
330+
{ .jobs = 30, .machines = 20, .seed = 1853446555 },
331+
{ .jobs = 30, .machines = 20, .seed = 1696470024 },
332+
{ .jobs = 30, .machines = 20, .seed = 852368975 },
333+
{ .jobs = 30, .machines = 20, .seed = 1122276408 },
334+
{ .jobs = 30, .machines = 20, .seed = 169103059 },
335+
{ .jobs = 40, .machines = 15, .seed = 1184095505 },
336+
{ .jobs = 40, .machines = 15, .seed = 1032938603 },
337+
{ .jobs = 40, .machines = 15, .seed = 2047416508 },
338+
{ .jobs = 40, .machines = 15, .seed = 735586133 },
339+
{ .jobs = 40, .machines = 15, .seed = 1202629385 },
340+
{ .jobs = 40, .machines = 20, .seed = 295809381 },
341+
{ .jobs = 40, .machines = 20, .seed = 997471796 },
342+
{ .jobs = 40, .machines = 20, .seed = 1524255499 },
343+
{ .jobs = 40, .machines = 20, .seed = 229789972 },
344+
{ .jobs = 40, .machines = 20, .seed = 1780414345 },
345+
{ .jobs = 50, .machines = 15, .seed = 1936600566 },
346+
{ .jobs = 50, .machines = 15, .seed = 567182173 },
347+
{ .jobs = 50, .machines = 15, .seed = 363888850 },
348+
{ .jobs = 50, .machines = 15, .seed = 1103051921 },
349+
{ .jobs = 50, .machines = 15, .seed = 2084553596 },
350+
{ .jobs = 50, .machines = 20, .seed = 1215157252 },
351+
{ .jobs = 50, .machines = 20, .seed = 718365005 },
352+
{ .jobs = 50, .machines = 20, .seed = 499659734 },
353+
{ .jobs = 50, .machines = 20, .seed = 1315007823 },
354+
{ .jobs = 50, .machines = 20, .seed = 556673305 },
355+
};
356+
357+
}
182358

359+
SCHED_API std::span<const DemirkolMehtaUzsoyInstance, DmuInstanceCount> load_dmu_benchmark_1()
360+
{
361+
return DmuInstances1;
183362
}
184363

185-
// float u16807d(iseed)
186-
// int *iseed;
187-
// {
188-
// *iseed = (int) fmod(*iseed * 16807.0, 2147483647.);
189-
// return( *iseed / 2147483648.);
190-
// } /* Random Number Generator End */
191-
//
192-
// /* Generating Classic Job Shop Information */
193-
// generatejobshop(njobs,nmachines,lowp,highp,iseed)
194-
// int njobs,nmachines,*iseed;
195-
// float lowp,highp;
196-
// {
197-
// int i,j,seq[30];
198-
// float rnumber[30];
199-
//
200-
// for(i=1;i<=njobs;++i) {
201-
// for(j=1;j<=nmachines;++j) {
202-
// rnumber[j] = u16807d(iseed);
203-
// seq[j] = j;
204-
// }
205-
// qsort(rnumber,seq,1,nmachines);
206-
// for(j=1;j<=nmachines;++j) {
207-
// sequence[i][j] = seq[j];
208-
// processtime[i][j] = (int) (lowp + u16807d(iseed) * highp);
209-
// }
210-
// }
211-
//
212-
// } /* End Generating Information for Classic Job Shop */
213-
//
214-
// /* Generating Two Sets Job Shop Information */
215-
// generatetwosets(njobs,nmachines,lowp,highp,iseed)
216-
// int njobs,nmachines,*iseed;
217-
// float lowp,highp;
218-
// {
219-
// int i,j,seq[30],firstset,secondset;
220-
// float rnumber[30];
221-
//
222-
// firstset = nmachines / 2;
223-
// for(i=1;i<=njobs;++i) {
224-
// for(j=1;j<=firstset;++j) {
225-
// rnumber[j] = u16807d(iseed);
226-
// seq[j] = j;
227-
// }
228-
// qsort(rnumber,seq,1,firstset);
229-
// for(j=firstset+1;j<=nmachines;++j) {
230-
// rnumber[j] = u16807d(iseed);
231-
// seq[j] = j;
232-
// }
233-
// qsort(rnumber,seq,firstset+1,nmachines);
234-
// for(j=1;j<=nmachines;++j) {
235-
// sequence[i][j] = seq[j];
236-
// processtime[i][j] = (int) (lowp + u16807d(iseed) * highp);
237-
// }
238-
// }
239-
//
240-
// } /* End Generating Information for Two Sets Job Shop */
364+
SCHED_API std::span<const DemirkolMehtaUzsoyInstance, DmuInstanceCount> load_dmu_benchmark_2()
365+
{
366+
return DmuInstances2;
367+
}
241368

242369
}

0 commit comments

Comments
 (0)