我正在为模型出租车公司做一些班次调度模拟.该公司拥有350辆出租车,并且在任何一天都在使用.司机每人每班工作5班,每班12小时,每天有四班重叠.时间为3:00-15:00,15:00-3:00,16:00-4:00和4:00-16:00.我最初是用Python开发的,因为需要快速开发它,我认为性能是可以接受的.原始参数每天只需要两班(3:00-15:00和15:00-3:00),虽然性能不是很好,但对我的用途来说已经足够了.它可以在大约8分钟内为司机制定每周计划,使用简单的强力算法(评估所有潜在的掉期以查看情况是否可以改善.)
由于四个重叠的转变,性能绝对是糟糕的.每周安排一个小时需要一个多小时.我已经使用cProfile进行了一些分析,看起来主要的罪魁祸首是两种方法.一种方法是确定在轮班中放置驾驶员时是否存在冲突.它确保他们不是在同一天轮班,或在前一班或后班任职.每天只有两班,这很容易.人们只需要确定驾驶员是否已经安排在班次之前或之后直接工作.随着四个重叠的转变,这变得更加复杂.第二个罪魁祸首是确定班次是白天还是夜班的方法.再次,使用原始的两个班次,这就像确定班次号码是偶数还是奇数一样容易,班次号码从0开始.第一班次(班次0)被指定为夜班,下一班是白天,等等等等.现在前两个是晚上,接下来的两个是,等等.这些方法互相称呼,所以我将他们的身体放在下面.
def conflict_exists(shift, driver, shift_data):
next_type = get_stype((shift+1) % 28)
my_type = get_stype(shift)
nudge = abs(next_type - my_type)
if driver in shift_data[shift-2-nudge] or driver in shift_data[shift-1-nudge] or driver in shift_data[(shift+1-(nudge*2)) % 28] or driver in shift_data[(shift+2-nudge) % 28] or driver in shift_data[(shift+3-nudge) % 28]:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
请注意,get_stype返回shift的类型,0表示夜班,1表示班次.
为了确定班次类型,我正在使用这种方法:
def get_stype(k):
if (k / 4.0) % 1.0 < 0.5:
return 0
else:
return 1
Run Code Online (Sandbox Code Playgroud)
这是cProfile的相关输出:
ncalls tottime percall cumtime percall
57662556 19.717 0.000 19.717 0.000 sim8.py:241(get_stype)
28065503 …
Run Code Online (Sandbox Code Playgroud) 我试图允许y轴溢出,同时隐藏x轴上的溢出.有人可能会期望添加这些属性:
.overflow {
overflow-x: hidden;
overflow-y: visible;
}
Run Code Online (Sandbox Code Playgroud)
块级元素就足够了,但是由于这里记录的一些CSS实现怪癖,这实际上并不起作用.最终发生的事情是overflow-y的计算值变为auto,而overflow-x保持隐藏状态.
有没有其他方法可以实现我想要的行为?
只是为了更详细一点,我有一个水平的项目列表,我正在使用自定义按钮滚动.列表的包含元素的宽度远低于列表的宽度.我不希望出现滚动条,因为我使用自己的自定义按钮来浏览列表,因此我需要隐藏overflow-x.在悬停时,我想应用一个变换来扩大元素的大小,但我希望元素能够溢出包含元素的顶部和底部之外,因此需要overflow-y可见.