Home » Task Assignment Load Balancing

Task Assignment Load Balancing

There are 4 persons who can be a candidate to do a task. Assign a single person to every task while balancing the load. In the problem, there are 9 tasks and 4 persons. Hence, 1 person can be assigned 3 tasks and remaining 3 need to be assigned 2 tasks each. If there are 12 tasks, then all need to be assigned 3 tasks each. The answer given in illustrative and your answer may be different from mine.

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 465
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Task Assignment Load Balancing with Excel

Excel solution 1 for Task Assignment Load Balancing, proposed by Bo Rydobon 🇹🇭:
=LET(
    p,
    B2:E10,
    u,
    UNIQUE(
        TOCOL(
            p,
            3
        )
    ),
    t,
    REDUCE(
        "",
        SEQUENCE(
            ,
            ROWS(
                p
            )
        ),
        LAMBDA(
            a,
            i,
            TOCOL(
                a&TOROW(
                    INDEX(
                        p,
                        i,
                        
                    ),
                    3
                )
            )
        )
    ),
    d,
    MAP(
        t,
        LAMBDA(
            x,
            STDEV(
                LEN(
                    SUBSTITUTE(
                        x,
                        u,
                        
                    )
                )
            )
        )
    ),
    FILTER(
        t,
        d=MIN(
            d
        )
    )
)
Excel solution 2 for Task Assignment Load Balancing, proposed by Bo Rydobon 🇹🇭:
=share&utm_medium=member_desktop

That is an annoying bug. 

=MAP(
    SEQUENCE(
        9
    ),
    LAMBDA(
        i,
        LET(
            ZZ,
            INDEX(
                1,
                {1}
            ),
            i
        )
    )
)
=MAP(
    SEQUENCE(
        9
    ),
    LAMBDA(
        i,
        LET(
            ZZ,
            N(
                +A2:A3
            ),
            i
        )
    )
)
=MAP(
    SEQUENCE(
        9
    ),
    LAMBDA(
        i,
        LET(
            ZZ,
            N(
                {1}
            ),
            i
        )
    )
)
=MAP(
    SEQUENCE(
        9
    ),
    LAMBDA(
        i,
        LET(
            ZZ,
            TEXTSPLIT(
                {"a"},
                1
            ),
            i
        )
    )
)
=MAP(
    SEQUENCE(
        9
    ),
    LAMBDA(
        i,
        LET(
            ZZ,
            SEQUENCE(
                {"1"}
            ),
            i
        )
    )
)
=MAP(
    SEQUENCE(
        9
    ),
    LAMBDA(
        i,
        LET(
            ZZ,
            EDATE(
                +A2:A3,
                1
            ),
            i
        )
    )
)
=MAP(
    SEQUENCE(
        9
    ),
    LAMBDA(
        i,
        LET(
            ZZ,
            EOMONTH(
                +A2:A3,
                1
            ),
            i
        )
    )
)

The ZZ variable has nothing to do with i at all but causes MAP to return 1 cell 

ZZ can be anything that causes array-in-array?? (I'm not sure what to call this) conflict. 


Quick fixed for now is IFS

=LET(
    s,
    SEQUENCE(
        ,
        4
    ),
    m,
    MID(
        REDUCE(
            ,
            s,
            LAMBDA(
                a,
                v,
                IFS(
                    1,
                    TOCOL(
                        REPLACE(
                            a,
                            SEQUENCE(
                                ,
                                v
                            ),
                            ,
                            v
                        )
                    )
                )
            )
        ),
        s,
        1
    ),
    m
)
Excel solution 3 for Task Assignment Load Balancing, proposed by Bo Rydobon 🇹🇭:
=LET(a,A2:E10,v,SORT(UNIQUE(TOCOL(DROP(a,,1),3))),s,SEQUENCE(ROWS(v)),b,SORTBY(a,BYROW(a,LAMBDA(x,IFS(1,SUM((x>0)*100,COUNTIF(a,x)))))),
d,REDUCE(IF(s,{0,""}),SEQUENCE(ROWS(a)),LAMBDA(x,i,LET(d,VSTACK(v,TOCOL(DROP(b,i-1,1),3)),u,GROUPBY(d,d,ROWS,,0),
c,TAKE(x,,1),y,s=XMATCH(0,c*100+IFS(ISNUMBER(XMATCH(v,INDEX(b,i,0))),DROP(u,,1)),1),IF(y,HSTACK(c+y,DROP(x,,1)&" "&INDEX(b,i,1)),x)))),
VSTACK({"Task ID","Person"},DROP(SORT(REDUCE(0,s,LAMBDA(a,i,VSTACK(a,IF({1,0},--TEXTSPLIT(INDEX(d,i,2),," ",1),INDEX(v,i)))))),1)))


Priority by task of fewer people is the same as previous method
 4 1 2 3 5 6 8 9 7 

Priority by person of fewer tasks based on count of task left after
instead of a fixed count   A D C B => 4 4 5 6

Step 1 for task 4 
A B C D  => 4 6 5 4 
only  B possible =>B

Step 2 for Task 1 
count  A B C D  without task 4 
A B C D  => 4 5 5 4 
c*100+IFS(ISNUMBER(XMATCH(v,INDEX(b,i,0))),DROP(u,,1))
Excel solution 4 for Task Assignment Load Balancing, proposed by Bo Rydobon 🇹🇭:
=LET(a,
    A2:E10,
    v,
    UNIQUE(
        TOCOL(
            DROP(
                a,
                ,
                1
            ),
            3
        )
    ),
    u,
    SORTBY(
        v,
        COUNTIF(
            a,
            v
        )
    ),
    s,
    SEQUENCE(
        ROWS(
            u
        )
    ),
    b,
    SORTBY(a,
    BYROW(a,
    LAMBDA(x,
    SUM(--(x>0))))),
    
d,
    REDUCE(
        IF(
            s,
            {0,
            ""}
        ),
        SEQUENCE(
            ROWS(
                a
            )
        ),
        LAMBDA(
            x,
            i,
            LET(
                c,
                TAKE(
                    x,
                    ,
                    1
                ),
                y,
                s=XMATCH(
                    0,
                    IFS(
                        ISNUMBER(
                            XMATCH(
                                u,
                                INDEX(
                                    b,
                                    i,
                                    0
                                )
                            )
                        ),
                        c
                    ),
                    1
                ),
                IF(
                    y,
                    HSTACK(
                        c+y,
                        DROP(
                    x,
                    ,
                    1
                )&" "&INDEX(
                    b,
                    i,
                    1
                )
                    ),
                    x
                )
            )
        )
    ),
    
VSTACK(
    G1:H1,
    DROP(
        SORT(
            REDUCE(
                0,
                s,
                LAMBDA(
                    a,
                    i,
                    VSTACK(
                        a,
                        IF(
                            {1,
                            0},
                            --TEXTSPLIT(
                                INDEX(
                                    d,
                                    i,
                                    2
                                ),
                                ,
                                " ",
                                1
                            ),
                            INDEX(
                                u,
                                i
                            )
                        )
                    )
                )
            )
        ),
        1
    )
))

u,
    SORTBY(
        v,
        COUNTIF(
            a,
            v
        )
    )
Give priority to Person with fewer tasks first.
A,
     D with  4 tasks    then  C with 5 tasks   then  B with  6 tasks

b,
    SORTBY(a,
    BYROW(a,
    LAMBDA(x,
    SUM(--(x>0)))))
Give priority to Taks with fewer Persons first.
Task 4 with 1 persons assign first 
Task 7 with 4 persons assign last

y,
    s=XMATCH(
                    0,
                    IFS(
                        ISNUMBER(
                            XMATCH(
                                u,
                                INDEX(
                                    b,
                                    i,
                                    0
                                )
                            )
                        ),
                        c
                    ),
                    1
                )
Excel solution 5 for Task Assignment Load Balancing, proposed by John V.:
=LET(s,
    SORTBY,
    r,
    B2:E10,
    x,
    ROWS(
        r
    ),
    y,
    COLUMNS(
        r
    ),
    n,
    BYCOL(
        N(
            r>0
        ),
        SUM
    ),
    c,
    s(
        HSTACK(
            A2:A10,
            s(
                r&"",
                n
            )
        ),
        BYROW(
        N(
            r>0
        ),
        SUM
    )
    ),
    t,
    TAKE(
        c,
        ,
        1
    ),
    b,
    DROP(
        c,
        ,
        1
    ),
    z,
    s(
        LEFT(
            BYCOL(
                r,
                CONCAT
            )
        ),
        -n
    ),
    SORT(HSTACK(t,
    DROP(REDUCE("",
    SEQUENCE(
        x
    ),
    LAMBDA(a,
    v,
    LET(i,
    INDEX(
        b,
        v,
        
    ),
    f,
    FILTER(
        i,
        i>""
    ),
    VSTACK(a,
    XLOOKUP(1,
    N(XLOOKUP(f,
    z,
    1+INT(
        x/y
    )-(SEQUENCE(
        ,
        y
    )>MOD(
        x,
        y
    ))-BYCOL(
        N(
            a=z
        ),
        SUM
    ))>0),
    f))))),
    1))))
Excel solution 6 for Task Assignment Load Balancing, proposed by محمد حلمي:
=REDUCE(
    C2,
    A2:A10,
    LAMBDA(
        a,
        v,
        LET(
            
            b,
            B2:E10,
            c,
            CONCAT(
                b
            ),
            
            e,
            --TEXTSPLIT(
                CONCAT(
                    0&IF(
                        b>0,
                        A2:A10,
                        
                    )
                ),
                ,
                0,
                1
            ),
            
            i,
            FILTER(
                MID(
                    c,
                    SEQUENCE(
                        LEN(
                            c
                        )
                    ),
                    1
                ),
                v=e
            ),
            
            u,
            XLOOKUP(
                i,
                a,
                a,
                1
            ),
            VSTACK(
                a,
                IFNA(
                    XLOOKUP(
                        1,
                        u,
                        i
                    ),
                    @u
                )
            )
        )
    )
)


///


=LET(b,
    B2:E10,
    v,
    TOCOL(
                b
            ),
    IF(b=0,
    "",
    
WRAPROWS(MAP(SEQUENCE(
    ROWS(
        v
    )
),
    LAMBDA(a,
    
SUM(--(TAKE(
    v,
    a
)=INDEX(
    v,
    a
))))),
    4)))
Excel solution 7 for Task Assignment Load Balancing, proposed by Julian Poeltl:
=LET(P,
    B2:E10,
    T,
    ROWS(
        P
    ),
    UP,
    UNIQUE(
        TOCOL(
            P,
            3
        )
    ),
    CUP,
    COUNTA(
        UP
    ),
    LL,
    ROUNDDOWN(
        T/CUP,
        0
    ),
    M,
    BYROW(
        L_MixLargeArraysColumnsbyColumntogehter_AllPossibilities_INT(
            TRANSPOSE(
        P
    )
        ),
        LAMBDA(
            A,
            CONCAT(
                A
            )
        )
    ),
    R,
    MAP(M,
    LAMBDA(A,
    (MIN(
        T-LEN(
            SUBSTITUTE(
                A,
                UP,
                ""
            )
        )
    )=LL)*(MAX(
        T-LEN(
            SUBSTITUTE(
                A,
                UP,
                ""
            )
        )
    )=(LL+1)))),
    C,
    CONCAT(
        FILTER(
            M,
            R
        )
    ),
    WRAPCOLS(
        MID(
            C,
            SEQUENCE(
                LEN(
                    C
                )
            ),
            1
        ),
        T
    ))

L_MixLargeArraysColumnsbyColumntogehter_AllPossibilities_INT:
=LAMBDA(
    Array1,
    [Array2],
    LET(
        z,
        IF(
            ISOMITTED(
                Array2
            ),
            Array1,
            HSTACK(
                Array1,
                Array2
            )
        ),
        D,
        "|",
        c,
        SEQUENCE(
            ,
            COLUMNS(
                z
            )
        ),
        re,
        REDUCE(
            "",
            c,
            LAMBDA(
                A,
                n,
                UNIQUE(
                    TOCOL(
                        A&D&TOROW(
                            INDEX(
                                z,
                                ,
                                n
                            ),
                            3
                        )
                    )
                )
            )
        ),
        TEXTBEFORE(
            TEXTAFTER(
                re,
                D,
                c
            ),
            D,
            ,
            ,
            1
        )
    )
)
Excel solution 8 for Task Assignment Load Balancing, proposed by Julian Poeltl:
=LET(P,
    B2:E10,
    T,
    ROWS(
        P
    ),
    UP,
    UNIQUE(
        TOCOL(
            P,
            3
        )
    ),
    CUP,
    COUNTA(
        UP
    ),
    LL,
    ROUNDDOWN(
        T/CUP,
        0
    ),
    M,
    BYROW(
        L_MixLargeArraysColumnsbyColumntogehter_AllPossibilities_INT(
            TRANSPOSE(
        P
    )
        ),
        LAMBDA(
            A,
            CONCAT(
                A
            )
        )
    ),
    R,
    MAP(M,
    LAMBDA(A,
    (MIN(
        T-LEN(
            SUBSTITUTE(
                A,
                UP,
                ""
            )
        )
    )=LL)*(MAX(
        T-LEN(
            SUBSTITUTE(
                A,
                UP,
                ""
            )
        )
    )=(LL+1)))),
    C,
    CONCAT(
        FILTER(
            M,
            R
        )
    ),
    TAKE(
        WRAPCOLS(
            MID(
                C,
                SEQUENCE(
                    LEN(
                        C
                    )
                ),
                1
            ),
            T
        ),
        ,
        1
    ))

L_MixLargeArraysColumnsbyColumntogehter_AllPossibilities_INT:
=LAMBDA(
    Array1,
    [Array2],
    LET(
        z,
        IF(
            ISOMITTED(
                Array2
            ),
            Array1,
            HSTACK(
                Array1,
                Array2
            )
        ),
        D,
        "|",
        c,
        SEQUENCE(
            ,
            COLUMNS(
                z
            )
        ),
        re,
        REDUCE(
            "",
            c,
            LAMBDA(
                A,
                n,
                UNIQUE(
                    TOCOL(
                        A&D&TOROW(
                            INDEX(
                                z,
                                ,
                                n
                            ),
                            3
                        )
                    )
                )
            )
        ),
        TEXTBEFORE(
            TEXTAFTER(
                re,
                D,
                c
            ),
            D,
            ,
            ,
            1
        )
    )
)
Excel solution 9 for Task Assignment Load Balancing, proposed by Timothée BLIOT:
=LET(A,
    A2:A10,
    B,
    B2:E10,
    F,
    LAMBDA(
        n,
        n&FILTER(
            INDEX(
                B,
                n,
                
            ),
            INDEX(
                B,
                n,
                
            )<>0
        )
    ),
    C,
    REDUCE(
        TOCOL(
            F(
                1
            )
        ),
        DROP(
            A,
            1
        ),
        LAMBDA(
            w,
            v,
            TOCOL(
                w&F(
                    v
                )
            )
        )
    ),
    D,
    FILTER(C,
    MAP(C,
    LAMBDA(x,
    PRODUCT(--(SORT(
        LEN(
            x
        )-LEN(
            SUBSTITUTE(
                x,
                {"A";"B";"C";"D"},
                ""
            )
        )
    )={2;2;2;3}))))),
    WRAPROWS(MID(INDEX(D,
    (ROWS(
        D
    )*RAND())+1),
    SEQUENCE(
        18
    ),
    1),
    2))
Excel solution 10 for Task Assignment Load Balancing, proposed by Sunny Baggu:
=LET(
    
     t,
     A2:A10,
    
     rng,
     B2:E10,
    
     _a,
     SORT(
         UNIQUE(
             TOCOL(
                 rng,
                  1
             )
         )
     ),
    
     _b,
     MAP(
         _a,
          LAMBDA(
              x,
               SUM(
                   N(
&                       rng = x
                   )
               )
          )
     ),
    
     _c,
     TOROW(
         SORTBY(
             _a,
              _b,
              1
         )
     ),
    
     _d,
     {3,
     2,
     2,
     2},
    
     n,
     DROP(
         
          REDUCE(
              
               "",
              
               SEQUENCE(
                   4
               ),
              
               LAMBDA(
                   a,
                    v,
                   
                    VSTACK(
                        
                         a,
                        
                         LET(
                             
                              _e,
                              TOCOL(
                                  IF(
                                      rng = INDEX(
                                          _c,
                                           ,
                                           v
                                      ),
                                       t,
                                       x
                                  ),
                                   3
                              ),
                             
                              _f,
                              TAKE(
                                  FILTER(
                                      _e,
                                       ISNA(
                                           XMATCH(
                                               _e,
                                                a
                                           )
                                       )
                                  ),
                                   INDEX(
                                       _d,
                                        1,
                                        v
                                   )
                              ),
                             
                              _f
                              
                         )
                         
                    )
                    
               )
               
          ),
         
          1
          
     ),
    
     p,
     DROP(
         REDUCE(
             "",
              SEQUENCE(
                   4
               ),
              LAMBDA(
                  x,
                   y,
                   VSTACK(
                       x,
                        IF(
                            SEQUENCE(
                                INDEX(
                                    _d,
                                     1,
                                     y
                                )
                            ),
                             INDEX(
                                 _c,
                                  ,
                                  y
                             )
                        )
                   )
              )
         ),
          1
     ),
    
     SORT(
         HSTACK(
             n,
              p
         ),
          1
     )
    
)
Excel solution 11 for Task Assignment Load Balancing, proposed by LEONARD OCHEA 🇷🇴:
=LET(m,
    B2:E10,
    n,
    ROWS(
        m
    ),
    r,
    TOROW(
        REDUCE(
            "",
            n-SEQUENCE(
                n
            )+1,
            LAMBDA(
                a,
                b,
                TOROW(
                    IFERROR(
                        TOCOL(
                            INDEX(
                                m,
                                b,
                                
                            ),
                            3
                        ),
                        ""
                    )&""&TOROW(
                        a
                    )
                )
            )
        )
    ),
    t,
    MID(
        r,
        A2:A10,
        1
    ),
    s,
    BYCOL(t,
    LAMBDA(c,
    LET(f,
    GROUPBY(
        c,
        c,
        COUNTA,
        ,
        0
    ),
    (ROWS(
        f
    )=4)*AND(
        TAKE(
            f,
            ,
            -1
        )>1
    )))),
    FILTER(
        t,
        s
    ))
Excel solution 12 for Task Assignment Load Balancing, proposed by Tyler Cameron:
=HSTACK(A2:A10,
    DROP(REDUCE("",
    BYROW(
        B2:F10,
        LAMBDA(
            t,
            CONCAT(
                t
            )
        )
    ),
    LAMBDA(x,
    y,
    LET(a,
    TOROW(
        MID(
            y,
            SEQUENCE(
                LEN(
                    y
                )
            ),
            1
        )
    ),
    VSTACK(x,
    INDEX(SORTBY(a,
    TOROW(BYCOL(--(x=a),
    LAMBDA(
        v,
        SUM(
            v
        )
    )))),
    ,
    1))))),
    1))

Solving the challenge of Task Assignment Load Balancing with Python in Excel

Python in Excel solution 1 for Task Assignment Load Balancing, proposed by Owen Price:
Here's my Python in Excel solution:

&&

Leave a Reply