Страницы: 1
RSS
Создание чек-листа с учетом времени выполнения задач и количества сотрудников
 
Сижу неделю думаю над решением, но никак не приходит решение в голову.
Наверное, тупо не хватает знаний.

Концептуально,
В общем, есть список из 20 операций для сотрудников.
Наступает новый день, я выбираю из 20 операций необходимые на сегодня 13 штук.
Далее исходя из указанных исполнителей 2 или 3 эти задачи должны перераспределиться таким образом, чтобы были максимально равными по времени.

Как реализовать не через Access?  
 
maxikartik, интересная задача на комбинаторику
Подготовил данные для модели «Поиск решения», но настроить не смог
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Домыслив итоговый результат, хотел бы всё же уточнить, что должно быть на выходе? Ибо
Цитата
: задачи должны перераспределиться
не совсем точно (для меня) описывает желаемое. Т.к. они, вроде, и не были распределены )

Я правильно понимаю, что на выходе:
  • Сотрудник 1 и перечень его задач
  • Сотрудник 2 и перечень его задач
При этом два условия:
1. Суммы времени выполнения задач максимально равны
2. Задачи не совпадают (это я додумал). Ибо если совпадают - делим время задач на количество трудящихся и закрываем вопрос.

Верно ?
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Сергей Евдокимов, задача сводится к Как разделить X задач по N группам, чтобы суммарное время задач каждой группы было максимально близко к среднему арифметическому X/N
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Как разделить X задач по N группам, чтобы суммарное время задач каждой группы было максимально близко к среднему арифметическому X/N
Jack Famous идеально описал...)


Цитата
написал:
Как разделить X задач по N группам, чтобы суммарное время задач каждой группы было максимально близко к среднему арифметическому X/N

Пытался сделать в итоге через обычные формулы, но не получилось. Направьте на путь истинный  
 
Направьте на путь истинный
Спасибо
 
maxikartik, если хотите готовое быстрое и удобное решение за деньги (ссылка от R Dmitry ведёт в платную ветку), то рекомендую MCH — это лучший специалист по комбинаторике, которого я знаю
Попробуйте написать сначала ему - если он возьмётся, то лучше вряд ли кто-то сделает  ;)
Изменено: Jack Famous - 09.11.2021 13:44:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Направьте на путь истинный
Видимо сами предоставляете услуги. Обращаюсь к разработчикам куда по более сложным, как я думаю, задачам. Чужой хлеб не забираю. Но когда есть время и желание "покопать" предпочту сам поискать. Но в данном случае нужен волшебный пинок. ))
Думал о "поиске решений", но не то. Формулами уперся в зацикливание, когда две ячейки с друг другом пересекаются.
В Макросах - надо подсказку, какая команда ключевая должна быть. Далее буду пытаться сам дорешать.

Придет время и будет критично, пойду покупать решение. Тут все ж на энтузиазме хочу разобраться и сделать импруволку для своей же работы.
Однако, спасибо)

Цитата
написал:
MCH  — это лучший специалист по комбинаторике, которого я знаю
Спасибо! Буду иметь ввиду. Попробую добить сам решение, не получится, обязательно обращусь. )

PS: Извините за неграмотные запросы, не частый гость на форумах)
 
Цитата
maxikartik: Видимо сами предоставляете услуги
в точку — это основной исполнитель из платной ветки  :D

Цитата
maxikartik: предпочту сам поискать
от того же MCHколлекция макросов для комбинаторики, но будет непросто  ;)
Теория: [1] и [2] + Мой генератор фраз
Изменено: Jack Famous - 09.11.2021 14:31:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
maxikartik : Формулами уперся в зацикливание
включение итеративных вычислений не помогает ?
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Раньше баловался таким... Сейчас - без достаточного ознакомления с инструментом использовать его не советую.
Основное назначение итеративных вычислений - расчеты с нужной точностью. При неумелом использовании (есть подводные камни) можно нажить проблемы.
Изменено: vikttur - 09.11.2021 14:32:59
 
В рамках "наставить на путь".
Выводит результат в виде одной таблицы в отдельную книгу с указанием индекса сотрудника в третьем столбце.
Код
Option Explicit

Sub Main()
    Dim rSource As Range
    Set rSource = Range("A2:C8")

    Dim arrTasks As Variant
    arrTasks = GetArrTasks(Range("A2:C8"))
    
    If Not IsEmpty(arrTasks) Then
        Dim nSotrudnikov As Long
        nSotrudnikov = Range("C12").Value
        
        Dim orr As Variant
        orr = DistribTasks(arrTasks, nSotrudnikov)
        
        OutPutArr orr, rSource
    End If
End Sub

Sub OutPutArr(arr As Variant, rSource As Range)
    With Workbooks.Add(1)
        With .Sheets(1).Cells(1, 1).Resize(UBound(arr, 1), UBound(arr, 2))
            rSource.Range("A1:B1").Copy .Columns("A:B")
            .Cells = arr
        End With
        .Saved = True
    End With
End Sub

Function DistribTasks(arrTasks As Variant, nSotrudnikov As Long) As Variant
    Dim nTasks As Long
    nTasks = UBound(arrTasks, 1)
    
    Dim brr As Variant
    ReDim brr(1 To nTasks)
    
    Dim i As Long
    Dim j As Long
    Dim x As Long
    Dim s As String
    Dim optS As String
    
    Dim avg As Double
    Dim locAvg As Double
    Dim optAvg As Double
    For j = 1 To nTasks
        avg = avg + arrTasks(j, 2) / nSotrudnikov
    Next
    optAvg = 6 * avg
    
    For i = 0 To nTasks ^ nSotrudnikov - 1
        s = Right(String(nTasks, "0") & СистемаСчисления(CStr(i), 10, CStr(nSotrudnikov)), nTasks)
        For j = 1 To nTasks
            x = Mid(s, Len(s) - (j - 1), 1) + 1
            brr(x) = brr(x) + arrTasks(j, 2)
        Next
        
        locAvg = 0
        For j = 1 To nTasks
            locAvg = locAvg + Abs(brr(j) - avg)
        Next
        If optAvg > locAvg Then
            optAvg = locAvg
            
            optS = s
        End If
        
        For j = 1 To nTasks
            brr(j) = 0
        Next
    Next
    '---------------------------------------
    ReDim brr(1 To nTasks, 1 To 3)
    s = optS
    For j = 1 To nTasks
        x = Mid(s, Len(s) - (j - 1), 1) + 1
        brr(j, 1) = arrTasks(j, 1)
        brr(j, 2) = arrTasks(j, 2)
        brr(j, 3) = x
    Next
    
    DistribTasks = brr
End Function

Function GetArrTasks(r As Range) As Variant
    Dim arr As Variant
    arr = r
    Dim n As Long
    Dim y As Long
    For y = 1 To UBound(arr, 1)
        If arr(y, 3) = "ДА" Then n = n + 1
    Next
    If n > 0 Then
        Dim brr As Variant
        ReDim brr(1 To n, 1 To 2)
        n = 0
        For y = 1 To UBound(arr, 1)
            If arr(y, 3) = "ДА" Then
                n = n + 1
                brr(n, 1) = arr(y, 1)
                brr(n, 2) = arr(y, 2)
            End If
        Next
        GetArrTasks = brr
    End If
End Function

Function СистемаСчисления(Число As String, Optional СистемаИз As Byte = 10, Optional СистемаВ As Byte = 10)
    Dim d As Double
    Dim i As Integer
    Dim s As String
    Dim c As Variant
    Dim z As Long
    Dim k As Byte
     
    c = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
     
    If Число = "0" Then
       СистемаСчисления = "0"
    Else
        'преобразование цифры в число
        d = 0
        For i = 1 To Len(Число)
            s = Mid(UCase(Число), i, 1)
             
            k = 0
            Do
                If s = c(k) Then
                    d = d + k * СистемаИз ^ (Len(Число) - i)
                    Exit Do
                End If
                k = k + 1
                If k > UBound(c) Then Exit Do
            Loop
        Next
         
        'преобразование числа в цифру
        s = ""
        For i = Val(Log(d) / Log(СистемаВ)) To 0 Step -1
            z = СистемаВ ^ i
            k = Int(d / z)
             
            s = s & c(k)
            d = d - k * z
        Next
         
        СистемаСчисления = s
    End If
End Function
Страницы: 1
Наверх