仔细阅读这份代码,分析一下什么情况下,经过trail函数后直接得到结果,不过泡也不回缩
时间: 2024-11-13 18:40:07 浏览: 13
根据提供的代码片段,`trial` 函数的主要目的是通过回溯和模拟来确定一个合适的 `job_in_time`(作业进入时间)。为了使 `trial` 函数能够直接得出结果且既不进行过泡处理也不进行回缩操作,需要满足以下条件:
1. **没有错误发生**:
- `inner_model.error_list` 中没有任何错误(如 `DeadLock`, `WashError`, `ChangeChemical`, `OverSoak`)。
- 这意味着在整个 `calculate_inner_jobs` 和其他相关操作过程中,没有出现任何导致任务失败或需要特殊处理的情况。
2. **计算后的 `temp_job_in_time` 是有限值**:
- `temp_job_in_time` 不应为 `float('inf')`。如果 `temp_job_in_time` 为无穷大,表示无法找到合适的时间点,这会导致 `trial` 函数提前终止。
3. **`min_good_time` 保持为 `float('inf')`**:
- `min_good_time` 初始化为 `float('inf')`,并且在整个 `trial` 函数执行过程中没有更新为其实际值。这意味着没有发现比当前更好的时间点。
具体来说,以下是一些关键代码段及其解释:
### 关键代码段
1. **初始化和调用 `calculate_inner_jobs`**:
```python
inner_model.error_list.clear()
inner_model.wash_error_tank_set.clear()
calculate_inner_jobs(
env=inner_model,
move_list=move_list,
proc_list=proc_list,
job_info=[new_job.get_info(mat_id=[w.mat_id[0] for w in new_job.wafer], job_in_time=new_job.job_occupy_pusher.last_value, job_in_span=new_job.job_in_span - ( new_job.job_occupy_pusher.last_value - new_job.job_in_time), new_job=True, current_new_job=True)],
remove_list=[],
rollback_time=max(last_task_temp['low_bound_t'], roll_back_time),
safe_time=self.now_safe,
ptr_station=self.ptr.last_station,
last_post_move_list={},
inner_pusher_occupy=inner_model.inner_pusher_occupy
)
```
2. **检查错误列表**:
```python
if ( Constant.ChangeChemical in inner_model.error_list or Constant.DeadLock in inner_model.error_list or Constant.WashError in inner_model.error_list or (temp_job_in_time == float('inf') and new_job.job_id in inner_model.jobs_dict) ):
# 处理错误情况
trial(last_task, job_out_list, -1, -1)
inner_model.error_list.clear()
inner_model.wash_error_tank_set.clear()
calculate_inner_jobs(
env=inner_model,
move_list={},
proc_list={},
job_info=[],
remove_list=[new_job.job_id],
rollback_time=roll_back_time,
ptr_station=self.ptr.last_station,
last_post_move_list={},
safe_time=self.now_safe,
inner_pusher_occupy=inner_model.inner_pusher_occupy
)
for batch_job in inner_model.batch_jobs:
inner_job = inner_model.jobs_dict[batch_job.job_id]
for _wafer in self.jobs_dict[batch_job.job_id].wafer:
_wafer.step_id_history.merge(inner_job.step_id_history)
_wafer.station_history.merge(inner_job.station_history, _wafer, True)
_wafer.step_transfer_move_list.update(inner_job.outer_step_transfer_move_list)
_wafer.move_list.merge(inner_job.move_list)
assert not inner_model.error_list
if Constant.ChangeChemical in ChangeChemical_flag:
self.change_chemical(inner_model.change_chemical_tank_set.copy())
if Constant.WashError in inner_model.error_list:
print("WashError")
self.wash_error(inner_model.wash_error_tank_set.copy())
break
```
3. **检查 `min_good_time`**:
```python
if min_good_time != float('inf'):
last_step = round((min_good_time - temp_job_in_time) / 2, 2)
last_step = last_step if last_step > 1 else 0
over_span = ((temp_job_in_time if last_step else min_good_time) - first_job_in_time) + last_step
else:
last_step = max(over_soak_t + span_time, inner_model.jobs_dict[new_job.job_id].residence_time, 40)
over_span += last_step
```
### 综合条件
- **无错误**:确保 `inner_model.error_list` 为空。
- **有限的时间**:`temp_job_in_time` 必须是一个有限值。
- **未更新 `min_good_time`**:`min_good_time` 保持为 `float('inf')`,表示没有发现更优的时间点。
如果这些条件都满足,`trial` 函数会直接返回结果,并且不会进行过泡处理或回缩操作。
阅读全文