2026年五一杯数学建模B题多工序协同作业问题求解全过程文档及程序

2026年五一杯数学建模

B题 多工序协同作业问题

原题再现:

  随着现代制造系统向自动化与柔性化发展,多工序协同作业场景广泛存在于装备制造、工业维护等领域。在此类系统中,不同任务通常由若干具有先后依赖关系的工序组成,各工序需占用特定类型设备完成。如何合理安排各工序作业顺序与资源分配,成为影响系统运行效率的关键问题。
  某工业制造系统需对多个作业车间开展集中整修任务。每个车间的整修任务可抽象为由若干工序组成的流程,不同工序需占用相应类型的设备完成,部分工序需要两类设备共同参与,每个设备在不同车间之间转运存在运输时间成本,每个设备在同一车间作业不存在运输时间成本。
  现需要在 A、B、C、D、E 五个车间开展整修任务。附件中包含三个子表:子表"工序流程表"记录了各车间的工序作业流程数据(m表示米,h表示小时,s表示秒),包括工序编号、所属车间、工序先后关系(按照编号数字由小到大完成,例如A车间的工序先后顺序为A1,A2,A3)以及每道工序所需的设备及其对应作业效率,其中各类设备须分别完成该工序对应的工程量,见假设(2);子表"班组配置表"记录了两个班组的设备配置情况,包括设备类型、设备编号、设备移动速度及设备单价;子表"车间距离表"给出了班组、车间之间的距离信息。
  假设:(1) 各车间内工序顺序固定,即所有工序必须严格按照给定顺序依次执行;(2) 如果某工序需要两类不同的设备共同完成,不考虑两类设备的先后顺序,不考虑两类设备之间的等待时间,两类设备都需要完成该工序所对应的工程量,两类设备都完成该工序对应工程量后,该工序才可判定为完成,例如:工序A1,当精密灌装机完成300m³工程量且自动化输送臂也完成300m³工程量,工序A1才能记作完成;(3) 各班组内设备数量固定,设备在不同工序作业之间可重复使用,但同一时刻每台设备只能服务于一道工序作业;(4) 同一台设备在同一车间的不同工序之间使用时,设备转移运输时间忽略;同一台设备在不同车间使用时,跨车间设备转移运输时间不可忽略;(5) 起始时间从00:00:00(时:分:秒)开始,设备持续工作时间的计算,精确到秒(s)且向上取整。请结合附件数据,建立数学模型,解决下列问题,并将结果填入表1 ~ 表5 (每个表格可以根据需要添加行数)。
  问题1. 假设由班组1独立承担A车间的全部整修任务。请建立数学模型,计算班组1完成A车间所有工序的最短时长,并在表1中填写每台设备对应工序的设备编号、起始时间、结束时间、持续工作时间及工序编号。

  问题2. 仅使用班组1的设备,完成A、B、C、D、E五个车间的整修任务。请建立数学模型,计算完成全部任务的最短时长,并在表2中填写每台设备对应工序的设备编号、起始时间、结束时间、持续工作时间及工序编号。

  问题3. 使用班组1和2的设备,完成A、B、C、D、E五个车间的整修任务。请建立数学模型,计算完成全部任务的最短时长,并在表3中填写每台设备对应工序的设备编号、起始时间、结束时间、持续工作时间、工序编号及所属班组。

  问题4. 为了缩短工作时长,企业拟追加总额为500000元的设备购置预算,用于各班组补增各类设备资源。请建立数学模型,在考虑预算约束的条件下,综合确定设备购置方案及作业调度策略,使全部任务的完成时间最短,并在表4中填写每台设备对应工序的设备编号、起始时间、结束时间、持续工作时间、工序编号及所属班组,在表5中填写购买设备情况。

整体求解过程概述(摘要)

  针对问题一,为了探究班组1独立完成A车间整修任务的最短时长,首先将附件中的工程量与设备效率统一换算为以秒为单位的确定性加工时间,并依据题设"双设备无先后等待"的协同条件,将双设备工序表述为同步启动、多资源占用的并行工序。建立单车间固定工序链模型后,计算得到A1、A2、A3的工序完成时长分别为5400 s、18000 s和18000 s,考虑班组1到A车间的200 s初始转运,最短完工时间为41600 s。通过关键路径下界与构造性排程一致性验证,证明该结果为全局最优。
  针对问题二,鉴于五个车间的工序链相互独立而设备资源共享,且同一设备跨车间移动会产生序列相关运输时间,本文引入多资源柔性作业车间调度模型,将设备指派、工序排序、同步启动与转运约束统一表示。基于串行调度生成机制,采用多起点模拟退火结合交换---插入邻域及最早完工设备指派求解。得到班组1独立完成全部任务的可行最优解为163764 s。资源负荷分析表明高速抛光机和自动传感多功能机构成主导瓶颈;与136450 s的强化下界相比,相对偏差为20.02%,并通过约束逐项核验、重复计算和速度灵敏度分析验证方案的可行性与稳定性。
  针对问题三,在问题二模型的基础上进一步引入班组归属和双班组初始位置,使两套设备资源可协同服务五个车间。模型求得最短完工时间为123844 s,其中C车间的完整工序链及最短初始转运时间恰好构成123844 s的不可突破下界,所构造调度方案达到该下界,因此可严格判定为全局最优。双班组配置显著缓解了高速抛光机和自动传感多功能机的资源冲突,使问题二方案的完工时间缩短24.38%。
  针对问题四,考虑500000元预算约束,引入整数购置变量并构建设备购置---作业调度双层联合优化模型。鉴于问题三已经达到由C车间固定工序链决定的结构性下界,任何新增设备均不能压缩单个工序的物理作业时长,也不能改变C车间的严格先后关系。由此可得最优购置量为各类设备均为0台,沿用问题三排程即可取得123844 s的全局最优完工时间;若企业必须支出预算,新增设备只能提高冗余度和抗故障能力,而不能继续降低本批任务的理论最短工期。
  综上,本文形成了"数据理解与探索---数据预处理---特征工程---多资源调度建模---启发式与下界协同求解---可行性验证---灵敏度与鲁棒性评价"的完整技术路线。模型既保留了工程问题中的固定工序链、设备异构性和跨车间运输特征,又通过下界证明区分了近似最优与严格最优结果,可为集中整修、工业维护和多项目共享设备调度提供可复用的决策框架。

模型假设:

  假设1:附件给出的工程量、设备效率、设备数量、距离和价格在计划期内保持不变,设备作业过程中不发生故障。
  假设2:同一车间工序必须严格按题目编号顺序执行;C3-C5连续循环三遍,展开后形成C3-1至C5-3的确定工序链。
  假设3:双设备工序所需设备同时到位并同步启动,工序完成时刻为两台设备各自完成时刻的最大值;较早完成的设备可立即释放。
  假设4:同类设备性能一致;工序设备效率仅由工序流程表决定,不随设备编号和班组变化。
  假设5:设备跨车间转运沿附件给出的直接距离进行,转运时长为距离除以2 m/s后向上取整;同车间连续作业转运时间为0。
  假设6:设备的转运只能在上一项作业结束后开始,转运期间设备不可参与其他工序。
  假设7:工序切换、人员休息、能源供应、场地占用和材料等待等未给出的影响忽略不计。
  假设8:问题四预算为不超过500000元而非必须全部支出;新增设备与原设备具有相同效率、速度和价格。
  上述假设在保留题目核心冲突的同时剔除了不可观测因素,使模型具有可计算性。特别地,对双设备工序采用同步启动解释,是基于题目"不考虑两类设备先后顺序和等待时间"的协同作业描述;本文还在模型评价中讨论该解释的适用范围。

问题分析:

  问题一分析
  针对仅使用班组 1 完成 A 车间整修、求解最短完工时长的任务,本题属于单项目带双设备同步约束的确定型关键路径调度问题。本问题不存在跨车间设备转运冲突,仅受车间内部工序先后、单道工序需两类设备同步作业两条核心规则约束,计算逻辑简单可直接解析求解。首先统一工程量、设备效率换算为秒级标准工时,识别每道双设备工序完工时间由耗时更长的设备决定,再串联 A 车间固定工序链,叠加班组初始至车间转运时长构造总工期;通过工序串联时长建立理论工期下界,若排程方案恰好等于该下界即可严格判定全局最优,最终输出完整设备作业时序表验证全部工艺约束。
   问题二分析
  针对仅依靠班组 1 全套设备完成 A-E 五个车间全部整修任务的调度优化问题,本题为带序列相关转运、双资源同步工序的柔性作业车间 NP 难调度问题。各车间工序内部存在固定先后顺序,设备可跨车间流转且转运时长随前后车间位置变化,高速抛光、多功能机两类设备单台供给不足易形成资源瓶颈,多重约束无法用解析法直接算出最优解。先统计全工序设备总负荷识别瓶颈资源,构造包含工序链时长、设备总工时的工期下界作为评价基准;构建混合整数调度模型,采用模拟退火算法搭配交换、插入邻域搜索可行工序序列,通过串行生成机制自动完成设备指派与转运时长核算;求解得到高质量可行方案后,对比方案工期与理论下界的偏差,核验工序先后、设备独占、同步开工、跨车间转运全部约束,结合设备利用率图表分析单班组模式下的资源冲突根源。
  问题三分析
  针对开放班组 2 设备、双班组协同完成五车间整修的调度优化问题,本题在问题二完整调度框架基础上拓展设备资源池,属于资源增广后的柔性调度优化问题。双班组新增两套稀缺瓶颈设备,能够大幅缓解单班组设备争抢矛盾,但整体工期仍受 C 车间内部不可拆分、不可调换的串联工序链硬性限制,该工序链时长构成全任务不可突破的理论下界。建模时仅扩充设备集合,复用工序工时、转运规则、同步作业等全部原有约束,无需重复数据预处理;调度算法保持不变,遍历双班组所有可用设备筛选每道工序最早开工组合;若构造出的调度完工时长等于 C 车间关键链下界,可直接证明该方案为全局最优解,同时对比单、双班组设备负荷、总工期降幅,量化两套设备协同对瓶颈冲突的缓解效果。
  问题四分析
  针对 50 万元购置预算约束下,同步确定新增设备采购方案与最优整修调度的双层优化问题,本题属于整数采购变量嵌套调度子问题的组合优化模型,外层为设备购置整数规划,内层为多车间协同调度模型。核心矛盾在于判断新增设备能否压缩整体最短工期,经理论下界分析可知 C 车间内部工序时长、工艺顺序固定,无论增加何种设备都无法缩短该关键链总耗时,问题三已达到理论工期下限,任何采购方案都不能进一步降低完工时间。因此最优购置方案为新增设备数量全部为 0,直接沿用问题三的最优调度方案即可满足工期最优目标;额外开展预算灵敏度分析,绘制预算与最优工期关系曲线,说明资金投入对完工时长无增益,仅能提升设备冗余与故障容错能力,给出贴合企业实际采购的管理决策解释。

模型的建立与求解整体论文缩略图

全部论文请见下方" 只会建模 QQ名片" 点击QQ名片即可

程序代码:

部分程序如下:
python 复制代码
from __future__ import annotations

import argparse
import copy
import csv
import json
import math
import os
import random
import statistics
from collections import Counter, defaultdict
from dataclasses import dataclass
from pathlib import Path
from typing import Dict, Iterable, List, Optional, Sequence, Tuple

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# -------------------------- 0. 绘图与全局设置 --------------------------
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK JP", "Noto Sans CJK SC", "SimHei", "DejaVu Sans"]
plt.rcParams["axes.unicode_minus"] = False

EQUIPMENT_TYPES = [
    "自动化输送臂", "工业清洗机", "精密灌装机", "自动传感多功能机", "高速抛光机"
]
TYPE_INDEX = {name: i for i, name in enumerate(EQUIPMENT_TYPES)}
WORKSHOPS = ["A", "B", "C", "D", "E"]
TEAMS = ["班组1", "班组2"]

# -------------------------- 1. 规范化数据 --------------------------
# 每一项:(工序编号, 车间, {设备类型: 设备独立作业时长(s)})
# 时长 = ceil(工程量 / 效率 * 3600)。C3-C5 按题意重复 3 遍。
OPERATIONS: Dict[str, List[Tuple[str, str, Dict[str, int]]]] = {
    "A": [
        ("A1", "A", {"精密灌装机": 5400, "自动化输送臂": 4320}),
        ("A2", "A", {"高速抛光机": 18000, "工业清洗机": 7200}),
        ("A3", "A", {"自动传感多功能机": 18000}),
    ],
    "B": [
        ("B1", "B", {"工业清洗机": 4320}),
        ("B2", "B", {"精密灌装机": 27000, "自动化输送臂": 18000}),
        ("B3", "B", {"精密灌装机": 3703}),
        ("B4", "B", {"高速抛光机": 10800, "自动传感多功能机": 12960}),
    ],
    "C": [
        ("C1", "C", {"工业清洗机": 10368, "自动化输送臂": 10368}),
        ("C2", "C", {"精密灌装机": 7406}),
        ("C3-1", "C", {"精密灌装机": 6480, "自动化输送臂": 5184}),
        ("C4-1", "C", {"高速抛光机": 12000, "工业清洗机": 14400}),
        ("C5-1", "C", {"自动传感多功能机": 14400}),
        ("C3-2", "C", {"精密灌装机": 6480, "自动化输送臂": 5184}),
        ("C4-2", "C", {"高速抛光机": 12000, "工业清洗机": 14400}),
        ("C5-2", "C", {"自动传感多功能机": 14400}),
        ("C3-3", "C", {"精密灌装机": 6480, "自动化输送臂": 5184}),
        ("C4-3", "C", {"高速抛光机": 12000, "工业清洗机": 14400}),
        ("C5-3", "C", {"自动传感多功能机": 14400}),
    ],
    "D": [
        ("D1", "D", {"工业清洗机": 8640}),
        ("D2", "D", {"精密灌装机": 14400, "自动化输送臂": 9600}),
        ("D3", "D", {"精密灌装机": 4629}),
        ("D4", "D", {"高速抛光机": 45000, "自动传感多功能机": 18000}),
        ("D5", "D", {"自动传感多功能机": 18000}),
        ("D6", "D", {"高速抛光机": 25200}),
    ],
    "E": [
        ("E1", "E", {"工业清洗机": 14400}),
        ("E2", "E", {"精密灌装机": 6172}),
        ("E3", "E", {"自动传感多功能机": 7200, "工业清洗机": 21600}),
    ],
}

BASE_COUNTS: Dict[str, Dict[str, int]] = {
    "班组1": {"自动化输送臂": 4, "工业清洗机": 5, "精密灌装机": 5,
             "自动传感多功能机": 1, "高速抛光机": 1},
    "班组2": {"自动化输送臂": 4, "工业清洗机": 5, "精密灌装机": 5,
             "自动传感多功能机": 1, "高速抛光机": 1},
}
SPEED = {name: 2.0 for name in EQUIPMENT_TYPES}  # m/s
PRICE = {"自动化输送臂": 50000, "工业清洗机": 40000, "精密灌装机": 35000,
         "自动传感多功能机": 80000, "高速抛光机": 75000}

DISTANCE_M: Dict[Tuple[str, str], int] = {
    ("班组1", "A"): 400, ("班组1", "B"): 620, ("班组1", "C"): 460,
    ("班组1", "D"): 710, ("班组1", "E"): 400,
    ("班组2", "A"): 500, ("班组2", "B"): 460, ("班组2", "C"): 620,
    ("班组2", "D"): 680, ("班组2", "E"): 550,
    ("A", "B"): 1020, ("A", "C"): 1050, ("A", "D"): 900,
    ("A", "E"): 1400, ("B", "C"): 1100, ("B", "D"): 1630,
    ("B", "E"): 720, ("C", "D"): 520, ("C", "E"): 850,
    ("D", "E"): 1030,
}
for (u, v), d in list(DISTANCE_M.items()):
    DISTANCE_M[(v, u)] = d
for node in TEAMS + WORKSHOPS:
    DISTANCE_M[(node, node)] = 0

# 已通过多起点模拟退火与局部邻域搜索得到的稳定解序列。
Q2_BEST_SEQUENCE = list("BCCDABDECDEBECDCCCADCBCCADC")
Q3_OPT_SEQUENCE = list("CDEDDDCCBCCCADEECADBCACBCBC")

@dataclass
class Machine:
    machine_id: str
    team: str
    eq_type: str
    available: int
    location: str

@dataclass
class Assignment:
    operation: str
    workshop: str
    machine_id: str
    team: str
    eq_type: str
    start: int
    end: int
    duration: int
    travel_time: int
    from_location: str

# -------------------------- 2. 数据核验与统计 --------------------------
def inspect_xlsx_with_artifact_tool(xlsx_path: Optional[str]) -> Dict[str, object]:
    audit = {"used_embedded_normalized_data": True, "xlsx_checked": False}
    if not xlsx_path or not Path(xlsx_path).exists():
        audit["message"] = "未提供可访问的 xlsx,使用程序内置的规范化附件数据。"
        return audit
    try:
        from artifact_tool import Blob, SpreadsheetFile
        wb = SpreadsheetFile.import_xlsx(Blob.load(str(xlsx_path)))
        result = wb.inspect({"kind": "sheet", "include": "id,name"}).ndjson
        audit.update({"xlsx_checked": True, "sheet_metadata": result,
                      "message": "已使用 artifact_tool 核验工作表结构;计算采用规范化后的等价数据。"})
    except Exception as exc:
        audit["message"] = f"附件核验未完成({exc}),已回退到程序内置的规范化数据。"
    return audit


def all_operation_rows() -> List[Dict[str, object]]:
    rows: List[Dict[str, object]] = []
    for workshop, ops in OPERATIONS.items():
        for op_id, _, req in ops:
            op_duration = max(req.values())
            rows.append({
                "workshop": workshop,
                "operation": op_id,
                "equipment_count": len(req),
                "operation_duration": op_duration,
                "sum_equipment_duration": sum(req.values()),
                "duration_ratio": min(req.values()) / max(req.values()) if len(req) == 2 else 1.0,
                "requirements": req,
            })
    return rows


def descriptive_statistics() -> Dict[str, object]:
    rows = all_operation_rows()
    durations = np.array([r["operation_duration"] for r in rows], dtype=float)
    sum_durations = np.array([r["sum_equipment_duration"] for r in rows], dtype=float)
    return {
        "operation_count": len(rows),
        "single_equipment_operations": sum(r["equipment_count"] == 1 for r in rows),
        "dual_equipment_operations": sum(r["equipment_count"] == 2 for r in rows),
        "mean": float(np.mean(durations)),
        "median": float(np.median(durations)),
        "std": float(np.std(durations, ddof=1)),
        "min": float(np.min(durations)),
        "max": float(np.max(durations)),
        "q1": float(np.quantile(durations, 0.25)),
        "q3": float(np.quantile(durations, 0.75)),
        "cv": float(np.std(durations, ddof=1) / np.mean(durations)),
        "skewness": float(stats.skew(durations, bias=False)),
        "kurtosis_excess": float(stats.kurtosis(durations, fisher=True, bias=False)),
        "shapiro_p": float(stats.shapiro(durations).pvalue),
        "sum_duration_mean": float(np.mean(sum_durations)),
    }

# -------------------------- 3. 调度模型与求解 --------------------------
def make_machines(teams: Sequence[str], purchases: Optional[Dict[Tuple[str, str], int]] = None) -> List[Machine]:
    purchases = purchases or {}
    machines: List[Machine] = []
    for team in teams:
        team_no = team[-1]
        for eq in EQUIPMENT_TYPES:
            count = BASE_COUNTS[team][eq] + purchases.get((team, eq), 0)
            for i in range(1, count + 1):
                machines.append(Machine(f"{eq}{team_no}-{i}", team, eq, 0, team))
    return machines


def travel_seconds(origin: str, destination: str, speed: float = 2.0) -> int:
    return int(math.ceil(DISTANCE_M[(origin, destination)] / speed))


def evaluate_sequence(
    sequence: Sequence[str],
    teams: Sequence[str],
    purchases: Optional[Dict[Tuple[str, str], int]] = None,
    speed_multiplier: float = 1.0,
    duration_multiplier: float = 1.0,
) -> Tuple[int, List[Assignment], Dict[str, int]]:
    """串行调度生成方案(SSGS)。

    对序列中每个工序,在满足同车间前序约束的基础上,选择最早完工的设备或设备组合。
    双设备工序同步启动,工序完成时刻为两台设备结束时刻的最大值;作业较短的设备完成后
    即释放。跨车间运输发生在设备上一作业结束之后。
    """
    machines = make_machines(teams, purchases)
    by_type: Dict[str, List[Machine]] = defaultdict(list)
    for m in machines:
        by_type[m.eq_type].append(m)
    next_index = {w: 0 for w in WORKSHOPS}
    predecessor_end = {w: 0 for w in WORKSHOPS}
    assignments: List[Assignment] = []

    for workshop in sequence:
        idx = next_index[workshop]
        if idx >= len(OPERATIONS[workshop]):
            raise ValueError(f"非法工序序列:{workshop} 出现次数过多")
        op_id, _, requirements = OPERATIONS[workshop][idx]
        req_items = list(requirements.items())

        if len(req_items) == 1:
            eq, base_duration = req_items[0]
            duration = int(math.ceil(base_duration * duration_multiplier))
            best = None
            for m in by_type[eq]:
                t_move = travel_seconds(m.location, workshop, SPEED[eq] * speed_multiplier)
                ready = m.available + t_move
                start = max(predecessor_end[workshop], ready)
                end = start + duration
                key = (end, start, m.machine_id)
                if best is None or key < best[0]:
                    best = (key, m, start, end, t_move, m.location)
            _, m, start, end, t_move, origin = best
            assignments.append(Assignment(op_id, workshop, m.machine_id, m.team, eq,
                                          start, end, duration, t_move, origin))
            m.available, m.location = end, workshop
            operation_end = end
        else:
            (eq1, base_d1), (eq2, base_d2) = req_items
            d1 = int(math.ceil(base_d1 * duration_multiplier))
            d2 = int(math.ceil(base_d2 * duration_multiplier))
            best = None
            for m1 in by_type[eq1]:
                t1 = travel_seconds(m1.location, workshop, SPEED[eq1] * speed_multiplier)
                r1 = m1.available + t1
                for m2 in by_type[eq2]:
                    t2 = travel_seconds(m2.location, workshop, SPEED[eq2] * speed_multiplier)
                    r2 = m2.available + t2
                    start = max(predecessor_end[workshop], r1, r2)
                    e1, e2 = start + d1, start + d2
                    op_end = max(e1, e2)
                    key = (op_end, start, e1 + e2, m1.machine_id, m2.machine_id)
                    if best is None or key < best[0]:
                        best = (key, m1, m2, start, e1, e2, t1, t2, m1.location, m2.location)
            _, m1, m2, start, e1, e2, t1, t2, o1, o2 = best
            assignments.append(Assignment(op_id, workshop, m1.machine_id, m1.team, eq1,
                                          start, e1, d1, t1, o1))
            assignments.append(Assignment(op_id, workshop, m2.machine_id, m2.team, eq2,
                                          start, e2, d2, t2, o2))
            m1.available, m1.location = e1, workshop
            m2.available, m2.location = e2, workshop
            operation_end = max(e1, e2)

        predecessor_end[workshop] = operation_end
        next_index[workshop] += 1

    active_workshops = set(sequence)
    if any(next_index[w] != len(OPERATIONS[w]) for w in active_workshops):
        raise ValueError("工序序列未覆盖所涉及车间的全部工序")
    makespan = max(predecessor_end[w] for w in active_workshops)
    return makespan, assignments, predecessor_end


def q1_exact() -> Tuple[int, List[Assignment], Dict[str, int]]:
    # 只有 A 车间,工序序列固定。其余设备可在 0 时刻并行向 A 车间转运。
    return evaluate_sequence(list("AAA"), ["班组1"])


def random_multiset_sequence(rng: random.Random) -> List[str]:
    seq = []
    for w in WORKSHOPS:
        seq.extend([w] * len(OPERATIONS[w]))
    rng.shuffle(seq)
    return seq
全部论文请见下方" 只会建模 QQ名片" 点击QQ名片即可
相关推荐
weitao_6668 小时前
电商商品 CSV 导入校验:把脏字段挡在 AI 客服与上架前
数据分析
极昆仑智慧11 小时前
智能问数五级成熟度模型:从“能问“到“能协作“的演进路径
人工智能·语言模型·数据分析
学掌门11 小时前
超级菜鸟怎么学习数据分析?
python·学习·数据分析
追风少年ii12 小时前
课前准备--蛋白质PDB文件与PDBQT文件的格式与区别
数据库·数据分析·分子动力学·分子对接
数模竞赛Paid answer1 天前
2026年五一杯数学建模A题煤矿巷道支护问题求解全过程文档及程序
数学建模·数据分析·五一杯
饼干哥哥1 天前
十年数据分析经验,被我打包成了4个跨境VOC Skill
前端·数据分析·数据可视化
数模竞赛Paid answer1 天前
2026年五一杯数学建模C题边坡预警问题求解全过程文档及程序
算法·数学建模·五一杯
数模竞赛Paid answer1 天前
2021年深圳杯数学建模A题火星探测器着陆控制方案解题全过程论文及程序
算法·数学建模·深圳杯
smppbzyc2 天前
2026华数杯数学建模A题原创论文分享
数学建模·数学建模竞赛·华数杯·全国大学生数学建模竞赛·华数杯数学建模·2026华数杯