Hi guys,
Thanks to those of you who helped with my scheduling problem. I have finally gotten it to work, and will post the iterative solution. Special thanks to codeplug for the assistance with the recursive stack frame imitation. Also, others had a lot of interest in this problem ( PJYelton for one ) My code has a few bounds in it, to attempt to speed it up ( I check to see if it is possible to beat my current best solution...if not, then I stop traversing. Also, if a job doesn't conflict with any other jobs, then I don't give it the option to NOT be scheduled. ) If anyone can think of other "bounds" that would allow me to prune the tree, that would be great!
Thanks again guys!
Code:void solveIter() { stack<StackStructType> callStack; StackStructType current, previous; previous.job = -1; previous.comp = '-'; current.job = 0; current.comp = '-'; callStack.push(current); for (int i = Job::getMachPerJob() - 1; i >= 0 ; i--) { current.comp = jobs[current.job].getComp(i); callStack.push(current); } while (!callStack.empty()) { current = callStack.top(); callStack.pop(); if (previous.job >= current.job && previous.comp != '-' && jobs[previous.job].getScheduled()) { computers[previous.comp - 97].removeJob(); numOfJobs--; jobs[previous.job].setSchedule('-'); // Probably don't need this jobs[previous.job].setScheduled(false); } if (jobs[current.job].getScheduled()) { computers[jobs[current.job].getSchedule() - 97].removeJob(); numOfJobs--; jobs[current.job].setSchedule('-'); jobs[current.job].setScheduled(false); } previous = current; if (current.comp != '-' && !computers[current.comp - 97].isAvailable(jobs[current.job].getStart())) { continue; } if (current.comp != '-' && computers[current.comp - 97].isAvailable(jobs[current.job].getStart())) { numOfJobs++; jobs[current.job].setSchedule(current.comp); jobs[current.job].setScheduled(true); if (numOfJobs > currentBest) { currentBest = numOfJobs; best = jobs; } computers[current.comp - 97].addJob(jobs[current.job].getEnd()); if (numOfJobs + 1 + jobSize - current.job - 1 - numOfConflicts(current.job) <= currentBest) { numOfJobs--; computers[current.comp - 97].removeJob(); jobs[current.job].setSchedule('-'); jobs[current.job].setScheduled(false); continue; } } if (current.job + 1 < jobSize) { current.job += 1; current.comp = '-'; callStack.push(current); for (int i = Job::getMachPerJob() - 1; i >= 0; i--) { current.comp = jobs[current.job].getComp(i); callStack.push(current); } } } }



LinkBack URL
About LinkBacks


