|
4 | 4 | #include <cstdint> |
5 | 5 | #include <cmath> |
6 | 6 |
|
| 7 | +#include <algorithm> |
| 8 | +#include <ranges> |
| 9 | + |
7 | 10 | #include <sched/shop/instance/JobShopInstanceGenerator.h> |
8 | | -#include "sched/shop/instance/JobShopData.h" |
9 | 11 |
|
10 | 12 | namespace sched::shop { |
11 | 13 |
|
@@ -179,64 +181,189 @@ namespace sched::shop { |
179 | 181 | return static_cast<float>(extended_seed) / static_cast<float>(M + 1); |
180 | 182 | } |
181 | 183 |
|
| 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 | + } |
182 | 358 |
|
| 359 | + SCHED_API std::span<const DemirkolMehtaUzsoyInstance, DmuInstanceCount> load_dmu_benchmark_1() |
| 360 | + { |
| 361 | + return DmuInstances1; |
183 | 362 | } |
184 | 363 |
|
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 | + } |
241 | 368 |
|
242 | 369 | } |
0 commit comments