电池初始有电100;有两个耗电任务,速率为-2,task1:开始和结束时间为:“2024-02-02 02:00:00.000”,“2024-02-02 02:10:00.000”;
task2:开始和结束时间为:“2024-02-02 02:20:00.000”,“2024-02-02 02:40:00.000”;
有一个充电任务,速率为1,power:开始和结束时间为:“2024-02-02 02:05:00.000”,“2024-02-02 02:25:00.000”;
import pandas as pd
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
# 定义任务
tasks = [
{"name": "task1", "rate": -2, "start": "2024-02-02 02:00:00.000", "end": "2024-02-02 02:10:00.000"},
{"name": "task2", "rate": -2, "start": "2024-02-02 02:20:00.000", "end": "2024-02-02 02:40:00.000"},
{"name": "power", "rate": 1, "start": "2024-02-02 02:05:00.000", "end": "2024-02-02 02:25:00.000"}
]
# 初始电量
initial_battery = 100
# 将时间字符串转换为datetime对象
for task in tasks:
task["start"] = datetime.strptime(task["start"], "%Y-%m-%d %H:%M:%S.%f")
task["end"] = datetime.strptime(task["end"], "%Y-%m-%d %H:%M:%S.%f")
def get_battery_level_at_time(target_time):
battery_level = initial_battery
# 遍历每个任务,计算电量变化
for task in tasks:
if task["start"] <= target_time <= task["end"]:
# 计算在目标时间点上的任务持续时间
delta = (target_time - task["start"]).total_seconds() / 60.0
battery_level += task["rate"] * delta
elif task["end"] < target_time:
# 计算整个任务持续时间
delta = (task["end"] - task["start"]).total_seconds() / 60.0
battery_level += task["rate"] * delta
return battery_level
# 创建一个时间范围,步长为1分钟
start_time = min(task["start"] for task in tasks)
end_time = max(task["end"] for task in tasks) + timedelta(minutes=10)
times = pd.date_range(start_time, end_time, freq='T')
# 计算每个时间点的电量
battery_levels = [get_battery_level_at_time(time) for time in times]
# 可视化电池电量随时间的变化
plt.figure(figsize=(10, 6))
plt.plot(times, battery_levels, label="Battery Level")
plt.axhline(initial_battery, color='r', linestyle='--', label="Initial Battery Level")
# 标记任务的开始和结束时间
for task in tasks:
plt.axvline(task["start"], color='g', linestyle='--', alpha=0.7)
plt.axvline(task["end"], color='b', linestyle='--', alpha=0.7)
plt.text(task["start"], initial_battery + 10, task["name"], rotation=90, verticalalignment='center')
plt.xlabel("Time")
plt.ylabel("Battery Level")
plt.title("Battery Level Over Time")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()