我正在尝试对齐代表调度模拟的甘特图。代码是:
def input_processes():
while True:
num_processes = int(input("Enter the number of processes (5 to 10): "))
if 5 <= num_processes <= 10:
break
else:
print("Invalid input. Number of processes should be between 5 and 10.")
processes = {}
for i in range(1, num_processes + 1):
burst_time = int(input(f"Enter burst time for process {i} (5 to 15): "))
arrival_time = int(input(f"Enter arrival time for process {i} (0 to 10): "))
processes[f"P{i}"] = {
'burst_time': burst_time,
'arrival_time': arrival_time,
'end_time': 0,
'turnaround_time': 0,
'waiting_time': 0
}
return processes
def calculate_times(processes):
current_time = 0
for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
start_time = max(current_time, processes[process]['arrival_time'])
end_time = start_time + processes[process]['burst_time']
processes[process]['end_time'] = end_time
processes[process]['turnaround_time'] = end_time - processes[process]['arrival_time']
processes[process]['waiting_time'] = start_time - processes[process]['arrival_time']
current_time = end_time
return processes
def display_table(processes):
print("\nProcess\t\tArrival Time\tBurst Time\tEnd Time\tTurnaround Time\tWaiting Time")
for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
p = processes[process]
print(f"{process}\t\t{p['arrival_time']}\t\t{p['burst_time']}\t\t{p['end_time']}\t\t{p['turnaround_time']}\t\t{p['waiting_time']}")
def create_gantt_chart(processes):
LEGEND_NAMES = " "
TIMELINE = "|"
LEGEND_TIME = "0"
timings = 0
for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
burst_remaining = processes[process]['burst_time']
arrival_time = processes[process]['arrival_time']
burst_timing = processes[process]['burst_time']
end_time = processes[process]['end_time']
if arrival_time > timings:
idle_timing = arrival_time - timings
TIMELINE += '+' * idle_timing
timings += idle_timing
TIMELINE += '-' * burst_timing + '|'
LEGEND_NAMES += ' ' * (arrival_time - timings) + str(process).center(burst_timing)
LEGEND_TIME += ' ' * burst_timing + str(end_time)
timings = end_time
# Prepare the gantt
GANTT = LEGEND_NAMES + "\n" + TIMELINE + "\n" + LEGEND_TIME + "\n"
print(GANTT)
if __name__ == "__main__":
processes = input_processes()
processes = calculate_times(processes)
display_table(processes)
create_gantt_chart(processes)
输出为:
我希望 P 位于每个进程上方的中间或中心,并且下方的结束时间应始终位于条形 (|) 下方,如下所示
P2 P3 P1 P4 P5
|+---|----|-----|------|-------|
0 4 8 13 19 26
尽管如此,用户输入它不会失去对齐
最简单的方法是手动跟踪每一侧的填充。这甚至可以处理突发时间为 1 的复杂情况。
def create_gantt_chart(processes):
LEGEND_NAMES = " "
TIMELINE = "|"
LEGEND_TIME = ""
timings = 0
for process in sorted(processes, key=lambda x: processes[x]['arrival_time']):
burst_remaining = processes[process]['burst_time']
arrival_time = processes[process]['arrival_time']
burst_timing = processes[process]['burst_time']
end_time = processes[process]['end_time']
this_timeline = ""
this_name = str(process)
this_time = str(timings)
if arrival_time > timings:
idle_timing = arrival_time - timings
this_timeline += '+' * idle_timing
timings += idle_timing
this_timeline += '-' * burst_timing
length = max(len(this_timeline) + 1, len(this_name) + 1, len(this_time) + 2)
# timeline still has a "|" to add.
if len(this_timeline) + 1 < length:
left = (length - len(this_timeline) - 1)//2
right = length - len(this_timeline) - 1 - left
this_timeline = (" "*left) + this_timeline + (" "*right)
this_timeline += "|"
if len(this_name) < length:
left = (length - len(this_name))//2
right = length - len(this_name) - left
this_name = (" "*left) + this_name + (" "*right)
# Buffer only on the right.
if len(this_time) < length:
this_time += " " * (length - len(this_time))
TIMELINE += this_timeline
LEGEND_NAMES += this_name
LEGEND_TIME += this_time
timings = end_time
# Prepare the gantt
GANTT = LEGEND_NAMES + "\n" + TIMELINE + "\n" + LEGEND_TIME + str(timings) + "\n"
print()
print(GANTT)