Code Different Machine Scheduling. Heuristic Algorithm

Em có một bài toán giải thuật tham lam quen thuộc như này ạ
Có n công việc, được phân công cho m máy khác nhau thực hiện đồng thời. Hãy viết chương trình dùng kỹ thuật THAM LAM để tìm một phương án phân công sao cho thời gian để các máy hoàn thành hết n công việc là ngắn nhất…
Input: m,n
m dòng tiếp theo, mỗi dòng chứa n số nguyên dương x0, x1, …, xn-1 Trong đó số xi ở dòng thứ j là thời gian cần thiết để máy thứ j hoàn thành công việc i.
Output:Xuất trên một dòng n số nguyên dương y0, y1, …,yn-1, giá trị mỗi số trong đoạn [0, m-1] trong đó giá trị của yi là số thứ tự của máy được phân công để thực hiện công việc i.
vd
8 3
79 1 80 59 75 51 7 29
49 71 44 55 22 61 31 88
59 28 9 19 18 60 54 68
=> 1 0 2 2 2 0 0 0

n, m = list(map(int,input().split()))
a = [[int(0) for i in range(m)] for j in range(n)]
for i in range(m):
    a[i] = list(map(int,input().split()))
for i in range(n):
     pos = 0
    for j in range(m):
        if a[j][i] <= a[pos][i]:
               pos = j
    print(pos, end = " ")

Em có 1 vài test case bị sai và em thử trường hợp 2 thời gian 2 máy giống nhau cũng không được ạ. Mọi người ai nhận ra lỗi sai giúp em với ạ. Em cảm ơn

Giả sử có 2 máy và có 3 công việc như sau:

10 50 10
20 20  5

Thì theo bạn nên chia như thế nào để tối ưu?

4 Likes

Theo mình thì lấy min mỗi cột , output ra 0 1 1 ( mình nghĩ ý người ra đề là tổng thời gian là nhỏ nhất)

Nếu lấy 0 1 1 thì trên máy 0 chạy 10, trên máy 1 chạy 20 + 5 = 25 => cả 2 máy chạy trong 25
Nếu lấy 0 1 0 thì trên máy 0 chạy 10+10=20, trên máy 1 chạy 20 => cả 2 máy chạy trong 20, sớm hơn 5 đơn vị.

4 Likes

Trong ví dụ này có mình thì nếu làm như ý tưởng của bạn kết quả phải là 1 2 2 2 2 0 0 0 chứ nhỉ
8 3
79 1 80 59 75 51 7 29
49 71 44 55 22 61 31 88
59 28 9 19 18 60 54 68

Bạn có thể giải thích step by step tại sao lại ra 1 2 2... không?

3 Likes

mình tính qua loa thôi nhưng nếu là 1 0 2 2 2 0 0 0 thì máy 1 làm tổng tg là 88 còn nếu thay cv2 bằng máy 2 thì máy 1 làm tổng là 87 vẫn lớn nhất và nhỏ hơn 88

cái ví dụ mình đưa ra là ví dụ chính xác á

Nếu bạn tính step by step như mình nói thì nó đã ra kết quả chính xác như đề bài rồi:

3 Likes

Mình hiểu ví dụ trên của bạn là tính theo mốc thời gian tức là sau khi 2 máy làm thì lấy máy có thời gian lâu hơn, nhưng cái ví dụ mẫu của mình nếu làm vậy sẽ không ra kết quả như vậy ấy. Mình đã chạy thử code của bạn nhưng vẫn không có đúng ấy

Như bạn thấy trong screenshot bên trên thì code của mình chạy ra kết quả 1 0 2..., nên bạn chạy code nào hoặc hiểu như nào mà không ra kết quả giống vậy thì tức là đã hiểu/code sai. Và trừ phi bạn chia sẻ cách hiểu của bạn step by step (mình nhấn mạnh 1 lần nữa), còn không thì rất khó để có thế biết bạn đang hiểu sai ở chỗ nào.

2 Likes

Mình đọc code của bạn, ý bạn là lấy chỉ số min mỗi cột đúng không?

Nếu bạn đang nói về cách giải x, thì đúng là vậy, nhưng mà đó là code lại theo cách của bạn trong bài post đầu tiên.
Còn cách giải y chính là cách giải của mình
Nếu nhìn kỹ bạn sẽ thấy 2 dòng print cho 2 cách giải khác nhau. Và nó ra kết quả khác nhau với ví dụ mình đưa bên trên:

2 Likes

vậy cho mình hỏi cách của bạn là tính mốc thời gian kết thúc sớm nhất đúng không ạ?

1 2 2 2 2 0 0 0
Tức là máy 0 chạy 87,máy 2 chạy 74,máy 1 chạy 49 => 3 máy chạy trong 87
1 0 2 2 2 0 0 0
Tức là máy 0 chạy 88,máy 2 chạy 46,máy 1 chạy 49 => 3 máy chạy trong 88
Nên TH1 nhanh hơn mà

Sau thời gian suy ngẫm rất lâu thì mình đã hiểu ra vấn đề là mình nên tối ưu theo từng cột cho m máy. Mình suy nghĩ một hướng đi khác thế nên không thể hiểu ý của bạn. Cảm ơn bạn nhiều vì đã giúp mình

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?