Skip to content
Gyunseo's Blog
Go back

Brute Force Job Assignment Problem

Suggest Changes

Table of contents

Open Table of contents

들어가며

python 코드

import time, unittest
from itertools import permutations
import math


def get_min_cost(job_table):
    # 경우의 수는 10!
    jobs_size = len(job_table)
    min_cost = math.inf
    min_queuing_order_for_jobs = None
    # 사람 10 명 중 10 명을 뽑아서, job에 할당한다.
    # job은 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 순으로 흩뜨려져 있다.
    for queuing_order_for_jobs in permutations(range(10), 10):
        tmp_cost = 0
        for i in range(jobs_size):
            tmp_cost += job_table[i][queuing_order_for_jobs[i]]
        if tmp_cost < min_cost:
            # min_cost update
            min_cost = tmp_cost
            min_queuing_order_for_jobs = queuing_order_for_jobs
    return min_cost, min_queuing_order_for_jobs


class JobAssignmentTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        # 행 job0, job1, job2, job3, job4, job5, job6, job7, job8, job9
        # 열 worker0, worker1, worker2, worker3, worker4, worker5, worker6, worker7, worker8, worker9
        cls.job_table = [
            [13, 6, 7, 12, 14, 15, 10, 11, 15, 4],
            [8, 14, 11, 9, 6, 14, 7, 9, 16, 12],
            [10, 8, 10, 10, 8, 15, 11, 5, 7, 9],
            [13, 13, 16, 9, 13, 16, 15, 9, 14, 16],
            [11, 4, 9, 14, 12, 11, 5, 16, 8, 14],
            [7, 10, 12, 13, 4, 11, 16, 12, 15, 9],
            [6, 11, 10, 11, 13, 15, 7, 16, 11, 12],
            [7, 15, 5, 10, 4, 16, 12, 4, 10, 16],
            [5, 14, 10, 15, 8, 8, 8, 14, 14, 4],
            [8, 11, 4, 16, 8, 12, 4, 14, 9, 6],
        ]

    print("Brute Force Job Assignment 테스트 시작")

    @classmethod
    def tearDownClass(cls) -> None:
        print("\nBrute Force Job Assignment 테스트 종료\n")
        print(f"job을 모두 수행하는 데에 드는 min cost: {get_min_cost(cls.job_table)[0]}")
        print(f"jobs에 대하여 worker들을 배치한 순서: {get_min_cost(cls.job_table)[1]}")

    def setUp(self) -> None:
        self.start_time = time.time()

    def tearDown(self) -> None:
        self.end_time = time.time()
        print(
            f"\nget_min_cost 함수 소요 시간: {self.test_function_end_time - self.test_function_start_time:4f}s"
        )
        print(f"테스트 자체의 소요 시간: {self.end_time - self.start_time:4f}s")

    def test_tsp(self):
        self.test_function_start_time = time.time()
        res = get_min_cost(JobAssignmentTest.job_table)
        self.test_function_end_time = time.time()
        self.assertEqual(res, (57, (9, 6, 8, 3, 1, 4, 0, 7, 5, 2)))


if __name__ == "__main__":
    unittest.main(verbosity=2)

How to Run

python version: 3.11.6

Run main.py

pip install pipenv
pipenv --python 3.11.6
pipenv run python3 main.py

Input

job_table = [
            [13, 6, 7, 12, 14, 15, 10, 11, 15, 4],
            [8, 14, 11, 9, 6, 14, 7, 9, 16, 12],
            [10, 8, 10, 10, 8, 15, 11, 5, 7, 9],
            [13, 13, 16, 9, 13, 16, 15, 9, 14, 16],
            [11, 4, 9, 14, 12, 11, 5, 16, 8, 14],
            [7, 10, 12, 13, 4, 11, 16, 12, 15, 9],
            [6, 11, 10, 11, 13, 15, 7, 16, 11, 12],
            [7, 15, 5, 10, 4, 16, 12, 4, 10, 16],
            [5, 14, 10, 15, 8, 8, 8, 14, 14, 4],
            [8, 11, 4, 16, 8, 12, 4, 14, 9, 6],
        ]

Output

Loading .env environment variables...
Brute Force Job Assignment 테스트 시작
test_tsp (__main__.JobAssignmentTest.test_tsp) ...
get_min_cost 함수 소요 시간: 2.709299s
테스트 자체의 소요 시간: 2.709383s
ok

Brute Force Job Assignment 테스트 종료

job을 모두 수행하는 데에 드는 min cost: 57
jobs에 대하여 worker들을 배치한 순서: (9, 6, 8, 3, 1, 4, 0, 7, 5, 2)

----------------------------------------------------------------------
Ran 1 test in 6.917s

OK

Execution Image


Suggest Changes
Share this post on:

Previous Post
Cloest Pair Algorithm
Next Post
Brute Force Knapsack Problem