告别繁琐基建管理:Arknights-Mower任务调度系统深度解析

告别繁琐基建管理:Arknights-Mower任务调度系统深度解析

【免费下载链接】arknights-mower 《明日方舟》长草助手 【免费下载链接】arknights-mower 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower

你是否还在为《明日方舟》基建管理的繁琐操作而烦恼?每天手动安排干员排班、计算最优任务时间、处理突发状态变化,这些重复性工作不仅消耗大量时间,还常常因人为疏忽导致资源浪费。本文将深入解析Arknights-Mower项目中革命性的任务管理系统,展示其如何通过智能调度算法和模块化设计,实现基建任务的全自动优化执行。读完本文,你将掌握:

  • 任务调度系统的核心架构与工作原理
  • 干员排班优化算法的实现细节
  • 复杂任务冲突的智能解决策略
  • 自定义任务流程的高级配置方法
  • 性能调优与常见问题解决方案

系统架构 overview

Arknights-Mower的任务管理系统采用分层架构设计,通过模块化组件实现高内聚低耦合,确保系统的可扩展性和维护性。

mermaid

核心组件包括:

  1. BaseSchedulerSolver:调度系统主控制器,负责任务的整体执行与状态转换
  2. SchedulerTask:任务实体类,封装任务时间、类型、执行计划等信息
  3. TaskTypes:任务类型枚举,定义系统支持的所有任务类型及其优先级
  4. TaskUtils:任务处理工具集,提供调度算法、冲突解决、任务生成等核心功能

系统采用事件驱动架构,通过状态机模式处理基建场景转换,确保任务在正确的上下文环境中执行。

任务调度核心算法

优先级驱动的任务排序

任务调度系统的核心在于优先级驱动的智能排序算法,确保高优先级任务优先执行,同时避免任务堆积导致的资源浪费。

def scheduling(tasks, run_order_delay=5, execution_time=0.75, time_now=None):
    if time_now is None:
        time_now = datetime.now()
    if len(tasks) > 0:
        tasks.sort(key=lambda x: x.time)
        
        # 任务间隔最小时间(5分钟)
        min_time_interval = timedelta(minutes=run_order_delay)
        
        # 初始化变量以跟踪上一个优先级0任务和计划执行时间总和
        last_priority_0_task = None
        total_execution_time = 0
        
        # 遍历任务列表
        for i, task in enumerate(tasks):
            current_time = time_now
            # 判定任务堆积,如果第一个任务已经超时,则认为任务堆积
            if task.type.priority == 1 and current_time > task.time:
                total_execution_time += (current_time - task.time).total_seconds() / 60
            
            if task.type.priority == 1:
                if last_priority_0_task is not None:
                    time_difference = task.time - last_priority_0_task.time
                    if (
                        config.conf.run_order_grandet_mode.enable
                        and time_difference < min_time_interval
                        and time_now < last_priority_0_task.time
                    ):
                        logger.info("检测到跑单任务过于接近,准备修正跑单时间")
                        return last_priority_0_task, task
                # 更新上一个优先级0任务和总执行时间
                last_priority_0_task = task
                total_execution_time = 0
            # ... 其他处理逻辑

算法实现了以下关键功能:

  1. 优先级分层:将任务分为不同优先级,确保关键任务(如资源收集)优先执行
  2. 时间冲突检测:识别时间间隔过近的任务,避免执行冲突
  3. 执行时间预估:根据任务类型和数量动态计算执行时间,防止任务堆积
  4. 自适应调整:当检测到任务可能影响后续关键任务时,自动调整任务执行顺序

干员排班优化

系统通过复杂的排班算法实现干员资源的最优配置,平衡心情值、技能特性和任务需求。

def plan_metadata(op_data, tasks):
    # 清除,重新添加刷新
    tasks = [
        t for t in tasks if t.type not in [TaskTypes.SHIFT_ON, TaskTypes.RELEASE_DORM]
    ]
    _time = datetime.max
    min_resting_time = datetime.max
    _plan = {}
    _type = []
    
    # 计算最低休息时间
    total_agent = sorted(
        (
            v
            for v in op_data.operators.values()
            if v.is_high() and not v.room.startswith("dorm") and not v.is_resting()
        ),
        key=lambda x: x.current_mood() - x.lower_limit,
    )
    
    for agent in total_agent:
        # 如果全红脸,使用急救模式
        predicted_rest_time = max(
            agent.predict_exhaust(), datetime.now() + timedelta(minutes=30)
        )
        min_resting_time = min(min_resting_time, predicted_rest_time)
    
    logger.debug(f"预测最低休息时间为: {min_resting_time}")
    grouped_dorms = defaultdict(list)
    free_rooms = []
    # 分组 dorm 对象
    for dorm in op_data.dorm:
        if dorm.name and dorm.name in op_data.operators:
            operator = op_data.operators[dorm.name]
            grouped_dorms[operator.group].append(dorm)
            if not operator.is_high():
                free_rooms.append(dorm)
    # ... 干员分组与排班逻辑

排班算法考虑以下关键因素:

  • 心情值管理:基于干员当前心情和恢复速率,预测最优休息时间
  • 技能特性匹配:根据干员技能特性分配最适合的基建岗位
  • 组策略优化:支持干员分组管理,确保团队协作效率最大化
  • 紧急模式处理:当检测到干员心情过低时,自动触发急救模式

任务类型与生命周期管理

系统支持多种任务类型,每种任务都有明确定义的生命周期和状态转换规则。

核心任务类型

任务类型优先级描述典型执行周期
RUN_ORDER1资源跑单任务30-60分钟
SHIFT_ON2干员上班任务4-8小时
SHIFT_OFF2干员下班任务基于心情值
FIAMMETTA2菲亚梅塔充能任务2-4小时
CLUE_PARTY2线索交流任务12小时
RECRUIT2公招刷新任务6小时
SKLAND2森空岛签到任务24小时
WORKSHOP2加工站材料任务1-3小时

任务生命周期管理

每个任务从创建到完成经历完整的生命周期,系统通过状态机确保任务正确执行。

mermaid

任务执行过程中,系统会持续监控执行状态,并处理可能的异常情况:

def handle_error(self, force=False):
    if self.scene() == Scene.UNKNOWN:
        self.device.exit()
        self.check_current_focus()
    if self.error or force:
        # 如果没有任何时间小于当前时间的任务才生成空任务
        if self.find_next_task(datetime.now()) is None:
            logger.debug("由于出现错误情况,生成一次空任务来执行纠错")
            self.tasks.append(SchedulerTask())
        # 如果没有任何时间小于当前时间的任务-10分钟 则清空任务
        if self.find_next_task(datetime.now() - timedelta(seconds=900)):
            logger.info("检测到执行超过15分钟的任务,清空全部任务")
            self.tasks = []
    elif self.find_next_task(datetime.now() + timedelta(hours=2.5)) is None:
        logger.debug("2.5小时内没有其他任务,生成一个空任务")
        self.tasks.append(SchedulerTask(time=datetime.now() + timedelta(hours=2.5)))
    return True

高级功能实现

智能冲突解决

系统实现了多种冲突解决策略,确保在复杂场景下任务仍能有序执行。

def try_reorder(op_data, new_plan):
    # 移除被拉去上班的替班
    assigned_names = {name for names in new_plan.values() for name in names}
    for d in op_data.dorm:
        if d.name in assigned_names:
            d.name = ""
            d.time = None
    
    # 复制副本,防止原本的dorm错误触发纠错
    dorm = copy.deepcopy(op_data.dorm)
    
    priority_list = op_data.config.ope_resting_priority
    vip = sum(1 for key in op_data.plan.keys() if key.startswith("dorm"))
    
    def get_ranking(name):
        if name in op_data.operators:
            _op = op_data.operators[name]
            if _op.operator_type == "high" and _op.resting_priority == "high":
                return "high"
            elif _op.operator_type == "high":
                return "normal"
        return "low"
    
    dorm_info = [
        {
            "name": room.name,
            "index": idx,
            "time": room.time,
            "priority": get_ranking(room.name),
        }
        for idx, room in enumerate(dorm)
    ]
    
    def sort_key(_op):
        length = len(priority_list)
        priority_order = {
            "high": length,
            "normal": length + 1,
            "low": length + 2,
        }
        return (
            priority_list.index(_op["name"])
            if _op["name"] in priority_list and _op["name"] != ""
            else priority_order[_op["priority"]],
            _op["index"],
        )
    
    dorm_info.sort(key=sort_key)
    # ... 宿舍重排序逻辑

冲突解决策略包括:

  1. 优先级排序:基于预定义规则对干员进行优先级排序
  2. 时间窗口调整:动态调整任务时间,避免资源冲突
  3. 资源抢占机制:关键任务可抢占非关键任务的资源
  4. 回滚恢复机制:任务失败时,系统能回滚到之前状态并尝试恢复

自适应任务生成

系统能根据当前游戏状态动态生成最优任务序列,无需人工干预。

def try_workshop_tasks(op_data, tasks):
    # 如果没有其他任务则进行加工站干员检查
    from arknights_mower.data import workshop_formula

    inventory_data = get_inventory_counts()
    if config.conf.workshop_settings and inventory_data:
        for item in config.conf.workshop_settings:
            valid = False
            if item.operator in op_data.operators.keys():
                agent = op_data.operators[item.operator]
                valid = agent.mood > 22
            else:
                logger.info(f"自动添加{item.operator}至干员数据列表")
                valid = True
                op_data.add(Operator(item.operator, ""))
            
            # 材料检查逻辑
            match = False
            for material in item.items:
                name = material.item_name
                metadata = workshop_formula[name]
                if name.startswith("家具零件"):
                    name = name.split("_")[-1]
                if (
                    name in inventory_data
                    and inventory_data[name] < material.self_upper_limit
                    and all(
                        child_name in inventory_data
                        and inventory_data[child_name]
                        > material.children_lower_limit
                        for child_name in metadata["items"]
                    )
                ):
                    match = True
                    break
            
            if match and valid:
                logger.info(f"{item.operator}满足使用条件:, 生成加工站任务")
                task = SchedulerTask(
                    task_type=TaskTypes.WORKSHOP, meta_data=item.operator
                )
                tasks.append(task)

自适应任务生成考虑以下因素:

  • 资源库存水平:根据当前材料库存决定是否生成加工任务
  • 干员心情状态:确保执行任务的干员心情值处于理想状态
  • 任务优先级:新生成的任务不会影响高优先级任务的执行
  • 玩家设置偏好:尊重玩家自定义的任务偏好和策略

实际应用与配置示例

基础配置示例

通过简单的配置即可实现基本的任务自动化:

{
  "workshop_settings": [
    {
      "operator": "九色鹿",
      "items": [
        {
          "item_name": "聚酸酯组",
          "self_upper_limit": 50,
          "children_lower_limit": 200
        },
        {
          "item_name": "酮凝集组",
          "self_upper_limit": 50,
          "children_lower_limit": 200
        }
      ]
    }
  ],
  "run_order_grandet_mode": {
    "enable": true,
    "back_to_index": true,
    "buffer_time": 300
  },
  "ope_resting_priority": ["能天使", "艾雅法拉", "银灰", "塞雷娅"]
}

高级调度策略

对于高级用户,系统支持复杂的调度策略配置,实现更精细的任务控制:

# 自定义任务排序函数示例
def custom_scheduling_strategy(tasks):
    # 1. 首先按优先级排序
    tasks.sort(key=lambda x: x.type.priority)
    
    # 2. 对于相同优先级的任务,按以下规则排序:
    #    - 加工站任务优先于宿舍任务
    #    - 高心情干员的任务优先
    #    - 接近截止时间的任务优先
    def custom_sort_key(task):
        type_priority = {
            TaskTypes.WORKSHOP: 0,
            TaskTypes.SHIFT_ON: 1,
            TaskTypes.SHIFT_OFF: 2,
            TaskTypes.RELEASE_DORM: 3
        }
        
        return (
            type_priority.get(task.type, 99),
            -sum(1 for name in task.plan.values() if name in high_priority_operators),
            task.time
        )
    
    # 对相同优先级的任务应用自定义排序
    grouped_tasks = {}
    for task in tasks:
        key = task.type.priority
        if key not in grouped_tasks:
            grouped_tasks[key] = []
        grouped_tasks[key].append(task)
    
    # 重组任务列表
    result = []
    for key in sorted(grouped_tasks.keys()):
        group = grouped_tasks[key]
        if key == 2:  # 仅对优先级为2的任务应用自定义排序
            group.sort(key=custom_sort_key)
        result.extend(group)
    
    return result

性能优化与常见问题

性能优化建议

随着任务数量增加,系统性能可能受到影响,可通过以下方法优化:

  1. 任务合并:将短时间内的相似任务合并,减少上下文切换开销

    def merge_release_dorm(tasks, merge_interval):
        for idx in range(1, len(tasks) + 1):
            if idx == 1:
                continue
            task = tasks[-idx]
            last_not_release = None
            if task.type != TaskTypes.RELEASE_DORM:
                continue
            # 查找最近的非RELEASE_DORM任务
            for index_last_not_release in range(idx + 1, len(tasks) + 1):
                if tasks[-index_last_not_release].type != TaskTypes.RELEASE_DORM and tasks[-index_last_not_release].time > task.time - timedelta(minutes=1):
                    last_not_release = tasks[-index_last_not_release]
            if last_not_release is not None:
                continue
            # 合并时间接近的RELEASE_DORM任务
            elif task.time + timedelta(minutes=merge_interval) > tasks[-idx + 1].time:
                tasks[-idx].time = tasks[-idx + 1].time + timedelta(seconds=1)
                tasks[-idx], tasks[-idx + 1] = tasks[-idx + 1], tasks[-idx]
                logger.info(f"自动合并{merge_interval}分钟以内任务")
    
  2. 资源预加载:提前加载常用干员数据和任务模板

  3. 任务过滤:移除不必要的任务类型,减少系统负载

  4. 并行执行:合理配置可并行执行的任务,提高资源利用率

常见问题解决方案

问题原因解决方案
任务频繁失败图像识别错误1. 更新游戏资源
2. 调整设备分辨率
3. 清理游戏缓存
干员排班不合理优先级配置错误1. 优化ope_resting_priority配置
2. 检查干员分组设置
3. 调整心情阈值参数
任务堆积执行时间预估不准1. 增加run_order_delay参数
2. 减少单次任务数量
3. 优化任务优先级
资源收集效率低跑单策略问题1. 启用grandet_mode
2. 调整buffer_time
3. 优化跑单路线

总结与展望

Arknights-Mower的任务管理系统通过先进的调度算法和灵活的配置选项,彻底解放了《明日方舟》玩家的基建管理压力。其核心优势包括:

  1. 智能自动化:系统能根据游戏状态自动生成和调整任务计划
  2. 高度可配置:从简单到复杂的多种配置选项,满足不同玩家需求
  3. 鲁棒性设计:完善的错误处理和恢复机制,确保系统稳定运行
  4. 持续进化:活跃的开发社区不断优化算法和添加新功能

未来,任务管理系统将朝着以下方向发展:

  1. AI驱动优化:引入强化学习算法,根据玩家习惯自动优化策略
  2. 多账号管理:支持多账号并行管理,提高多开效率
  3. 跨平台支持:扩展到更多操作系统和设备类型
  4. 更精细的资源控制:提供更细粒度的资源分配和任务控制选项

通过Arknights-Mower的任务管理系统,玩家可以将更多精力投入到游戏的策略和乐趣部分,而将繁琐的基建管理工作交给智能算法处理。无论是休闲玩家还是重度肝帝,都能从中获得显著的体验提升。

如果你觉得本文对你有帮助,请点赞、收藏并关注项目更新。下期我们将深入探讨"高级图像处理与识别优化",敬请期待!

【免费下载链接】arknights-mower 《明日方舟》长草助手 【免费下载链接】arknights-mower 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值