欢迎关注,敬请点赞!

排列组合——排列有先后,组合很公平

  • 摘要:
  • 题目:
  • 思路:
    • 程序段展示:
  • 总结:

【关键字】:

  • 组合:排列中的唯一顺序(从小到大)选择结果,通常比排列的结果集少得多。

摘要:

  • python代码实现设备排班;
  • 本文使用的常用函数:(1) 列表追加:list.append() ;(2)列表排序:list.sorted() ,默认升序;
  • 本文使用的库:(1) 排列组合:import itertools

题目:

某研究室有四台高级设备需要以天为单位(周一至周日)安排轮换启用,轮换规则为:
每台设备功能相同;
每台设备每周需要启用四天;
每台设备之间启用时间不能完全相同;
周一至周五每天需要两台设备工作;
周六周日每天需要三台设备工作;
每种设备需要在周六周日中至少一天工作;
试利用编程方式计算:
1)共有多少种设备排班方案(若日期相同而分配设备不同视作同一方案,例如:
[1356, 1467, 2357, 2467]与[1467, 2357, 1356, 2467]视作同一方案);
2)限定每台设备均不能连续工作超过两天(例如123、567、671均不可),重新计算排班方案数量。

思路:

(1) 根据题意,总的工作时work_list = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7];
(2) 可以用4个列表分别代表4台设备,每个列表中需要有7或6;
(3) 手动枚举找规律,避免重复,按从大到小逐步夹逼,比如:

[4, 5, 6, 7], [3, 5, 6, 7], [1, 2, 4, 7], [1, 2, 3, 6];

[4, 5, 6, 7], [2, 5, 6, 7], [1, 3, 4, 7], [1, 2, 3, 6];

[4, 5, 6, 7], [1, 5, 6, 7], [2, 3, 4, 7], [1, 2, 3, 6];

(4) 写一些之后,发现仍不能写出相应的代码,也没有显著的规律,仅发现每个列表都是从[1, 2, 3, 4, 5, 6, 7]中挑出来4个元素,里面需要有7或6,同时每组4个列表拼接起来(再排序一下)的元素及其个数与总的工作时一致;
(5) 等到不想再手动枚举,让电脑来自动枚举时,自然想到排列组合,排列去重比较麻烦,组合天然就有去重属性,且运算快;
(6) 两次组合:第一次,从7个中挑出4个的组合,用“里面有7或6”筛选出初步符合的;第二次,从所有初步符合的结果集中挑出4个的组合,分配给4台设备,用“每组4个列表拼接起来与总工作时一致”再筛选一次;
(7)第二题,将第一次7选4且有7或6的初步符合结果,再用没有子集{1, 2, 3}或{2, 3, 4}或{3, 4, 5}或{4, 5, 6}或{5, 6, 7}或{6, 7, 1}或{7, 1, 2}筛选一次,接下来与第(6)步第二次一致。

  • 程序段展示:

返回顶部

import itertoolswork_list = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7]  # 总的排班schedule_init = []  # 初步排班
combination_init = itertools.combinations([1, 2, 3, 4, 5, 6, 7], 4)  # 抽4天工作的所有组合for i in combination_init:if 6 in i or 7 in i:  # 有6或7的扩充到列表schedule_init.append(list(i))schedule_second = []  # 二版排班,对四台设备进行组合
combination_second = itertools.combinations(schedule_init, 4)  # 对列表中的初步合格组合分配给4台设备,也用组合
for i in combination_second:if sorted(i[0] + i[1] + i[2] + i[3]) == work_list:  # 每一种组合中的列表拼接,然后排序,需要等于总排班,才是正确分配schedule_second.append(list(i))print(i)
num_exercise_1 = len(schedule_second)  # 第一题排班总数
print('第一题总数', num_exercise_1)# 第二题:
schedule_third = []  # 三版排班,剔除对连续工作3天的情况
for i in schedule_init:if not (set(i).issuperset({1, 2, 3}) or set(i).issuperset({7, 1, 2}) or set(i).issuperset({6, 7, 1}) or set(i).issuperset({2, 3, 4}) or set(i).issuperset({3, 4, 5}) or set(i).issuperset({4, 5, 6}) or set(i).issuperset({5, 6, 7})):  # 选择初版排班中,不包含连续工作3天的情况schedule_third.append(i)schedule_final = []  # 终版,对四台设备进行组合
combination_third = itertools.combinations(schedule_third, 4)
for i in combination_third:if sorted(i[0] + i[1] + i[2] + i[3]) == work_list:  # 每一种组合中的列表拼接,然后排序,需要等于总排班,才是正确分配schedule_final.append(list(i))print(i)
num_exercise_2 = len(schedule_final)  # 第二题排班总数
print('第二题总数', num_exercise_2)

总结:

  • 与NBA比赛场次的安排很像,编程源于生活。

欢迎关注,敬请点赞!
返回顶部

【实践题】——设备排班表(排列有先后,组合很公平)相关推荐

  1. 【办公类-16-06】“2022下学期 总园活动室(沙水+建构)排班表”(python 排班表系列)

    背景需求: 最近保教主任一直在为总园的活动室安排而头疼不已,和组长们商议许久,依旧无法合理把活动室安排好.3月2日下午,听主任和游戏室成员聊了一个小时的排班,结论是除沙水和建构外,其余空余时间都是&q ...

  2. 【办公类-16-05-01】“2022上学期 大班游戏活动室排班表——班主任版21周”(python 排班表系列)

    样式展示:1-8周的内容,一摸一样复制到9-16周.17-24周 背景需求: 8月底,保教主任花了不少时间调试"大班游戏活动室安排表.docx",并多次让我给他调整Word的表格框 ...

  3. 【办公类-16-01-02】“2022学年上半学期-代班排班表(跳过节日)”(python 排班表系列)

    样式效果: 背景需求: 2022年上半学期的排班表是按照每周四天,周三空缺方式排列的(不考虑节日) 本篇是假设"如果需要跳过节日",那么排班内容是否可以跳过节日延续,实现" ...

  4. 【办公类-16-05-02】“2022上学期 大班游戏活动室排班表——领导版8周”(python 排班表系列)

    样式展示:生成一份按8周排序的"大班活动室安排表" 1.人工排序的样式 2.Python生成的样式和内容 背景需求: 前一个<大班游戏活动室排班表>主要是针对班主任贴周 ...

  5. excel设置图片自动更新_智能Excel排班表,日期自动更新,三班排班一键统计,极简轻松...

    Hello大家好,我是帮帮.今天跟大家分享一张智能Excel排班表,日期自动更新,班次一键统计,极简轻松. 为了让大家能更稳定的下载模板,我们又开通了全新下载方式(见文章末尾),以便大家可以轻松获得免 ...

  6. php日历排班表,日历排班表软件下载

    日历排班表软件app是一款掌上智能排版助手.日历排班表软件app主要为有倒班.值班需求的工作人员提供智能排班功能,您可以通过日历排班表软件app输入对应的数据,就可以精准算出自己的上班.值班时间,非常 ...

  7. 打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间

    目前有1张打卡记录表,1张排班表,效果要打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间的!效果图 目前问题点:1.视图写法把区间时间写死,没法根据排班信息进行打卡数据分类 ...

  8. java如何实排班表时间算法_安卓自定义View-日历型排班表-CalendarScheduleView

    [原创,转载请注明出处] [使用效果] 未点击.jpg 点击.jpg 注释很详细,因此直接上代码: CalendarScheduleView.java /** * 日历型排班表 * 注意:只能显示本月 ...

  9. element ui table实现考勤排班表

    1.项目需求 1.1需求 制作如下的考勤排班表,可以显示每个岗位每一天的考勤排班情况,并且可以下拉选择人员排班人员更改. 1.2 难点分析 在表格中嵌入下拉选择功能. 需要动态显示每个月的排班情况,因 ...

最新文章

  1. luoguP1354房间最短路问题
  2. 网页设计中的默认字体样式详解
  3. 推荐系统之冷启动问题
  4. sklearn-标准化标签LabelEncoder
  5. Python下tornado实现webSocket实现
  6. Microsoft Silverlight 4 脱机文档
  7. 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...
  8. 飞鸽传书扫描器 v1.3
  9. 发布npm包时遇到的问题及解决方法
  10. linux vi脚本,linux下vi(vim)的新的用法总结
  11. java多个文件压缩_java实现多个文件压缩
  12. Linux下的网络配置与连接
  13. 转大神的日志 【大杂烩】杂7杂8的东西
  14. 迅捷ocr文字识别软件是如何将图片转成文字的?
  15. 双向链表 建立和插入
  16. java 交流群 14187321 欢迎java爱好者参与
  17. 东莞计算机三级等级入户,东莞入户条件2020新规定,落户东莞必看!
  18. 配置Nginx前端Apache后端服务器LNMPA-与LNMP,HHVM性能比拼
  19. android 模拟器优化,如何设置才能流畅的使用安卓模拟器玩游戏,好坏取决于哪些因素...
  20. sqldeveloper fedora 20 [error occurred during error reporting (printing problematic frame), id 0xb]

热门文章

  1. test.vue奶茶店怎么用手机点单,通过小程序实现在线奶茶食品售卖,在线买单,在线排队
  2. Vavr User Guide中英对照版
  3. Metasploitable2使用指南
  4. 【招行】信用卡推荐用户列表 数据岗
  5. 攀爬机器人 蝎子_霸气侧漏:大学生做蝎子机器人,可感应攻击物体
  6. 有关win7 设备管理器空白,没有声音的问题
  7. 通过电脑给linux开发板联网,Linux 开发板通过网线连电脑上网的方法和配置步骤...
  8. HTML+CSS系列实战之超链接、音视频
  9. 《Windows CE 大排档》SDK下载
  10. 【Python自动化测试】:模拟键盘操作