从皇后问题思考【车辆检修计划算法】的排程问题解

八皇后问题-百度百科

 编辑 讨论

八皇后问题英文Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。

问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。

车辆检修计划

业务问题:需要为地铁某线的72辆车,按照均衡修的规程(每辆车,30正负5天内必须检修一次,且节假日不作业),每天至多检修4辆车,排出整年的检修计划。

问题重新解读为:

一条线线所有的车视为72个不同序号的皇后,周期内可用日期(一年以元旦1月1日到12月31日为准内所有日期)视为棋盘行数,车辆数视为列数。

即在  日期数Ds*车辆数Cs的棋盘上放置Ds个皇后,要求:任意一天内至多出现4个皇后(每日最大修程数),每个皇后前后出现的日期间隔30+-5天(修程的周期间隔)(另外每个皇后只出现在自己所在的列上),求出一种可行的摆法。

棋盘(即作业排程表)  如下

 

1

2

3

4

...

72

1

 

 

 

 

...

 

2

 

 

 

 

...

 

3

 

 

 

 

...

 

4

 

 

 

 

...

 

5

 

 

 

 

...

 

...

...

...

...

...

...

...

365

 

 

 

 

 

 

 

车辆检修计划算法问题最后归结为:

1、棋盘的形成

2、放置的规则

3、求摆放的结果

一、棋盘的形成

1、列数:每条线上的车辆数

2、行数:35(为历史数据第一次完整摆放所有皇后的数据)+365+35(修程周期)共计435行。

二、放置的规则

0、初始72皇后出现在前35行上

1、每行至多出现4个皇后(每日均衡修最大修列数)

2、每个皇后只出现在属于自己的列中,前后间隔最小25,最大35行以内。(均衡修的周期/里程间隔

3、当前行对应日期处于节假日时,不允许放置任何皇后(均衡修限制节假日排程

4、在有限的棋盘内需要每个皇后都出现12次(每年均衡修最小维修次数

5、多种棋子同时放置:小于皇后的棋子不能与皇后同时出现(修程覆盖问题)

三、摆放的结果

根据棋盘摆放的位置,形成最终的排程计划,保存进数据库。

【遍历每辆车,按修程先后取得修程代码,根据行数生成对应日期,最后组合(车辆,均衡修,日期)为计划明细。】

四、求解的算法

典型的CSP问题

约束编程 Constraint Programming

CSP相关算法

针对CSP的算法主要分成了两类,一类属于非完备性算法,另一类属于完备性算法。

非完备性算法包括各种启发式或元启发式算法,例如模拟退火、遗传算法,它们的目的不在于找到精确的最优解,只要在合理的时间找到一个相对最优解,这些算法不会遍历整个解空间,因此如果原问题有解,那么通常非完备性算法可以快速找到一个合理的解,但是如果原问题无解,非完备性算法无法证明无解,换句话说即使跑了很长时间算法得到的解不合理,我们也不能认定该问题无解;

而完备性算法则以各种搜索和推理技术为主,称其为完备是因为这些算法实际上是搜索了整个解空间的,因此如果这些算法得出的结论是无解,那么该问题就是无解的,同时如果问题有解,得到的最终解也肯定是最优的。

约束编程(Constraint Programming, CP)

是围绕关系约束这一数学概念建立起来的方法论,是研究基于约束的组合优化问题的计算系统。

实际生活中有很多复杂的组合优化问题,我们当然可以对不同的问题以合适的算法分别设计和开发计算系统,但是这样不具有通用性。

约束编程或者说约束程序设计就是以高效的约束求解技术为核心,结合强说明性的问题描述方式建立的组合优化计算系统,对于使用者来说,可以用约束编程语言表达问题的任意约束,并且考虑新类型的约束时(特别是在面向对象框架中),只需要对约束系统进行扩展。

像Google OR-Tools的CP Solver就是一个CP系统,不仅内部提供了高效的求解CSP问题的算法,外部也提供了灵活的约束语言接口,用于构建适合自身项目的优化问题模型。
 

OR_tools

google的开源优化算法包ortools,支持线性规划、整数规划,可以方便的求解Routing、Bin packing、Network flows、Assignment、Scheduling等问题。
官网地址为:https://developers.google.com/optimization
开源代码地址为 https://github.com/google/or-tools

github无法访问解决办法:

1、采用镜像访问

这里提供两个最常用的镜像地址:

2、其他方法参考:提高国内访问 github 速度的 9 种方法!

https://zhuanlan.zhihu.com/p/314071453

OR_tools JAVA版本按照教程:

https://developers.google.cn/optimization/install/java/windows

下载并解压缩OR_tools的二进制发行版:

https://github.com.cnpmjs.org/google/or-tools/releases/download/v8.2/or-tools_flatzinc_VisualStudio2019-64bit_v8.2.8710.zip

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值