You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

作业排序以最小化目标函数:求解算法与设计变量定义问询

问题解答

现有一份包含机器人作业路径坐标的作业列表,需对作业排序以最小化机器人完成所有作业的耗时,目标函数已定义为总行驶路径和的最小值。针对该问题的算法选择与建模方案如下:

一、适用的求解算法

这个问题本质是带作业内固定路径的旅行商问题(TSP)变体——每个作业自带一段从起点机器到终点机器的固定路径,同时需要优化作业间的衔接路径,目标是找到作业排列顺序使总行驶距离最小。根据作业规模可选择以下算法:

1. 精确算法(作业数≤20时适用)

  • 分支定界法:通过划分解空间并剪枝掉不可能得到更优解的分支,最终找到全局最优解。
  • 动态规划法:用状态dp[mask][u]表示完成mask集合内的作业、最后结束在第u个作业终点时的最小总距离,逐步推导所有状态的最优值。

2. 启发式/近似算法(中大规模作业集适用)

  • 贪心算法:每次选择与当前作业终点距离最近的下一个作业起点构建初始解;也可结合插入启发式,将作业逐个插入到当前路径中总距离增量最小的位置。
  • 局部搜索算法:比如2-opt算法——随机交换路径中两个作业的位置,若总距离减少则保留该交换,迭代至无法优化;或3-opt算法,优化力度更强。
  • 元启发式算法:遗传算法、模拟退火、蚁群算法等,通过模拟自然过程在解空间高效搜索,适合大规模问题,能在可接受时间内得到近似最优解。

二、问题建模与设计变量定义

1. 问题建模

将问题抽象为:

  • 给定n个作业,每个作业k对应固定路径:起点坐标S_k=(x_{s_k}, y_{s_k})到终点坐标E_k=(x_{e_k}, y_{e_k}),这段路径的曼哈顿距离固定为d_k = |x_{e_k}-x_{s_k}| + |y_{e_k}-y_{s_k}|。
  • 作业k与作业m的衔接距离为从E_k到S_m的曼哈顿距离:d_{k,m} = |x_{s_m}-x_{e_k}| + |y_{s_m}-y_{e_k}|。
  • 总距离 = 所有作业内路径距离之和 + 所有相邻作业间的衔接距离之和。目标是找到作业排列π=(π_1, π_2, ..., π_n),使总距离最小。

2. 设计变量定义

设计变量为作业的排列顺序,有两种常用表示方式:

  • 排列数组:用长度为n的数组order,order[i]表示第i个执行的作业在原始作业列表中的索引。例如order=[2,0,1]表示先执行第3个作业,再执行第1个,最后执行第2个。
  • 置换矩阵:用n×n的二进制矩阵X,X[i][j]=1表示第i个位置执行第j个作业,每行每列仅有一个1。该方式适合整数规划建模,但实现复杂度较高,多用于小规模问题。

附:相关实现代码

import pandas as pd

machine_positions = {1: [5, 10],
                     2: [50, 5],
                     3: [40, 20],
                     4: [60, 35],
                     5: [30, 35],
                     6: [20, 30]
                     }

def read_joblist(filename):
    # 加载作业列表并将其处理为单个作业(每个作业数量为1)
    # 将机器编号转换为坐标
    data = pd.read_csv(filename)
    refined_data = []
    shape = data.shape
    
    # 将多数量作业拆分为多行单个作业
    for i in range(shape[0]):
        # 准备待添加的作业
        new_job = []
        new_job.append(data.loc[i][0])
        new_job.append(data.loc[i][1])

        # 将机器编号转换为坐标
        new_job[0] = machine_positions.get(new_job[0])
        new_job[1] = machine_positions.get(new_job[1])

        # 按指定数量重复添加该作业
        for j in range(data.loc[i]["Anzahl"]):
            refined_data.append(new_job)

    return refined_data


def objectivefunction_gestime(joblist_ordered):
    # 计算完成所有作业所需的总行驶路径(曼哈顿距离)
    time = 0
    for i in range(len(joblist_ordered)):
        # 累加单个作业内x、y方向的曼哈顿距离
        time += abs(int(joblist_ordered[i][1][0]) - int(joblist_ordered[i][0][0]))
        time += abs(int(joblist_ordered[i][1][1]) - int(joblist_ordered[i][0][1]))

        # 若存在前序作业,累加作业间的行驶曼哈顿距离
        if i > 0:
            time += abs(int(joblist_ordered[i][0][0]) - int(joblist_ordered[i-1][1][0]))
            time += abs(int(joblist_ordered[i][0][1]) - int(joblist_ordered[i-1][1][1]))

    return time

内容的提问来源于stack exchange,提问作者Stern Ster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:16:06