|
|
from .client import JSSPEnvClient |
|
|
from .models import ScheduledEvent |
|
|
from .policy import JSSPEnvPolicy |
|
|
|
|
|
|
|
|
def solve_jssp( |
|
|
env_client: JSSPEnvClient, policy: JSSPEnvPolicy, max_steps: int, verbose: bool = False |
|
|
) -> tuple[int, list[ScheduledEvent]]: |
|
|
"""Solve a single JSSP instance using the given policy.""" |
|
|
result = env_client.reset() |
|
|
obs = result.observation |
|
|
scheduled_events: list[ScheduledEvent] = [] |
|
|
|
|
|
while not result.done: |
|
|
if verbose: |
|
|
print(f"Step {obs.step_count}: {', '.join([str(job.job_id) for job in obs.available_jobs()])}") |
|
|
action = policy.act(obs) |
|
|
if verbose: |
|
|
print(f"Action: {action}") |
|
|
|
|
|
|
|
|
if action.job_ids: |
|
|
for job_id in action.job_ids: |
|
|
job = next((job for job in obs.available_jobs() if job.job_id == job_id), None) |
|
|
assert job is not None |
|
|
event = ScheduledEvent( |
|
|
job_id=job_id, |
|
|
machine_id=job.operations[0][0], |
|
|
start_time=obs.step_count, |
|
|
end_time=obs.step_count + job.operations[0][1], |
|
|
) |
|
|
scheduled_events.append(event) |
|
|
|
|
|
|
|
|
result = env_client.step(action) |
|
|
obs = result.observation |
|
|
|
|
|
|
|
|
if obs.step_count >= max_steps: |
|
|
print(f"\nWARNING: Exceeded max steps ({max_steps}), terminating") |
|
|
break |
|
|
|
|
|
|
|
|
return obs.step_count, scheduled_events |
|
|
|