我试图在资源分配问题上找到算法或问题名称,就像这样。
月球基地有一个气闸,一次只能有一个人使用,要么进入要么退出,需要20秒才能通过。气闸过渡不能提前中止或逆转。宇航员在基地外时(例如10分钟)的空气量有限。他们在月球上的工作是操作一些与月球基地距离不同的钻头,并使它们以100%的载人正常运行时间运行。
我希望回答以下问题: 没有宇航员在空中飞行,可以支持多少个钻探站点?你如何确定气闸的时间表(谁进入/退出以及以什么顺序进入)?
有两个组成部分:
- 首先确定每个钻井现场所需的宇航员数量,以及100%的正常运行时间
- 确定可使用一个气闸操作的钻头数量
Per Drill:
MaxWorkTime[i] = AirTime - 2*TravelTime[i]
ActualWorkTime[i] < MaxWorkTime[i]
WorkersPerDrill[i] = AirTime/ActualWorkTime[i]
for each drill
try to schedule airlock time
当工作时间接近100%利用率时,可以减少工作时间以更好地安排工作人员(我认为)。
下面是一个简单的图表,试图更多地澄清问题。气闸时间由宇航员使用它消耗,并由条形表示。我希望将使用量增加到最大值,而不是在外面发送太多宇航员。显示了一次演习的宇航员工作周期。宇航员使用气闸时间离开,走到工地,工作,走回基地,并使用气闸进入。
|---time-->
Airlock: |--x---| |--x---| |--x---| |--x---|
Astronaut1 |-lock-|--to--|---------drill1--------|-from-|-lock-|
Astronaut2 |-lock-|--to--|-------drill1--------|-from-|-lock-|
^
drill1 always manned
AirTime = 10min
WalkSpeed = 1 m/s
drill[0] = 180m // 6min to/from travel
drill[1] = 150m // 5min
drill[2] = 120m // 4min
drill[3] = 240m // 8min
TravelTime[0] = 6min
...
MaxWorkTime[0] = AirTime - TravelTime[0] = 4min
...
// WorkersPerDrill = AirTime/MaxWorkTime
WorkersPerDrill[0] >= 2.5 // These numbers are over 1 airtime (10m)
WorkersPerDrill[1] >= 2
WorkersPerDrill[2] >= 1.67
WorkersPerDrill[3] >= 5
TotalWorkersPerAirtime = sum(WorkersPerDrill) = 11.17
AirlockTime = 20s
AirlockPerWorker = 40s
TotalAirlockUsage = TotalWorkersPerAirtime*AirlockPerWorker = 7.4 min of airlock time
74% usage of airlock if no one uses it at the same time
这是问题的第一部分。一旦发生冲突,钻[1]工人和钻[3]工人同时回来,就有可能一个人没空气了。这是我试图解决的问题。感谢您忍受这个冗长的问题!
答案 0 :(得分:0)
这甚至不是编程问题。更像是数学。
要让单个钻头始终保持运转,您需要每10分钟至少花费20 + 20秒。这是一个人回去和一个人出来。
您可以更频繁地更改班次,但效率始终较低。
因此,每10分钟需要40秒的门时间进行演习。
然后您可以级联每个演习的班次更改,以便它们不会重叠,如下图所示:
<- 10 mins ->
drill-1 x--------------x--------------x--------------x
drill-2 -x--------------x--------------x--------------
drill-3 --x--------------x--------------x-------------
...
drill-15 --------------x--------------x--------------x-
图中的每个字符宽度为40秒,x
表示班次变化。
编辑:让我猜测细节并回答问题,以防每个站点在基地之间有不同的步行时间。
在这种情况下,我只是将图表中的x
标记分成两半>
,<
,分别对应一个人外出和分别。此外,w
代表每次演习的固定往返时间。
我们所说的钻头也很清楚,总是先选择最近的钻头。
图表变为(不按比例):
drill-1 >w<-------------->w<-------------->w<-------------->w<
drill-2 ->ww<------------->ww<------------->ww<------------->w
drill-3 -->ww<------------->ww<------------->ww<------------->
drill-3 --->www<------------>www<------------>www<------------
...
约束条件是>
或<
标记不能重叠。
但是,您可以在单个10分钟切片中考虑分配。 由于图表的重复周期始终为10分钟。
为什么呢?因为如果任何钻图的重复周期超过10分钟,一些宇航员就会死亡。 如果任何一次演习的重复时间不到10分钟,你可以让宇航员去观光,以便将时间延长到10级。也就是说,如果你没有更好的分配时间。
此时你可能会写一个蛮力试图在那段有限的时间内分配这些标记。
EDIT2:我认为我的理由可能存在一个缺陷,为什么仅仅10分钟的时间就足够了。