mock() to generate mockenv for the generator, pull_fwd() to compute new solutions. Rectify needs to be implemented before generator works.
This commit is contained in:
parent
23e6d12754
commit
a8c4a11b20
77
src/Generator/generator.py
Normal file
77
src/Generator/generator.py
Normal file
|
@ -0,0 +1,77 @@
|
|||
from Parser import JobShopProblem as Problem
|
||||
import random
|
||||
|
||||
|
||||
""" Pull a task from a pseudo-random position to the position of
|
||||
a random task forward. If the task directly in front is part
|
||||
of the same job, pull that instead. The first task can never
|
||||
be pulled forward. Will not rectify solutions.
|
||||
|
||||
Returns the modified solution and the tasks index.
|
||||
"""
|
||||
def pull_fwd(solution):
|
||||
old_idx = random.randint(1, len(solution)-1)
|
||||
while(solution[old_idx][1][0] == solution[old_idx-1][1][0]):
|
||||
old_idx -= 1
|
||||
new_idx = random.randint(0, old_idx-1)
|
||||
for task in solution[new:old_idx]:
|
||||
if(task[1][0] == solution[old_idx][1][0]):
|
||||
break
|
||||
else:
|
||||
new_solution = solution[:]
|
||||
task = solution[old_idx]
|
||||
new_solution.remove(task)
|
||||
new_solution.insert(new_idx, task)
|
||||
return (new_solution, new_idx)
|
||||
|
||||
|
||||
""" Accept the current generated solution and evaluate it.
|
||||
Maybe skip this during the first step to generate a more
|
||||
random solution.
|
||||
"""
|
||||
def accept(solution):
|
||||
return 3
|
||||
|
||||
|
||||
""" Transform solution by adapting the begin times and delaying
|
||||
tasks on the same machine if affected.
|
||||
"""
|
||||
def rectify(solution, idx):
|
||||
global problem
|
||||
|
||||
#move previous task on the same machine back if clash
|
||||
""" task = solution[idx][1]
|
||||
prev_task = solution[idx-1][1]
|
||||
while(problem[task[0]][task[1]][1] == problem[prev_task[0]][prev_task[1]][1]):
|
||||
solution[idx-1][0] += problem[task[0]][task[1]][0]
|
||||
solution[idx], solution[idx-1] = solution[idx-1], solution[idx]
|
||||
idx -= 1
|
||||
task = solution[idx][1]
|
||||
prev_task = solution[idx-1][1]
|
||||
del prev_task
|
||||
"""
|
||||
#make parallel
|
||||
solution[idx][0] = solution[idx-1][0]
|
||||
|
||||
|
||||
"""Generate a new solution from an existing solution with a
|
||||
specified number of max steps.
|
||||
"""
|
||||
def generate(solution, steps):
|
||||
options = [pull_fwd, accept]
|
||||
option = random.choice(options)
|
||||
return option(solution)
|
||||
|
||||
|
||||
""" Reads a mock problem and creates the corresponding enumerated
|
||||
solution. Should clean up the namespace afterwards.
|
||||
"""
|
||||
def mock():
|
||||
global problem
|
||||
global solution
|
||||
from Parser.js2_style import parse_file as mockload
|
||||
from SchedulingAlgorithms.enumerate import enumerate as mockenum
|
||||
problem = mockload('../inputdata/sample')
|
||||
solution = mockenum(problem)
|
||||
del mockload
|
||||
del mockenum
|
Loading…
Reference in a new issue