月球基地气闸的资源分配算法

时间:2014-07-03 00:01:18

标签: algorithm

我试图在资源分配问题上找到算法或问题名称,就像这样。

月球基地有一个气闸,一次只能有一个人使用,要么进入要么退出,需要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]工人同时回来,就有可能一个人没空气了。这是我试图解决的问题。感谢您忍受这个冗长的问题!

1 个答案:

答案 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表示班次变化。

然后将溶液分成40分钟= 15秒= 15分钟


编辑:让我猜测细节并回答问题,以防每个站点在基地之间有不同的步行时间。

在这种情况下,我只是将图表中的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分钟的时间就足够了。