Thuật toán theo phương pháp Hungary để giải bài toán gán. Thuật toán Hungary hoặc cách toán học giúp phân bổ bài tập

Giai đoạn sơ bộ .

Bước 1. Tại tối đa hóa hàm mục tiêu VỚI tìm thấy phần tử tối đa và trừ đi từng phần tử của cột này từ mức tối đa. Tại cực tiểu hóa hàm mục tiêu(tổng các chỉ số hiệu quả theo đơn thuốc) trong mỗi cột của ma trận VỚI tìm phần tử nhỏ nhất và trừ nó khỏi mỗi phần tử của cột đó.

VỚI với các phần tử không âm. Trong mỗi cột của ma trận VỚI có ít nhất một số không.

Bước 2. Trong mỗi hàng của ma trận VỚI tìm phần tử nhỏ nhất và trừ nó khỏi mỗi phần tử của chuỗi này.

Kết quả là một ma trận được hình thành VỚI 0 với các phần tử không âm. Trong mỗi cột và mỗi hàng của ma trận VỚI 0 mỗi cái có ít nhất một số 0.

Bước 3. Đánh dấu bất kỳ số 0 nào trong cột đầu tiên bằng dấu hoa thị. Bắt đầu từ cột thứ hai, xem từng cột của ma trận VỚI 0 và đánh dấu bằng dấu hoa thị số 0 nằm trong dòng không có số 0 bằng dấu hoa thị. Chỉ có một số 0 có thể được đánh dấu bằng dấu hoa thị trong mỗi cột. Rõ ràng, các số 0 của ma trận VỚI 0 được đánh dấu bằng dấu hoa thị là độc lập theo cấu trúc. Điều này kết thúc giai đoạn sơ bộ.

( k + 1) thứ sự lặp lại . Hãy giả sử rằng k-lần lặp thứ đã được thực hiện và kết quả là thu được ma trận VỚI k . Nếu trong ma trận VỚI k chính xác là có P số 0 bằng dấu hoa thị thì quá trình giải kết thúc. Nếu số lượng số 0 có dấu hoa thị ít hơn P, sau đó chúng ta đi đến ( k+ 1) lần lặp thứ.

Mỗi lần lặp bắt đầu với giai đoạn đầu tiên và kết thúc ở giai đoạn thứ hai. Giữa chúng, một vài giai đoạn có thể được thực hiện nhiều lần: thứ ba - thứ nhất. Trước khi bắt đầu lặp lại, dấu “+” được sử dụng để đánh dấucột ma trậnVỚI k , chứa số 0 theo sau là dấu hoa thị.

Giai đoạn đầu . Xem không được chọn cột ma trận VỚI k. Nếu không có phần tử nào trong số chúng thì hãy chuyển đến giai đoạn thứ ba.

Nếu số 0 không được chọn của ma trận VỚI kđược phát hiện thì có thể xảy ra một trong hai trường hợp:

    dòng này không chứa số 0 có dấu hoa thị.

TRONG trường hợp đầu tiên Đánh dấu số 0 chưa được chọn bằng dấu gạch ngangchọn dòng , trong đó nó được chứa, bằng cách đặt dấu “+” ở bên phải của nó. Sau đó hủy dấu "+" bằng cách khoanh tròn nó qua đó cột , giao điểm của nó với dòng đã chọn này chứa số 0 có dấu hoa thị.

 Nếu như vậy số không được tìm thấy và nó là cái duy nhất trong cột, thì Đánh dấu của anh ấy đột quỵ chọn dòng (dòng) chứa (các) số 0 như vậy được đánh dấu bằng dấu “+”. Sau đó nhìn qua (các) dòng này, tìm số 0 có dấu hoa thị trong đó.

 Nếu như vậy số không được tìm thấy trong cột, nhưng nó không phải là cái duy nhất trong cột, thì từ những số 0 này bạn nên chọn:

    trước hết là số 0 như vậy, trong cùng một dòng không có 0*;

    thứ hai, một số 0 trong cùng một hàng có số 0*, nhưng trong cùng một cột có số 0* này có một số 0 không được chọn;

    cuối cùng, số 0 như vậy, trong cùng một hàng có số 0*, nhưng trong cùng một cột có số 0* này không có số 0 nào không được chọn;

Quá trình này, với số lượng hữu hạn các bước, kết thúc bằng một trong các kết quả sau:

Kết quả 1. Tất cả các số 0 của ma trận VỚI kđược đánh dấu, tức là nằm trong các hàng hoặc cột đã chọn. Trong trường hợp này đi đến giai đoạn thứ ba;

Xuất hành 2. Có một số 0 không được chọn trong một chuỗi trong đó không có số 0 nào có dấu hoa thị. Sau đó đi đến giai đoạn thứ hai, đánh dấu số 0 cuối cùng theo thứ tự bằng một nét .

TRONG trường hợp thứ hai , sau khi đánh dấu số 0 không được chọn bằng một nét, ngay lập tức chuyển sang giai đoạn thứ hai.

Giai đoạn thứ hai . Xây dựng chuỗi tiếp theo từ các phần tử ma trận VỚI k: số 0 đứng đầu có số nguyên tố, số 0 có dấu hoa thị nằm trong cùng cột với số đầu tiên, số 0 có số nguyên tố nằm trong cùng hàng với số 0 đứng trước có dấu hoa thị, v.v. chuỗi được hình thành bởi sự chuyển động từ 0" đến 0* theo cột, từ 0* đến 0" theo dòng vân vân.

Có thể chứng minh rằng thuật toán được mô tả để xây dựng chuỗi là rõ ràng và hữu hạn. trong đó chuỗi luôn bắt đầu và kết thúc số không với số nguyên tố . Tiếp theo, đặt dấu hoa thị phía trên các phần tử của chuỗi ở vị trí lẻ (0"), hủy chúng phía trên các phần tử chẵn (0*). Sau đó hủy tất cả các nét phía trên các phần tử của ma trận VỚI k và dấu “+”. Trong trường hợp này, số lượng số 0 độc lập sẽ tăng thêm một. (k + 1) lần lặp thứ 1 đã hoàn thành.

Giai đoạn thứ ba . Bạn nên chuyển sang giai đoạn này sau giai đoạn đầu tiên nếu như tất cả các số không của ma trận VỚI k nhấn mạnh, tức là chúng nằm trong các hàng hoặc cột đã chọn. Trong trường hợp này, trong số các phần tử không được chọn của ma trận VỚI k chọn phần tử tối thiểu và đánh dấu nó h > 0.

    trừ đi h của tất cả yếu tố ma trận VỚI k , nằm ở những dòng không được chọn , Và

    thêm vào h cho tất cả yếu tố ma trận VỚI k , nằm trong các cột chuyên dụng .

Kết quả là một ma trận mới tương đương với VỚI k .

Vì trong số các phần tử không được chọn của ma trận
các số 0 mới sẽ xuất hiện (theo định nghĩa), bạn nên chuyển sang giai đoạn đầu tiên và thay vì ma trận VỚI k nhìn vào ma trận
.

Đã hoàn thành giai đoạn đầu tiên hoặc đi đến giai đoạn thứ hai , nếu số 0 không được chọn nằm trong một chuỗi không chứa số 0 có dấu hoa thị, hoặc quay trở lại giai đoạn thứ ba một lần nữa , nếu là kết quả của giai đoạn đầu tiên tất cả các số 0 của ma trận
sẽ được làm nổi bật.

Trong trường hợp đầu tiên sau giai đoạn thứ hai lặp lại kết thúc.

Trong trường hợp thứ hai, sau giai đoạn thứ ba, thu được ma trận
~
~VỚI k. Trong ma trận
Các số 0 không được chọn sẽ xuất hiện và toàn bộ chuỗi thao tác, bắt đầu từ giai đoạn đầu tiên, phải được lặp lại. Sau một số lần lặp lại hữu hạn, giai đoạn đầu tiên tiếp theo nhất thiết phải kết thúc bằng một quá trình chuyển đổi đến giai đoạn thứ hai , trong đó số số 0 độc lập sẽ tăng thêm một và sau đó (k+ 1) thứ lặp lại kết thúc.

Ví dụ 9. Hãy giải quyết vấn đề bằng phương pháp Hungary:

Tàu chiến mặt nước có 5 vũ khí hỏa lực phòng không (ASF). Một cuộc không kích đồng thời của địch với số lượng 5 chiếc được thực hiện trên tàu. Tiềm năng đáng kinh ngạc của mọi người Tôi-thứ AIA j-máy bay địch bằng (số lượng có khả năng bị phá hủy j–x máy bay trong cuộc tấn công của NK bởi một máy bay). Người ta cho rằng bất kỳ AAM nào cũng có thể bắn vào bất kỳ mục tiêu nào.

Phân bổ biện pháp bảo vệ môi trường trên toàn vùng BĐKH sao cho tổng khả năng gây thiệt hại là tối đa, theo các điều kiện sau:

    Chỉ có thể gán một ZOS cho một CC;

    tất cả các mục tiêu phải được AIA bắn vào.

Giải pháp :

Giai đoạn sơ bộ .



Lần lặp đầu tiên .

Giai đoạn đầu .

+ +


TRONG

+ +

giai đoạn thứ hai .


Lần lặp thứ hai .

P

+ +

giai đoạn đầu .


Vì tất cả các số 0 của ma trận VỚI 1 được đánh dấu, bạn nên chuyển sang giai đoạn thứ ba.

Giai đoạn thứ ba .

+ +

+ +

h =1 

Giai đoạn đầu .

Giai đoạn thứ hai .


Kết quả giải bài toán gán bằng phương pháp Hungary, ta thấy dãy
=4,
=4,
=3,
=2,
=2 cho giá trị cực đại của hàm mục tiêu =15. Từ đó, để đẩy lùi một cuộc tấn công trên không của đối phương, lựa chọn hiệu quả nhất sẽ là lựa chọn gán AOC cho CC:

Bài tập .

    Tìm kế hoạch tham khảo vấn đề vận chuyển phương pháp “Góc Tây Bắc”, “Chi phí thấp nhất”, “Vogel”:

Một Tôi

Các ứng dụng b j

    Giải bài toán vận chuyển ở bài 1 bằng phương pháp phân phối.

    Giải bài toán vận chuyển ở bài 1 bằng phương pháp thế.

    Sử dụng phương pháp Hungary để giải bài toán gán khi tìm cực trị:

    Sử dụng phương pháp Hungary để giải bài toán gán khi tìm giá trị nhỏ nhất:

Câu hỏi kiểm soát :

    Đưa ra công thức của bài toán quy hoạch tuyến tính vận chuyển.

    Bài toán vận tải cân bằng khác với bài toán vận tải không cân bằng như thế nào?

    Có bao nhiêu biến cơ bản trong một bài toán cân bằng vận tải?

    Xác định các khái niệm: phương án, phương án khả thi, phương án khả thi tham khảo, phương án tối ưu, sử dụng trong giải quyết bài toán giao thông.

    Xây dựng thuật toán tìm mặt bằng tham chiếu bằng phương pháp góc Tây Bắc.

    Xây dựng thuật toán tìm phương án tham chiếu bằng phương pháp chi phí thấp nhất.

    Xây dựng thuật toán tìm phương án tham chiếu bằng phương pháp Vogel.

    Xây dựng thuật toán tìm phương án tối ưu bằng phương pháp phân phối.

    Xây dựng thuật toán tìm phương án tối ưu bằng phương pháp thế năng.

    Đưa ra cách giải bài toán.

    Làm thế nào trong vấn đề bài tập khi số lượng khác nhauđồ vật và phương tiện được hình thành Ma trận vuông cuộc hẹn?

    Xây dựng thuật toán giải bài toán gán bằng phương pháp Hungary.

    Ma trận gán ban đầu được hình thành như thế nào ở giai đoạn sơ bộ khi tối đa hóa hàm mục tiêu?

    Ma trận gán ban đầu được hình thành như thế nào ở giai đoạn sơ bộ khi cực tiểu hóa hàm mục tiêu?

    Bản chất của giai đoạn đầu tiên giải bài toán bằng phương pháp Hungary là gì?

    Bản chất của giai đoạn thứ hai khi giải bài toán bằng phương pháp Hungary là gì?

    Bản chất của giai đoạn thứ ba trong việc giải bài toán bằng phương pháp Hungary là gì?

    Có thể có bao nhiêu giai đoạn thứ nhất, thứ hai và thứ ba trong một lần lặp lại việc giải bài toán gán bằng phương pháp Hungary? Trình tự các bước trong một lần lặp là gì?

    Phải có bao nhiêu số 0 độc lập trong ma trận gán để quyết định rằng việc phân bổ vốn tối ưu cho các đối tượng đã được tìm thấy?

Ý tưởng của phương pháp này được nhà toán học Hungary Egervary trình bày như sau. Một kế hoạch vận chuyển ban đầu đang được xây dựng nhưng không đáp ứng được trường hợp chung mọi điều kiện của vấn đề (từ một số điểm sản xuất không xuất khẩu hết sản phẩm, nhu cầu của một số điểm tiêu thụ chưa được đáp ứng đầy đủ). Tiếp theo, quá trình chuyển đổi được thực hiện sang một kế hoạch mới, gần hơn với kế hoạch tối ưu. Việc áp dụng nhất quán kỹ thuật này qua một số lần lặp hữu hạn sẽ dẫn đến giải pháp của vấn đề.

Thuật toán của phương pháp Hungary bao gồm giai đoạn chuẩn bị và số lần lặp hữu hạn. Ở giai đoạn chuẩn bị, ma trận X0 (xij)m,n được xây dựng, các phần tử của ma trận này không âm và thỏa mãn các bất đẳng thức:

Nếu các điều kiện này bằng nhau thì ma trận Xo là lời giải cho bài toán vận chuyển. Nếu có sự bất bình đẳng giữa các điều kiện thì việc chuyển sang lần lặp đầu tiên sẽ được thực hiện. TRÊN lần lặp thứ k ma trận Xk (xij)m,n được xây dựng. Mức độ gần gũi của ma trận này với lời giải của bài toán được đặc trưng bởi số Dk - tổng sai phân của ma trận Xk:

Kết quả của lần lặp đầu tiên là ma trận Xl được xây dựng, bao gồm các phần tử không âm. Trong trường hợp này, Dl D0. Nếu Dl 0 thì Xl là phương án tối ưu cho bài toán. Nếu Dl 0 thì chuyển sang lần lặp tiếp theo. Chúng được thực hiện cho đến khi Dk tại một số k trở thành bằng 0. Ma trận tương ứng Xk là nghiệm của bài toán vận chuyển.

Phương pháp Hungary hiệu quả nhất khi giải quyết các vấn đề vận tải với khối lượng sản xuất và tiêu thụ là số nguyên. Trong trường hợp này, số lần lặp không vượt quá giá trị D0/2 (D0 là tổng sai lệch của giai đoạn chuẩn bị).

Ưu điểm của phương pháp Hungary là khả năng đánh giá mức độ gần gũi của kết quả của mỗi lần lặp với kế hoạch vận chuyển tối ưu. Điều này cho phép bạn kiểm soát quá trình tính toán và dừng nó khi đạt đến các chỉ số chính xác nhất định. Tài sản này cần thiết cho các vấn đề quy mô lớn.

    Volkov I.K., Zagoruiko E.A. Nghiên cứu hoạt động: Proc. cho các trường đại học. dây cương thứ 2 / Biên tập bởi V.S. Zarubina, A.P. Krischenko. – M.: Uzd-vo MSTU im. N.E. Bauman, 2002. – 436 tr.

    Zaichenko Yu.P. Nghiên cứu hoạt động: Proc. cẩm nang dành cho sinh viên đại học. – tái bản lần thứ 2, có sửa đổi. và bổ sung – Kiev: trường Vishcha. Nhà xuất bản chính, 1979. 392 tr.

    I. A. Akulich. Lập trình toán học trong các ví dụ và bài toán. - M.: “ trường sau đại học", 1986.- 319 tr.

    Sakovich V.A. Nghiên cứu hoạt động (Các phương pháp và mô hình xác định): Hướng dẫn tham khảo. - Mn.: Cao hơn. trường học, 1984.-256p.

    Taha H. Giới thiệu về nghiên cứu hoạt động: trong hai cuốn sách. Cuốn sách 1,2 mỗi. từ tiếng Anh - M.: Mir, 1985.

    Khazanova L.E. Lập trình toán học trong kinh tế: Hướng dẫn. – M.: Nhà xuất bản BEK, 1998. – 141 tr.

  • Hướng dẫn

Xin chào các bạn! Trong bài viết này, tôi muốn nói về một thuật toán thú vị từ bộ môn “Nghiên cứu hoạt động”, cụ thể là Phương pháp Hungary và cách sử dụng nó để giải các bài toán về bài tập. Tôi sẽ đề cập một chút về các lý thuyết về trường hợp nào và nhiệm vụ nào nó có thể áp dụng được. thuật toán này, Tôi sẽ phân tích nó từng bước bằng cách sử dụng một ví dụ hư cấu và chia sẻ bản phác thảo khiêm tốn của tôi về mã để triển khai nó bằng ngôn ngữ R. Hãy bắt đầu!

Một vài lời về phương pháp

Để không mô tả nhiều lý thuyết bằng các thuật ngữ và định nghĩa toán học, tôi đề xuất xem xét một số phương án để xây dựng bài toán và tôi nghĩ bạn sẽ hiểu ngay trong trường hợp nào thì phương pháp Hungary được áp dụng:
  • Vấn đề phân công công nhân vào các vị trí. Cần phân bố công nhân vào các vị trí sao cho hiệu quả tối đa, hoặc được chi phí tối thiểu làm việc.
  • Phân công máy móc cho các bộ phận sản xuất. Việc phân phối máy móc sao cho khi vận hành, sản xuất mang lại lợi nhuận cao nhất có thể hoặc chi phí bảo trì ở mức tối thiểu.
  • Lựa chọn ứng viên cho các vị trí tuyển dụng khác nhau dựa trên đánh giá. Chúng ta sẽ xem xét ví dụ này dưới đây.
Như bạn có thể thấy, có nhiều lựa chọn có thể áp dụng phương pháp Hungary và các vấn đề tương tự nảy sinh trong nhiều lĩnh vực hoạt động.

Do đó, bài toán phải được giải sao cho một người thực hiện (người, máy, dụng cụ,...) chỉ có thể thực hiện một công việc và mỗi công việc chỉ được thực hiện bởi một người thực hiện.

Cần thiết và đủ điều kiện giải quyết một vấn đề là loại đóng của nó. Những thứ kia. khi số lượng người biểu diễn = số lượng tác phẩm (N=M). Nếu điều kiện này không được đáp ứng, thì bạn có thể thêm những người biểu diễn hư cấu hoặc các tác phẩm hư cấu mà các giá trị trong ma trận sẽ bằng 0. Điều này sẽ không ảnh hưởng đến việc giải quyết vấn đề theo bất kỳ cách nào, nó sẽ chỉ cung cấp cho nó kiểu đóng cần thiết.

Thuật toán từng bước làm ví dụ

Xây dựng bài toán: Hãy để có một điều quan trọng Hội nghị khoa học. Để tiến hành, bạn cần bố trí âm thanh, ánh sáng, hình ảnh, đăng ký khách mời và chuẩn bị nghỉ giải lao giữa các buổi biểu diễn. Có 5 người tổ chức cho nhiệm vụ này. Mỗi người trong số họ có những xếp hạng nhất định về hiệu suất của một công việc cụ thể (giả sử rằng những xếp hạng này được đặt làm mức trung bình số học của các đánh giá về nhân viên của họ). Cần phân chia ban tổ chức sao cho tổng số điểm của họ là tối đa. Nhiệm vụ trông như thế này:


Nếu bài toán được giải đến mức tối đa (như trong trường hợp của chúng ta), thì ở mỗi hàng của ma trận cần tìm phần tử lớn nhất, trừ nó khỏi mỗi phần tử của hàng tương ứng và nhân toàn bộ ma trận với -1. Nếu vấn đề được giải quyết ở mức tối thiểu thì phải bỏ qua bước này.


Chỉ được có một số 0 được chọn trong mỗi hàng và mỗi cột. (tức là khi số 0 được chọn thì các số 0 còn lại trong hàng này hoặc trong cột này không còn được tính đến nữa). Trong trường hợp này không thể làm điều này:


(Nếu vấn đề được giải quyết ở mức tối thiểu thì bạn cần bắt đầu từ bước này). Chúng tôi tiếp tục giải pháp hơn nữa. Giảm ma trận theo hàng (chúng tôi tìm phần tử tối thiểu trong mỗi hàng và trừ nó khỏi từng phần tử tương ứng):


Bởi vì tất cả các phần tử tối thiểu đều bằng 0 thì ma trận không thay đổi. Ta thực hiện rút gọn theo cột:


Một lần nữa, hãy đảm bảo rằng chỉ có một số 0 được chọn trong mỗi cột và mỗi hàng. Như có thể thấy dưới đây, trong trong trường hợp này không thể làm được điều này Tôi đã trình bày hai tùy chọn về cách chọn số 0, nhưng cả hai tùy chọn đều không cho kết quả mong muốn:


Chúng tôi tiếp tục giải pháp hơn nữa. Gạch bỏ các hàng và cột không chứa phần tử nào ( QUAN TRỌNG! Số lần tấn công phải ở mức tối thiểu). Trong số các phần tử còn lại, chúng tôi tìm mức tối thiểu, trừ nó khỏi các phần tử còn lại (không bị gạch bỏ) và thêm nó vào các phần tử nằm ở giao điểm của các hàng và cột bị gạch chéo (những gì được đánh dấu màu xanh lá cây sẽ bị trừ ở đó; những gì được đánh dấu bằng vàng được tóm tắt ở đó; rồi, Chúng tôi không chạm vào những gì không được sơn phủ):


Như bạn có thể thấy, chỉ có một số 0 được chọn trong mỗi cột và hàng. Chúng tôi hoàn thành nhiệm vụ!


Chúng tôi thay thế vị trí của các số 0 đã chọn vào bảng ban đầu. Do đó, chúng ta có được một kế hoạch tối ưu hoặc tối ưu, trong đó những người tổ chức được phân bổ giữa các công việc và tổng ước tính là lớn nhất:


Nếu bạn đang giải một bài toán và vẫn không thể chọn số 0 để chỉ có một số 0 trong mỗi cột và hàng, thì chúng ta lặp lại thuật toán từ nơi thực hiện phép khử dọc theo các dòng (phần tử tối thiểu trong mỗi dòng). ).

Triển khai bằng ngôn ngữ lập trình R

Thuật toán Hungary được thực hiện bằng cách sử dụng đệ quy. Tôi hy vọng rằng mã của tôi sẽ không gây ra bất kỳ khó khăn nào. Trước tiên, bạn cần biên dịch ba hàm, sau đó bắt đầu tính toán.

Dữ liệu để giải quyết vấn đề được lấy từ tệp example.csv, có dạng như sau:


#Chúng tôi kết nối thư viện để thuận tiện cho việc tính toán thư viện(dplyr) #Đọc tệp csv (cột đầu tiên là tên các hàng; dòng đầu tiên là tên các cột) bảng<- read.csv("example.csv",header=TRUE,row.names=1,sep=";") #Проводим расчеты unique_index <- hungarian_algorithm(table,T) #Выводим cat(paste(row.names(table)," - ",names(table)),sep = "\n") #Считаем оптимальный план cat("Оптимальное значение -",sum(mapply(function(i, j) table, unique_index$row, unique_index$col, SIMPLIFY = TRUE))) #____________________Алгоритм венгерского метода__________________________________ hungarian_algorithm <- function(data,optim=F){ #Если optim = T, то будет искаться максимальное оптимальное значение if(optim==T) { data <- data %>% áp dụng(1,function(x) (x-max(x))*(-1)) %>% t() %>% as.data.frame() tối ưu<- F } #Редукция матрицы по строкам data <- data %>% áp dụng(1,function(x) x-min(x)) %>% t() %>% as.data.frame() #Tìm chỉ số của tất cả các số 0 zero_index<- which(data==0, arr.ind = T) #Нахождение всех "неповторяющихся" нулей слева-направо unique_index <- from_the_beginning(zero_index) #Если количество "неповторяющихся" нулей не равняется количеству строк в исходной таблице, то.. if(nrow(unique_index)!=nrow(data)) #..Ищем "неповторяющиеся" нули справа-налево unique_index <- from_the_end(zero_index) #Если все еще не равняется, то продолжаем алгоритм дальше if(nrow(unique_index)!=nrow(data)) { #Редукция матрицы по столбцам data <- data %>% áp dụng(2,function(x) x-min(x)) %>% as.data.frame() zero_index<- which(data==0, arr.ind = T) unique_index <- from_the_beginning(zero_index) if(nrow(unique_index)!=nrow(data)) unique_index <- from_the_end(zero_index) if(nrow(unique_index)!=nrow(data)) { #"Вычеркиваем" строки и столбцы которые содержат нулевые элементы (ВАЖНО! количество вычеркиваний должно быть минимальным) index <- which(apply(data,1,function(x) length(x)>1)) chỉ mục2<- which(apply(data[-index,],2,function(x) length(x)>0)) #Trong số các phần tử còn lại, chúng tôi tìm kiếm min_from_table tối thiểu<- min(data[-index,-index2]) #Вычитаем минимальный из оставшихся элементов data[-index,-index2] <- data[-index,-index2]-min_from_table #Прибавляем к элементам, расположенным на пересечении вычеркнутых строк и столбцов data <- data+min_from_table zero_index <- which(data==0, arr.ind = T) unique_index <- from_the_beginning(zero_index) if(nrow(unique_index)!=nrow(data)) unique_index <- from_the_end(zero_index) #Если все еще количество "неповторяющихся" нулей не равняется количеству строк в исходной таблице, то.. if(nrow(unique_index)!=nrow(data)) #..Повторяем весь алгоритм заново hungarian_algorithm(data,optim) else #Выводим индексы "неповторяющихся" нулей unique_index } else #Выводим индексы "неповторяющихся" нулей unique_index } else #Выводим индексы "неповторяющихся" нулей unique_index } #_________________________________________________________________________________ #__________Функция для нахождения "неповторяющихся" нулей слева-направо___________ from_the_beginning <- function(x,i=0,j=0,index = data.frame(row=numeric(),col=numeric())){ #Выбор индексов нулей, которые не лежат на строках i, и столбцах j find_zero <- x[(!x[,1] %in% i) & (!x[,2] %in% j),] if(length(find_zero)>2)( #Viết chỉ số hàng vào vector i<- c(i,as.vector(find_zero)) #Записываем индекс столбца в вектор j <- c(j,as.vector(find_zero)) #Записываем индексы в data frame (это и есть индексы уникальных нулей) index <- rbind(index,setNames(as.list(find_zero), names(index))) #Повторяем пока не пройдем по всем строкам и столбцам from_the_beginning(find_zero,i,j,index)} else rbind(index,find_zero) } #_________________________________________________________________________________ #__________Функция для нахождения "неповторяющихся" нулей справа-налево___________ from_the_end <- function(x,i=0,j=0,index = data.frame(row=numeric(),col=numeric())){ find_zero <- x[(!x[,1] %in% i) & (!x[,2] %in% j),] if(length(find_zero)>2)(tôi<- c(i,as.vector(find_zero)) j <- c(j,as.vector(find_zero)) index <- rbind(index,setNames(as.list(find_zero), names(index))) from_the_end(find_zero,i,j,index)} else rbind(index,find_zero) } #_________________________________________________________________________________


Kết quả thực hiện chương trình:

Bước 1.(Giảm hàng và cột). Mục tiêu của bước này là thu được số phần tử 0 tối đa có thể có trong ma trận chi phí. Để làm điều này, phần tử tối thiểu của hàng tương ứng được trừ khỏi tất cả các phần tử của mỗi hàng, sau đó phần tử tối thiểu của cột tương ứng được trừ khỏi tất cả các phần tử của mỗi cột của ma trận kết quả. Kết quả là, một ma trận chi phí giảm được thu được và tiến hành tìm kiếm các bài tập.

Bước 2.(Định nghĩa nhiệm vụ). Ở bước này, bạn có thể sử dụng thuật toán tìm “kết quả khớp lớn nhất với ma trận của đồ thị hai bên (có các khả năng khác), nếu tất cả =0 của ma trận được thay thế bằng “1” và >0 bằng “0” .

Nếu không thể tìm thấy mục đích đầy đủ thì cần phải sửa đổi thêm ma trận chi phí, tức là. chuyển sang bước 3.

Bước 3. (Sửa đổi ma trận rút gọn). Đối với ma trận chi phí giảm:

a) Tính số số 0 trong mỗi hàng và mỗi cột không được gạch chéo.

b) Gạch bỏ hàng hoặc cột có số lượng số 0 tối đa.

c) Thực hiện các bước a) và b) cho đến khi gạch hết các số 0.

d) Từ tất cả các phần tử không chéo, trừ đi phần tử nhỏ nhất không chéo và cộng nó vào từng phần tử nằm ở giao điểm của hai đường thẳng.

Chuyển sang bước 2.

Lưu ý 3.Nếu bài toán ban đầu là bài toán tối đa hóa thì tất cả các phần tử của ma trận chi phí phải được nhân với (-1) và cộng với một số đủ lớn để ma trận không chứa các phần tử âm. Vấn đề sau đó sẽ được giải quyết như một vấn đề tối thiểu hóa.

Ví dụ 13.5. Chúng ta hãy chứng minh hoạt động của thuật toán Hungary bằng ví dụ về bài toán gán với ma trận chi phí sau:

Lặp lại 1

Bước 1. Giảm số hàng và cột.

Giá trị của các phần tử nhỏ nhất ở hàng 1, 2, 3 và 4 lần lượt là 2, 4, 11 và 4. Trừ giá trị tối thiểu tương ứng từ các phần tử của mỗi hàng, chúng ta thu được ma trận sau:

Giá trị của các phần tử nhỏ nhất của cột 1, 2, 3 và 4 lần lượt là 0, 0, 5 và 0. Trừ giá trị tối thiểu tương ứng từ các phần tử của mỗi cột, chúng ta thu được ma trận sau.

Bước 2. Tìm một giải pháp khả thi mà tất cả các nhiệm vụ đều có chi phí bằng 0. Chúng tôi sử dụng thuật toán để tìm kết quả phù hợp lớn nhất. Hãy chuyển đổi ma trận thành ma trận đồ thị lưỡng cực, sau đó thành một bảng tính:

Tìm sự phù hợp:

Sự kết hợp này không hoàn hảo, tức là. không có mục đích đầy đủ. Đến Bước 3.

Bước 3. Sửa đổi ma trận rút gọn.

a) Số chữ số 0 ở các dòng 1, 2, 3 và 4 lần lượt là 1, 1, 2 và 1. Đối với các cột, các giá trị tương ứng là 2, 1, 1 và 1.

b) Số lượng tối đa các số 0, mỗi số có hai số 0, ở dòng 3 và cột 1. Chọn dòng 3 và gạch bỏ tất cả các phần tử của nó bằng một đường ngang.

c) Số chữ số 0 không gạch chéo ở các dòng 1, 2 và 4 lần lượt là 1, 1 và 1. Đối với các cột, các giá trị tương ứng là 2, 1, 0 và 0. Vì vậy, chúng ta phải chọn cột 1 và gạch bỏ nó bằng một đường thẳng đứng. Sau này, sẽ chỉ còn lại một số 0 không bị đánh dấu - phần tử (2,2). Do đó, bạn có thể gạch bỏ hàng 2 hoặc cột 2. Gạch bỏ hàng 2 bằng một đường ngang, ta được ma trận sau:

d) Giá trị của phần tử không bị gạch chéo tối thiểu là 2. Trừ nó khỏi tất cả các phần tử không bị gạch chéo và cộng nó với tất cả các phần tử nằm ở giao điểm của hai đường, chúng ta thu được ma trận chi phí mới.

Đặc điểm cụ thể của các bài toán giao bài đã dẫn đến sự xuất hiện của một phương pháp hiệu quả của Hungary để giải chúng. Ý tưởng chính của phương pháp Hungary là chuyển từ ma trận chi phí bình phương ban đầu VỚI về ma trận tương đương C e với các phần tử không âm và hệ P các số 0 độc lập, trong đó không có hai số nào thuộc cùng một hàng hoặc cùng một cột. Để cho P tồn tại P các giải pháp khả thi. Nếu trong ma trận đích X sắp xếp Pđơn vị sao cho trong mỗi hàng, mỗi cột chỉ có một đơn vị, sắp xếp theo vị trí P các số 0 độc lập của ma trận chi phí tương đương C e thì ta thu được nghiệm khả thi của bài toán gán.

Hãy xem xét thuật toán của phương pháp Hungary bằng cách sử dụng ví dụ giải bài toán cho một ma trận chi phí nhất định

Cần lưu ý rằng đối với bất kỳ phép gán không hợp lệ nào, chi phí tương ứng được giả định có điều kiện bằng một số lượng đủ lớn. M trong các nhiệm vụ ở mức tối thiểu. Nếu ma trận ban đầu không phải là hình vuông thì cần thêm số lượng hàng hoặc cột bắt buộc và các phần tử của chúng phải được gán các giá trị được xác định bởi các điều kiện của bài toán, có thể sau khi giảm và các lựa chọn thay thế chiếm ưu thế, đắt tiền hoặc giá rẻ nên được loại trừ.

A. Giải quyết vấn đề với chi phí tối thiểu

1. Chúng ta rút gọn ma trận theo hàng và cột, như trong phương thức nhánh và giới hạn


  • 2. Bằng cách thử và sai, chúng ta tìm kiếm một giải pháp có thể chấp nhận được mà tất cả các nhiệm vụ đều có chi phí bằng 0. Vì việc sắp xếp các phần tử 0 trong ma trận không cho phép tạo thành một hệ thống gồm 4 số 0 độc lập nên giải pháp này là không thể chấp nhận được.
  • 3. Chúng tôi sửa đổi ma trận. Chúng tôi gạch bỏ các hàng và cột có càng nhiều phần tử 0 càng tốt - hàng 2 và 3, cột 1 và chúng tôi nhận được một ma trận rút gọn

Chúng ta trừ phần tử tối thiểu của ma trận rút gọn (2) khỏi tất cả các phần tử của nó và cộng nó với các phần tử nằm ở giao điểm của các hàng và cột bị gạch bỏ: 12 + 2 = 14; Ma trận rút gọn 3 + 2 = 5. Kết quả là ta thu được ma trận tương đương

4. Bằng phương pháp thử và sai, chúng ta xác định được ma trận gán X, cho phép bạn tính toán chi phí đích tối thiểu dựa trên các phần tử có vị trí tương tự của ma trận ban đầu (trong hình chữ nhật)

B. Giải quyết vấn đề để tối đa hóa lợi nhuận

1. Sửa đổi ma trận bằng cách nhân tất cả các phần tử với (-1) rồi cộng với phần tử lớn nhất của ma trận (17) sao cho ma trận không chứa phần tử âm:


2. Rút gọn ma trận theo hàng và cột, ta thu được ma trận tương đương

3. Bằng phương pháp thử và sai, chúng ta xây dựng ma trận gán X và sau đó chúng tôi tính toán lợi nhuận tối đa (trong các giá trị ma trận ban đầu trong hình chữ nhật):

Ví dụ 4.6. Phân phối sản xuất 3 loại hàng T|, T 2, T3 cho 5 doanh nghiệp P|, P 2, P:(, P 4, P-, nhằm thu được lợi nhuận tối đa từ việc bán hàng theo số liệu sau :

Chi phí sản xuất trên một đơn vị hàng hóa (USD)

Nhu cầu hàng năm (chiếc.) và giá sản phẩm (đô la)

Chúng tôi tạo thành một ma trận lợi nhuận hàng năm có tính đến nhu cầu (nghìn đô la)

2. Chúng tôi sửa đổi ma trận bằng cách nhân tất cả các phần tử với (-1) và cộng với số lượng tối đa của ma trận (8000) và để loại bỏ sự mất cân bằng, chúng tôi giới thiệu hai loại sản phẩm hư cấu T 4, T G) với lợi nhuận bằng 0, vì ma trận phải vuông:

3. Rút gọn ma trận theo hàng và cột:


4. Sửa đổi ma trận bằng cách loại trừ hàng 4, 5 và cột 3, 4, ta thu được ma trận rút gọn

Sau đó, chúng tôi xác định phần tử tối thiểu 180 trong đó, trừ nó khỏi tất cả các phần tử của ma trận này và tính tổng nó với các phần tử nằm ở giao điểm của các hàng và cột bị loại trừ của ma trận rút gọn (được đánh dấu bằng hình chữ nhật), kết hợp các kết quả và thu được một ma trận tương đương


trên đó chúng tôi xây dựng ma trận gán

và sử dụng nó, chồng nó lên ma trận dữ liệu ban đầu, chúng tôi xác định giá trị lợi nhuận tối đa

Như vậy, phương pháp Hungary có thể giải quyết được nhiều vấn đề trong hoạt động thương mại. Cần lưu ý rằng công việc phức tạp và tế nhị nhất là đặt ra các nhiệm vụ liên quan đến việc tính toán các yếu tố trong ma trận chi phí của ứng viên theo vị trí. Sau đó, cần phải xác định bằng một phương pháp nào đó tính hiệu quả của việc thể hiện nhân cách ở từng vị trí còn trống, chẳng hạn như kế toán, quản lý, doanh nhân hay chuyên gia tài chính. Trong trường hợp này, bạn có thể sử dụng so sánh danh sách yêu cầu về phẩm chất công việc cần và đủ - tiêu chuẩn (Bảng 4.18), chẳng hạn như một doanh nhân và phẩm chất thực tế của người nộp đơn. Tính phần tử ma trận c,y là sự khác biệt giữa các tiêu chí không thể thiếu của tiêu chuẩn và cá nhân, đồng thời có tính đến những phẩm chất tiêu cực của người nộp đơn.

Bảng 4.18

Chức danh

Phẩm chất

Giám đốc

Trách nhiệm, tổ chức, học vấn, kinh nghiệm làm việc, ý chí, sức khỏe, trực giác, nhiệt tình, hòa đồng, tự phê bình, cân bằng, khách quan, hiểu người, ít xung đột, biết lễ phép

Giám đốc

Học vấn, kinh nghiệm, kỹ năng giao tiếp, sự cân bằng, làm việc với mọi người, trực giác, quyết tâm, tháo vát, thông minh, hoạt động, tư vấn^, phản ứng

Chuyên gia kinh tế

Trình độ học vấn, phân tích, kinh nghiệm, kỹ năng giao tiếp, đĩnh đạc, làm việc với mọi người, trực giác, đúng giờ, không xung đột, khả năng nhìn xa trông rộng, tự tin, khả năng lập kế hoạch kinh doanh, tính thực tế

Kế toán viên

Học vấn, kinh nghiệm, sự chu đáo, kiên trì, thích tính toán, rõ ràng, đúng giờ, siêng năng, trách nhiệm, cống hiến, khả năng kiểm soát, chính trực, logic, thực tế, tự chủ, phân tích, hình thức, quan liêu

Kommer

ông già Noel

Hòa đồng, không xung đột, nhiệt tình, thực tế, lịch sự, khả năng thuyết phục, năng động, quan điểm trong nhóm sản phẩm, cam kết, siêng năng, uyên bác, cạnh tranh, tháo vát, hài hước

Ví dụ, với tư cách là ứng cử viên, chúng ta sẽ sử dụng những nhân vật văn học nổi tiếng như Gobsek, Chichikov, Sobakevich, Plyushkin, Ostap Bender, những nhân vật có phẩm chất tích cực và tiêu cực được mô tả trong các tác phẩm nổi tiếng (Bảng 4.19).

Bảng 4.19

Thông minh, xảo quyệt, cân đối, cứng rắn, thực tế, thận trọng, kiềm chế, sáng suốt, giáo dục, khéo léo, hiệu quả, rởm, không tin tưởng, cơ quan, khả năng hiểu người, trách nhiệm, có mục đích, khả năng kiểm soát, logic, nhiệt tình, ý chí, trực giác, khách quan , kiến ​​thức về lễ nghi, phản ứng, trí thông minh, sự tháo vát, ý chí, sức khỏe

Tham lam, vô cảm, ác tâm, khắc nghiệt, ranh mãnh, thù hận, keo kiệt, ích kỷ, keo kiệt, thiếu giao tiếp, xung đột

Tinh thần kinh doanh, tháo vát, lạc quan, hòa đồng, khéo léo, khéo léo, hài hước, khiêm tốn, quyết đoán, thích ứng, cân bằng, khả năng làm việc với mọi người, trực giác, quyết tâm, thông minh, năng động, tư vấn, phản ứng nhanh, nhiệt tình, sức khỏe, tổ chức, ý chí , kỹ năng hiểu người, kiến ​​thức về phép xã giao, sự chú ý, kiểm soát, logic, tự chủ, phân tích

Tư lợi, cẩu thả, vô liêm sỉ, gian xảo, hỗn láo, buôn bán, thủ đoạn, ảo tưởng, hỗn láo, cờ bạc

Tính chính xác, kiên trì, mô phạm, thận trọng, có mục đích, tiết kiệm, thực tế, dám nghĩ dám làm, tự chủ, kiên nhẫn, trực giác, khéo léo, hiệu quả, thận trọng, có học thức, cân bằng, khả năng làm việc với mọi người, hòa đồng, năng động, tư vấn, phản ứng nhanh, trách nhiệm , nhiệt tình, sức khỏe, nhà tổ chức, tính khách quan, khả năng hiểu người, kiến ​​thức về phép xã giao, sự chu đáo, khả năng kiểm soát, logic, tính phân tích, chủ nghĩa hình thức, quan liêu

Nhượng bộ, tôn sùng cấp bậc, tham lam, buôn bán, trộm cắp, không trung thực, hối lộ, trốn tránh, lém lỉnh, mất cân bằng

Tiết kiệm, hiệu quả, kỹ lưỡng, nhạy bén, khả năng mặc cả, chính xác trong kinh doanh, không tin tưởng, cam kết, chu đáo, rõ ràng, siêng năng, khả năng kiểm soát, thực tế, sức khỏe, trực giác, khách quan, khả năng hiểu người, có mục đích, quan điểm trong nhóm sản phẩm, khả năng cạnh tranh, phân tích, kinh nghiệm, trực giác

Vụng về, thô lỗ, thiếu hiểu biết, thủ đoạn, nghi ngờ, thiếu văn hóa, không khoan dung với mọi người, mâu thuẫn, thiếu ý chí

Quản lý yếu kém, thiếu hiểu biết về hàng hóa, tham lam, thiếu tinh thần buôn bán, keo kiệt, thiếu chú ý, tích trữ, thiếu thực tế, mất cân đối

Chúng ta bắt đầu giải pháp bằng việc xác định tầm quan trọng - tầm quan trọng của phẩm chất công việc (xem Bảng 4.18) bằng phương pháp so sánh cặp đôi (xem đoạn 1.3), bắt đầu từ giám đốc (Bảng 4.20).

Chúng tôi xác định xem ma trận có được điền chính xác hay không:

Trọng số chất lượng được xác định theo công thức M; = 5,-/và 2, ghi kết quả vào bảng. 4,20.

Sau đó, so sánh những phẩm chất cần thiết của vị trí giám đốc (xem Bảng 4.20) với phẩm chất của ứng viên (Bảng 4.21), chúng tôi xây dựng ma trận về sự hiện diện của những phẩm chất giám đốc giữa các ứng viên (xem Bảng 4.21) và tính toán các giá trị hiệu quả hệ số Su.

Ứng viên phù hợp nhất cho vị trí này là Gobsek, Su = 0,6224.

Dựa vào kết quả so sánh, chúng tôi xác định hệ số hiệu quả su và nhập nó vào bảng. 4.22.

Tương tự, chúng ta thực hiện các phép toán so sánh cho các vị trí khác và các giá trị kết quả Su Hãy trình bày nó dưới dạng ma trận hiệu quả (xem Bảng 4.22).

Giải ma trận thu được bằng phương pháp Hungary đến mức tối đa, ta thu được ma trận phân bố ứng viên tối ưu theo vị trí (Bảng 4.23).

Cần lưu ý rằng vị trí quản lý vẫn còn trống. Bạn có thể tiếp tục giải quyết vấn đề có tính đến ảnh hưởng của những phẩm chất tiêu cực của người nộp đơn, làm giảm giá trị của các hệ số hiệu quả.

Bảng 4.20

Phẩm chất

đạo diễn

Phẩm chất của một giám đốc

1. Trách nhiệm

2. Giáo dục

3. Sự nhiệt tình

4. Sức khỏe

5. Người tổ chức

7. Trực giác

8. Kinh nghiệm làm việc

9. Kỹ năng giao tiếp

10. Tự phê bình

11. Cân bằng

12. Tính khách quan

14. Kiến thức về phép xã giao

Phẩm chất của một giám đốc

Người thách đấu

1. Trách nhiệm

2. Giáo dục

3. Sự nhiệt tình

4. Sức khỏe

5. Người tổ chức

7. Trực giác

8. Kinh nghiệm làm việc

9. Kỹ năng giao tiếp

10. Tự phê bình

11. Cân bằng

12. Tính khách quan

13. Khả năng hiểu người

14. Kiến thức về phép xã giao

Bảng 4.22