D 题 时频冲突检测与消解 思路分析
这题本质是组合优化加图论,纯逻辑纯代码,不碰任何外部系统。
一、先把数据模型吃透
每个用频计划有五个字段:频段区间、首次时间区间、间隔时长、使用次数。要注意使用次数会把一个计划展开成多个时间块------比如 A001 频段 80 到 90、首次时间 35 到 40、间隔 60、用 3 次,那它实际占用三个时间块:35 到 40、95 到 100、155 到 160,频段都是 80 到 90。判断两个计划冲不冲突,就是看它们各自展开后的所有时间块里,有没有一对时间块的时间区间和频段区间同时交叠。区间都是半开区间,交叠判断注意边界(比如 35 到 40 和 40 到 45 不算交叠)。
二、问题 1:冲突检测
150 个计划,两两比(约 1.1 万对),每对展开使用次数去判交叠,O(n 平方) 直接遍历,代码几十行。把冲突对填进 result1.xlsx,统计总冲突数。送分题,务必做对做全,这是后面所有问的基础。
三、问题 2:冲突消解
核心难点。对每个冲突,你可以把其中一个计划的频段平移(不超过 10 个频段宽度)、或时间平移(不超过 5 个时间单位)、或直接撤销,目标是消解后无冲突,且满足一堆偏好:A 类优先级最高尽量保留、尽量少撤销、尽量少调整、调整幅度尽量小。这是典型多目标组合优化。
建模两条路:一条是整数规划(MILP)------决策变量是每个计划是否撤销、是否平移、平移多少,目标按撤销数、调整数、幅度、高优先级保留加权(撤销的惩罚给最大,高优先级撤销惩罚更大),约束是消解后任意两计划不冲突;另一条是启发式------先造冲突图,然后按优先级从低到高贪心地调整或撤销,再局部搜索优化。平移量是离散的(频段正负 10 共 21 种、时间正负 5 共 11 种),离散化后枚举或求解都可行。推荐用 MILP(Python 的 pulp 或 ortools),能拿到可解释的最优或近优解;规模大算不动就换贪心加模拟退火。
四、问题 3:最多塞多少 C 类
在问题 2 消解完的无冲突方案基础上,不限制平移幅度、不增加资源,问最多还能塞进多少个 C 类。这是二维装箱、区间调度问题:找到所有空闲的频段乘时间的矩形空槽,尽量多地塞入 C 类计划。可以建模成最大独立集或装箱的整数规划,也可以贪心(比如按时间最早结束优先、首次适应、最佳适应)。因为空槽有限、C 类计划多,用贪心加回溯或直接整数规划求最大数量都行。输出新增 C 类的频段区间和时间区间。
五、问题 4:C 类可调间隔
在问题 1 的冲突基础上消解,但这次允许部分 C 类调整间隔时长(与原间隔差异不超过 10 个时间单位)。相当于给 C 类多了一个可调维度,模型跟问题 2 几乎一样,只是 C 类的决策变量里多一个间隔是否调整、调多少。用扩展的 MILP 或启发式做,最后按表 1 统计保留、调整、撤销数量。
六、方法清单和易错点
整体方法:区间交叠判定、冲突图、图着色、独立集、整数规划(MILP)、贪心加局部搜索、模拟退火、遗传算法、区间调度与二维装箱。最容易翻车:时间块展开时区间端点算错(第二次是首时加间隔、末时加间隔,不是接着上次)、半开区间边界、优先级没真正反映到目标函数里。这题全程可本地验证,做完务必自己写个检查程序,确认消解后确实零冲突。