алгоритм для расписания для четырехбригадной системы - PullRequest
0 голосов
/ 28 января 2019

Мне нужно запрограммировать сменный график на три смены в четырехбригадной системе.Каждая смена длится восемь часов.Начало первой смены в 6 часов утра.Начало второй смены в 2 часа дня.Начало третьей смены в 10 вечера.Каждый цикл состоит из четырех дней и 48-часового перерыва.

В таблице ниже показано, как составить график на январь 20019 года.

enter image description here

"W "означает выходной.

Я написал бы функцию, которая получает дату аргумента и номер смены и возвращает, какая бригада имеет смену.

Например:

getBrigadeNumber('2019-01-27',1); // should return 'III' for schedule above 

Я совершенно не представляю, как он пишет.

Я напишу это на VBA, но я также знаю php,

Буду благодарен за любые советы.

Ответы [ 4 ]

0 голосов
/ 31 января 2019

@ Десси Стоева, ты гений.Теперь мой код выглядит так:

 Public Property Get getCurrentBrigade() As Byte
    Dim days As Integer
    Dim DateOfStartSchedule As Date

    DateOfStartSchedule = #1/1/2019#
    Dim i As Integer

    days = Abs(DateDiff("d", CurrentDayOfShift, DateOfStartSchedule))
    i = (days Mod 16)

    If scheduleAtTheJanuary(1, i) = CurrentShift Then
    getCurrentBrigade = 1
    ElseIf scheduleAtTheJanuary(2, i) = CurrentShift Then
    getCurrentBrigade = 2
    ElseIf scheduleAtTheJanuary(3, i) = CurrentShift Then
    getCurrentBrigade = 3
    Else
    getCurrentBrigade = 4
    End If
End Property

У кого-нибудь есть идеи, как я могу улучшить этот код?

0 голосов
/ 28 января 2019

Вы можете сделать это без VBA, используя функцию листа MATCH():

Представьте, что ваш месяц January находится в строке 1. Вы можете использовать функцию MATCH(), чтобы найти столбец, в котором выиметь 27 января:

=MATCH(1;AB$2:AB$5;0)

Что означает:

Найти значение 1 в столбце 'AB' внутри четырех строк (от 2 до 5), используя точное совпадение.
Столбец 'AB' можно найти как =OFFSET(A1;0;27).

0 голосов
/ 29 января 2019

На первый взгляд проблема кажется сложной - алгоритм для трехсменного расписания, но когда вы понимаете, что сдвиги представляют собой некоторые закономерности и эти закономерности не меняются во времени, проблема начинает выглядеть очень легко.

Идея "Сохраняет первый месяц в массиве, и когда мне понадобится определенный день. Я могу посчитать его за циклы" решит проблему.Я хочу добавить, что не обязательно использовать циклы .Шаблон смены повторяется каждые 16 дней - значения для 11 и 27 января одинаковы.

Для определенного дня d вы можете рассчитать сдвиг для каждой бригады, используя следующий псевдокод:

D = The distance between a particular day d and January 1st in days.
A = Schedule for January 2019. A zero indexed array with 4 rows and 31 columns.

S1=A[1][D mod 16] will be the calculated shift number for brigade 1 at day d.
S2=A[2][D mod 16] will be the calculated shift number for brigade 2 at day d.
            ...
S4=A[4][D mod 16] will be the calculated shift number for brigade 4 at day d.

Знание S1, S2, S3 и S4 достаточно, чтобы getBrigadeNumber вернул правильное значение.

0 голосов
/ 28 января 2019

В настоящее время я работаю в другой части приложения, но в настоящее время я все еще думаю о проблеме выше.Я определенно не хочу бесплатный код.Мне нужны только советы и советы.У меня есть две идеи, как я могу написать это, но, на мой взгляд, они не оптимальны.

Первая идея:

Создайте лист, заполненный данными за следующие 10 лет.Тогда все, что вам нужно, это просто прочитать соответствующую ячейку.

Вторая идея:

Сохраняет первый месяц в массиве И когда мне понадобится конкретный день.Я могу посчитать это для циклов.

Но, возможно, существуют другие решения этой проблемы.Может быть, кто-нибудь знает какой-либо алгоритм для этой проблемы

...