Python 中随机生成符合约束条件的手术排程表:避免列表引用与重复追加陷阱

夏芳姑娘_8934

夏芳姑娘_8934

2026-05-24

776人浏览

原创

Python 中随机生成符合约束条件的手术排程表:避免列表引用与重复追加陷阱

本文详解如何在 python 中正确实现带约束条件的随机排程生成逻辑,重点解决因列表引用误用和重复追加导致的无限循环问题,并提供可复用的健壮初始化方案。

本文详解如何在 python 中正确实现带约束条件的随机排程生成逻辑,重点解决因列表引用误用和重复追加导致的无限循环问题,并提供可复用的健壮初始化方案。

在医院手术排程优化问题中,一个常见约束是:任意时间槽(slot)内,跨三个手术室(theatre)所需的麻醉师总数不得超过 2 人。为满足该约束,开发者常采用“生成—验证—重试”策略:先随机构建排程表,再校验约束;若不满足,则重新生成,直至通过。但实践中极易陷入无限循环——表面看 while 条件始终为 False,实际却从未真正更新待检验的数据。根本原因在于对 Python 列表可变性与函数参数传递机制的理解偏差。

? 问题根源:列表被反复追加,而非重置

原 RandomiseTimetable() 函数存在两个关键缺陷:

  1. 副作用式修改入参:函数接收 timetable 并对其执行 timetable.append(column),但未清空原有内容;
  2. 越界忽略新增列:AnaesthetistsWithinLimit() 始终只检查 timetable[0][j], timetable[1][j], timetable[2][j] —— 即仅前 3 列。而每次调用 RandomiseTimetable() 都向 timetable 追加 3 列,导致 timetable 长度持续增长(如第 1 次后为 3 列,第 2 次后为 6 列,第 3 次后为 9 列……),但校验逻辑永远只读取最初那 3 列(它们从未被更新),从而陷入“反复校验同一组无效数据”的死循环。

此外,timetable 作为可变对象传入函数,在函数内直接修改会改变原始引用,进一步加剧状态混乱。

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载

✅ 正确解法:纯函数式生成 + 显式重赋值

应将 RandomiseTimetable() 改写为无副作用的纯函数:不依赖/修改外部状态,每次调用都返回一个全新、干净的排程表。主循环则负责接收新结果并替换旧值。

import random

def RandomiseTimetable(surgeryData):
    """生成一个全新的 3×9 手术排程表,每列为一个手术室,每行为一个时间槽"""
    timetable = []  # ✅ 每次调用都创建空列表,确保干净起点
    for _ in range(3):  # 3 个手术室
        column = []
        for _ in range(9):  # 9 个时间槽
            random_index = random.randint(0, len(surgeryData) - 1)
            row = surgeryData.iloc[random_index]
            column.append({
                "surgery": row["surgery"],
                "name": row["name"],
                "requires_anaesthetist": row["requires_anaesthetist"]
            })
        timetable.append(column)
    return timetable  # ✅ 返回全新结构,不污染输入

# 主生成逻辑(推荐写法)
timetable = RandomiseTimetable(surgeryData)  # 初始化
while not AnaesthetistsWithinLimit(timetable, 2):
    timetable = RandomiseTimetable(surgeryData)  # ✅ 显式重赋值,彻底替换
FitnessFunction(timetable, True)

? 关键改进点:

  • RandomiseTimetable 不再接受 timetable 参数,消除隐式依赖;
  • 每次调用均 return 全新 list,保证数据纯净;
  • 主循环中 timetable = ... 是重新绑定变量名到新对象,旧对象被垃圾回收,彻底规避引用残留。

⚠️ 补充注意事项

  • 性能提示:若约束极难满足(如麻醉师需求过高),纯随机重试可能效率低下。建议后续引入启发式初始化(如优先分配低需求手术)或局部搜索(如交换两个 slot 内容后重校验)。
  • 边界安全:surgeryData 为空时需加 if len(surgeryData) == 0: raise ValueError("No surgeries available") 防御。
  • 校验函数健壮性:当前 AnaesthetistsWithinLimit() 假设 timetable 至少有 3 列。可在开头添加断言:assert len(timetable) >= 3, "Timetable must have at least 3 theatres"。

✅ 总结

解决此类“看似循环实则停滞”的问题,核心在于厘清 数据所有权 与 状态生命周期:
✅ 让生成函数负责“创造”,而非“修补”;
✅ 让主流程负责“决策与替换”,而非“就地修改”;
✅ 始终假设可变对象(如 list)在函数间传递时是共享的,除非显式复制或重建。

遵循这一原则,不仅能修复当前约束校验失效问题,更能提升整套排程系统的可测试性、可维护性与可扩展性。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4644

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1749

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

27457

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3307

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3327

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2583

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习