From 9b70bb90863de04e354006f9abf3190d7f327166 Mon Sep 17 00:00:00 2001 From: triforment <91782749+triforment@users.noreply.github.com> Date: Thu, 13 Jan 2022 17:53:28 +0100 Subject: [PATCH 1/4] Add files via upload --- Hungarian_algorithm.html | 75 +++++ Hungarian_algorithm.jl | 573 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 648 insertions(+) create mode 100644 Hungarian_algorithm.html create mode 100644 Hungarian_algorithm.jl diff --git a/Hungarian_algorithm.html b/Hungarian_algorithm.html new file mode 100644 index 00000000..113e3be9 --- /dev/null +++ b/Hungarian_algorithm.html @@ -0,0 +1,75 @@ + + + + + + ⚡ Pluto.jl ⚡ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Hungarian_algorithm.jl b/Hungarian_algorithm.jl new file mode 100644 index 00000000..f88e036f --- /dev/null +++ b/Hungarian_algorithm.jl @@ -0,0 +1,573 @@ +### A Pluto.jl notebook ### +# v0.16.4 + +using Markdown +using InteractiveUtils + +# ╔═╡ e7e7c0e4-47e1-4856-9e71-11dfd12dfcd3 +using StatsBase + +# ╔═╡ 8c0c6652-aa5d-4cb8-a4cf-018c80b380cf +student_names = "Triana Forment"; + +# ╔═╡ f3aa9d9c-75e1-4948-b7dd-7f0596486e83 +md""" +# Project: Hungarian algorithm + +**STMO** + +2021-2022 + +project by $student_names + +## Introduction + +In this project, the Hungarian algorithm is implemented using an adjacency matrix. +This algorithm can be used to find the map that minimizes the transport cost, given two distributions and a cost function. For two discrete probability vectors, $$a ∈ Σ_n$$ and $$b ∈ Σ_m$$, we have a $$n * m$$ cost matrix $$C$$. It can be represented as a adjacency matrix, with elements in $$a$$ as rows and elements in $$b$$ as columns, and their weights as entries in the matrix. + +This algorithm solves what can be also called the assignment problem. An example can be, given $$n$$ agents and the money they ask for performing each task, finding which agent performs which task in order to minimize the cost of performing all $$m$$ tasks. +When there are the same number of agents than tasks, the the problem is called balanced assignment, otherwise is called unbalanced assignment. And if the total cost is the sum for each agent performing its task, the problem is called linear assignment. This implementation can be used to solve linear balanced assignment problems. +""" + +# ╔═╡ bf771d76-099c-449b-bebd-5201ed72ebb6 +md""" +# Implementation +""" + +# ╔═╡ ed527906-da70-4186-a6db-da9906d72efa +md""" +## Outline of the approach + +1. Subtract the smallest entry in each row from all the entries in the row, thus making the smallest entry in the row now equal to `0`. The same for each column. + +2. Mark the rows and columns which have 0 entries, such that the fewest lines possible are drawn. + +3. If there are $m$ marked rows and columns, an optimal assignment of zeros is possible and the algorithm is finished. The cost value and the optimal agent-task combination can be calculated. If the number of lines is less than $$m$$, then the optimal number of zeroes is not yet reached and the next step needs to be performed. + +4. Find the smallest entry not marked by any marked row and by any column. Subtract this entry from each row which is not marked, and then add it to each column which is marked. Then, go back to step 2. +""" + +# ╔═╡ 23020cd7-333d-4d97-aabb-c13614d57c65 +md""" +**`find_min_row`** is a function that gets the row with the fewest zeros. For that purpose, it needs as an input a binary matrix, having `0` if the original value after subtracting the smallest entry in each row from all the other entries in the row was `0`, and a `1` if it was different from `0`. It also needs a vector `zero_list` that will store the coordinates of the `0` in the row with fewest zeros. After the first finding, it reajusts the binary matrix so the whole row and column from the last coordinate stored is set to ones (`1`). This function is used in the next function `mark_matrix`. +""" + +# ╔═╡ 8fa3a099-d325-4675-9c05-491f25ea73c8 +""" + find_min_row(matrix_zero, zero_list) + +Inputs: + - `matrix_zero`: binary matrix + - `zero_list`: array to store the coordinates of the zeros in the row with fewest zeros. + +Outputs: + - `min_row`: tuple with the first element the number of zeros in the row with fewest zeros and the index of that row as second element + - `zero_list`: list of coordinates tuples of the zeros found +""" +function find_min_row(matrix_zero, zero_list) + min_row = [Inf, -1] + + for row in 1:size(matrix_zero)[1] + if 0 in matrix_zero[row, :] # Needs a 0 in the row to create a frequency dict + # And if the number of zeros < than the last min stored + if min_row[1] > countmap(matrix_zero[row,:])[0] + #stores the number of zeros and the row index + min_row = [countmap(matrix_zero[row,:])[0], row] + end + end + end + # Get the column index + zero_index = findall(x->x==0, matrix_zero[min_row[2],:])[1] + # Store tuple in zero_list the tuple of coordinates + append!(zero_list, [(min_row[2], zero_index)]) + # Mark the specific row and column as 1. + matrix_zero[min_row[2], :] .= 1 + matrix_zero[:, zero_index] .= 1 + return min_row, zero_list +end + +# ╔═╡ 571d7a9b-0c6b-466e-9761-3f4a4ada9e86 +md""" +**`mark_matrix`** needs as an input the matrix with the already subtracted the smallest entry in each row from all the other entries and it returns the `zero_list` and the marked row and column indexes. For that, it creates the binary matrix and calls the function `find_min_row`. It performs steps 2 and 3. +""" + +# ╔═╡ 8d04677a-5f97-4e76-937c-e79f69c14788 +""" + mark_matrix(mat) + +Perform steps 2 and 3: It marks the rows and columns that have the 0 entries such that the fewest lines possible are drawn. If there are "m" marked rows and columns, an optimal assignment solution can be found. + +Input: + - `mat` : cost matrix already modified by step 1 or an adjusted matrix by `adjust_matrix` + +Outputs: + - `zero_list` : coordinates of the zeros found by `find_min_row` + - `marked_rows`: array of marked rows + - `marked_cols`: array of marked columns +""" +function mark_matrix(mat) + + #Transform the matrix to binary matrix(0 = 0, others = 1) + binary_mat = copy(mat) + binary_mat[binary_mat .!= 0] .= 1 + binary_mat_copy = copy(binary_mat) + #Recording possible answer positions by zero_list + zero_list = [] + while 0 in binary_mat_copy + find_min_row(binary_mat_copy, zero_list) + end + #Recording the row indexes + zero_list_row = [] + for i in 1:length(zero_list) + append!(zero_list_row, zero_list[i][1]) + end + + # Get non marked rows + non_marked_row = (x->collect(x))(setdiff(Set(1:size(mat)[1]), Set(zero_list_row))) + + marked_cols = [] + flag = 0 + while flag == 0 # Enter in the loop until there's no more unmarked cols and rows + flag = 1 + for i in 1:length(non_marked_row) + row_array = binary_mat[non_marked_row[i], :] + for j in 1:length(row_array) + # Find unmarked 0 elements in the corresponding column + if row_array[j] == 0 && j ∉ marked_cols + # Store column index in "marked_cols" + append!(marked_cols, j) + flag = 0 + end + end + end + zero_rows = [t[1] for t in zero_list] + zero_cols = [t[2] for t in zero_list] + for i in 1:length(zero_list) + # If in "zero_list" coordinates there was a 0 marked in cols, + # but not in marked_rows, add its row index to "non_marked_row" + if zero_rows[i] ∉ non_marked_row && zero_cols[i] in marked_cols + append!(non_marked_row, zero_rows[i]) + flag = 0 + end + end + end + # Add those the indexes not stored in "non_marked_row" to "marked_rows" + marked_rows = (x->collect(x))(setdiff(Set(1:size(mat)[1]), Set(non_marked_row))) + return zero_list, marked_rows, marked_cols +end + +# ╔═╡ 05e77871-d6d1-4d7b-b368-89aeeed878a4 +md""" +**`adjust_matrix`** is a function needed when, after performing steps 1, 2 and 3, the number of marked rows plus the number of marked columns is not equal to the number of tasks/activities to perform by the agents. Then, it adjustes and returns the matrix as described in step 4. +""" + +# ╔═╡ f94e0b59-80d0-4d26-bac3-d75c30e4d3ee +""" + adjust_matrix(mat, marked_rows, marked_cols) + +Perform step 4: Adjust the matrix by finding the smallest entry not marked by any marked row and by any column. Subtract this entry from each row that isn’t marked, and then add it to each column that is marked. + +Inputs: + - `mat` : binary matrix created and modified by `mark_matrix` + - `marked_rows`: array of marked rows produced by `mark_matrix` + - `marked_cols`: array of marked columns produced by `mark_matrix` + +Output: + - `adjusted`: the adjusted matrix +""" +function adjust_matrix(mat, marked_rows, marked_cols) + adjusted = mat + min_values = [] + + # Find the minimum value for that is not in marked_rows and not in marked_cols + for row in 1:size(adjusted)[1] + if row ∉ marked_rows + for i in 1:length(adjusted[row,:]) + if i ∉ marked_cols + append!(min_values, adjusted[row,i]) + end + end + end + end + min_value = minimum(min_values) + # Substract that min value to all elements not in marked rows and columns + for row in 1:size(adjusted)[1] + if row ∉ marked_rows + for i in 1:length(adjusted[row,:]) + if i ∉ marked_cols + adjusted[row, i] = adjusted[row, i] - min_value + end + end + end + end + # Add the min value to elements that are in both marked row and columns + for row in marked_rows + for col in marked_cols + adjusted[row, col] = adjusted[row,col] + min_value + end + end + return adjusted +end + +# ╔═╡ 0dd294c1-1b4e-44fb-990d-1d12cfc067c4 +md""" +**`Hungarian_algorithm`** is the funtion that uses as an input the cost matrix and gives as an output the cost value and the matrix solution. This function performs steps 1 to 4, by calling the previous functions. Once the marked rows and columns sum the number of tasks to perform, it calculates the cost value by adding each cost value of the different agent-task selected. The matrix solution has all zeros, except for each agent-task pair selected, where it has its original value. +""" + +# ╔═╡ 41b83fdc-8d80-4791-83aa-ad1c678728e1 +""" + Hungarian_algorithm(mat) + +Solves a linear balanced assignment problem. + +Input: + - 'mat`: the cost matrix + +Outputs: + - `cost`: the resulting cost value + - `matrix solution`: the matrix with the selected agent-task as its original cost value and the rest zeros. +""" +function Hungarian_algorithm(mat) + matrix = copy(mat) + + #Step 1: subtract its internal minimum from every column and every row + matrix .-= minimum(matrix, dims=2) # from rows + matrix .-= minimum(matrix, dims=1) # from columns + + len = size(mat)[1] + num_zeros = 0 + + # Step 2: mark rows and columns that have the 0 entries + pos = [] + while num_zeros < len + pos, rows, cols = mark_matrix(matrix) + rows = reverse(rows) + num_zeros = length(rows) + length(cols) + # Step 3: if marked rows & columns is less than len, go to step 4. + if num_zeros < len + # Step 4: adjust the matrix + matrix = adjust_matrix(matrix, rows, cols) + end + end + # Calculate total cost and matrix solution + cost = 0 + matrix_solution = zeros(Int64, size(mat)[1], size(mat)[2]) + for i in 1:len + cost += mat[pos[i][1], pos[i][2]] + matrix_solution[pos[i][1], pos[i][2]] = mat[pos[i][1], pos[i][2]] + end + return cost, matrix_solution +end + +# ╔═╡ d8dd3d3f-2ed6-434c-8878-c3af69abc45b +md""" +### Example and solution of assignment problem + +Suppose we have 5 companies having different costs to realize 5 different tasks. You want to select a different company for each task in the way that we spend the minimum money. In order to find that combination, you just have to create a matrix with the cost each company asks for performing each activity. Here we have the following cost matrix with the companies as rows, the tasks as columns, and the values in thousand euros unit. +""" + +# ╔═╡ 4cbb69df-9573-4b9f-a03a-4d1e3c53b8ff +cost_matrix = [7 6 2 9 2; + 1 2 5 3 9; + 5 3 9 6 5; + 9 2 5 8 7; + 2 5 3 6 1] + +# ╔═╡ 8f59c095-4cab-4d2f-bfe5-85ab121070bd +md""" +After applying the function `Hungarian_algorithm`, you get the minimum cost (12000 €), +and the solution matrix, which shows the company-task combination to get that minimum cost. The first company will perform the third task for 2000 €, the second company the first task for 1000 €, etc. +""" + +# ╔═╡ 545a38bf-4edc-4c16-9f1a-0c26ff2e5f33 +Hungarian_algorithm(cost_matrix) + +# ╔═╡ 011e0f2f-ac2f-4ca6-94a9-912dee4b21ae +md""" +In case you want to maximize the values (e.g. instead of cost values you have benefit values), you just have to create the benefit matrix with negative values. This would solve an assigment problem maximizing the solution. +""" + +# ╔═╡ 0ad00f08-c712-4dde-892f-e48a8b7f02d4 +begin + benefit_matrix = copy(cost_matrix) + benefit_matrix .= - cost_matrix +end + +# ╔═╡ 50b784ac-64a1-41eb-ba01-fd1af65f6fe7 +md""" +After applying `Hungarian_agorithm` to the benefit matrix, you get a maximum benefit of 41000 € by selecting the first company performing the fourth task, the second company the fifth, etc. +""" + +# ╔═╡ b76c5a89-fb4c-4840-b5e7-ce816ba4b4fc +Hungarian_algorithm(benefit_matrix) + +# ╔═╡ dfd65b50-b0a7-4ad1-83d8-7bfa0bedfed7 +md""" +## References + +- H. W. Kuhn. The Hungarian Method for the Assignment Problem. (2010), from http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/Lec10-HungarianMethod-Kuhn.pdf +- Chapter 6 - Selected Topic in Mathematical Optimization course by Michiel Stock +- https://brilliant.org/wiki/hungarian-matching/ +- https://python.plainenglish.io/hungarian-algorithm-introduction-python-implementation-93e7c0890e15 + +""" + +# ╔═╡ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" + +[compat] +StatsBase = "~0.33.13" +""" + +# ╔═╡ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "4c26b4e9e91ca528ea212927326ece5918a04b47" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.11.2" + +[[ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.2" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.41.0" + +[[DataAPI]] +git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.9.0" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.11" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.6" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.2" + +[[IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "e5718a00af0ab9756305a0392832c8952c7426c1" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.6" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[StatsAPI]] +git-tree-sha1 = "0f2aa8e32d511f758a2ce49208181f7733a0936a" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.1.0" + +[[StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "2bb0cb32026a66037360606510fca5984ccc6b75" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.13" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +""" + +# ╔═╡ Cell order: +# ╠═e7e7c0e4-47e1-4856-9e71-11dfd12dfcd3 +# ╟─f3aa9d9c-75e1-4948-b7dd-7f0596486e83 +# ╟─8c0c6652-aa5d-4cb8-a4cf-018c80b380cf +# ╟─bf771d76-099c-449b-bebd-5201ed72ebb6 +# ╟─ed527906-da70-4186-a6db-da9906d72efa +# ╟─23020cd7-333d-4d97-aabb-c13614d57c65 +# ╠═8fa3a099-d325-4675-9c05-491f25ea73c8 +# ╟─571d7a9b-0c6b-466e-9761-3f4a4ada9e86 +# ╠═8d04677a-5f97-4e76-937c-e79f69c14788 +# ╟─05e77871-d6d1-4d7b-b368-89aeeed878a4 +# ╠═f94e0b59-80d0-4d26-bac3-d75c30e4d3ee +# ╟─0dd294c1-1b4e-44fb-990d-1d12cfc067c4 +# ╠═41b83fdc-8d80-4791-83aa-ad1c678728e1 +# ╟─d8dd3d3f-2ed6-434c-8878-c3af69abc45b +# ╠═4cbb69df-9573-4b9f-a03a-4d1e3c53b8ff +# ╟─8f59c095-4cab-4d2f-bfe5-85ab121070bd +# ╠═545a38bf-4edc-4c16-9f1a-0c26ff2e5f33 +# ╟─011e0f2f-ac2f-4ca6-94a9-912dee4b21ae +# ╠═0ad00f08-c712-4dde-892f-e48a8b7f02d4 +# ╟─50b784ac-64a1-41eb-ba01-fd1af65f6fe7 +# ╠═b76c5a89-fb4c-4840-b5e7-ce816ba4b4fc +# ╟─dfd65b50-b0a7-4ad1-83d8-7bfa0bedfed7 +# ╟─00000000-0000-0000-0000-000000000001 +# ╟─00000000-0000-0000-0000-000000000002 From 009e0e2748775a3898edaf6ba979b9fbe5648e4e Mon Sep 17 00:00:00 2001 From: triforment <91782749+triforment@users.noreply.github.com> Date: Sun, 30 Jan 2022 19:21:15 +0100 Subject: [PATCH 2/4] Delete Hungarian_algorithm.html --- Hungarian_algorithm.html | 75 ---------------------------------------- 1 file changed, 75 deletions(-) delete mode 100644 Hungarian_algorithm.html diff --git a/Hungarian_algorithm.html b/Hungarian_algorithm.html deleted file mode 100644 index 113e3be9..00000000 --- a/Hungarian_algorithm.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - ⚡ Pluto.jl ⚡ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 7882c00c3e0468d8e4bb28313e0a39cb09830a0f Mon Sep 17 00:00:00 2001 From: triforment <91782749+triforment@users.noreply.github.com> Date: Sun, 30 Jan 2022 19:21:34 +0100 Subject: [PATCH 3/4] Delete Hungarian_algorithm.jl --- Hungarian_algorithm.jl | 573 ----------------------------------------- 1 file changed, 573 deletions(-) delete mode 100644 Hungarian_algorithm.jl diff --git a/Hungarian_algorithm.jl b/Hungarian_algorithm.jl deleted file mode 100644 index f88e036f..00000000 --- a/Hungarian_algorithm.jl +++ /dev/null @@ -1,573 +0,0 @@ -### A Pluto.jl notebook ### -# v0.16.4 - -using Markdown -using InteractiveUtils - -# ╔═╡ e7e7c0e4-47e1-4856-9e71-11dfd12dfcd3 -using StatsBase - -# ╔═╡ 8c0c6652-aa5d-4cb8-a4cf-018c80b380cf -student_names = "Triana Forment"; - -# ╔═╡ f3aa9d9c-75e1-4948-b7dd-7f0596486e83 -md""" -# Project: Hungarian algorithm - -**STMO** - -2021-2022 - -project by $student_names - -## Introduction - -In this project, the Hungarian algorithm is implemented using an adjacency matrix. -This algorithm can be used to find the map that minimizes the transport cost, given two distributions and a cost function. For two discrete probability vectors, $$a ∈ Σ_n$$ and $$b ∈ Σ_m$$, we have a $$n * m$$ cost matrix $$C$$. It can be represented as a adjacency matrix, with elements in $$a$$ as rows and elements in $$b$$ as columns, and their weights as entries in the matrix. - -This algorithm solves what can be also called the assignment problem. An example can be, given $$n$$ agents and the money they ask for performing each task, finding which agent performs which task in order to minimize the cost of performing all $$m$$ tasks. -When there are the same number of agents than tasks, the the problem is called balanced assignment, otherwise is called unbalanced assignment. And if the total cost is the sum for each agent performing its task, the problem is called linear assignment. This implementation can be used to solve linear balanced assignment problems. -""" - -# ╔═╡ bf771d76-099c-449b-bebd-5201ed72ebb6 -md""" -# Implementation -""" - -# ╔═╡ ed527906-da70-4186-a6db-da9906d72efa -md""" -## Outline of the approach - -1. Subtract the smallest entry in each row from all the entries in the row, thus making the smallest entry in the row now equal to `0`. The same for each column. - -2. Mark the rows and columns which have 0 entries, such that the fewest lines possible are drawn. - -3. If there are $m$ marked rows and columns, an optimal assignment of zeros is possible and the algorithm is finished. The cost value and the optimal agent-task combination can be calculated. If the number of lines is less than $$m$$, then the optimal number of zeroes is not yet reached and the next step needs to be performed. - -4. Find the smallest entry not marked by any marked row and by any column. Subtract this entry from each row which is not marked, and then add it to each column which is marked. Then, go back to step 2. -""" - -# ╔═╡ 23020cd7-333d-4d97-aabb-c13614d57c65 -md""" -**`find_min_row`** is a function that gets the row with the fewest zeros. For that purpose, it needs as an input a binary matrix, having `0` if the original value after subtracting the smallest entry in each row from all the other entries in the row was `0`, and a `1` if it was different from `0`. It also needs a vector `zero_list` that will store the coordinates of the `0` in the row with fewest zeros. After the first finding, it reajusts the binary matrix so the whole row and column from the last coordinate stored is set to ones (`1`). This function is used in the next function `mark_matrix`. -""" - -# ╔═╡ 8fa3a099-d325-4675-9c05-491f25ea73c8 -""" - find_min_row(matrix_zero, zero_list) - -Inputs: - - `matrix_zero`: binary matrix - - `zero_list`: array to store the coordinates of the zeros in the row with fewest zeros. - -Outputs: - - `min_row`: tuple with the first element the number of zeros in the row with fewest zeros and the index of that row as second element - - `zero_list`: list of coordinates tuples of the zeros found -""" -function find_min_row(matrix_zero, zero_list) - min_row = [Inf, -1] - - for row in 1:size(matrix_zero)[1] - if 0 in matrix_zero[row, :] # Needs a 0 in the row to create a frequency dict - # And if the number of zeros < than the last min stored - if min_row[1] > countmap(matrix_zero[row,:])[0] - #stores the number of zeros and the row index - min_row = [countmap(matrix_zero[row,:])[0], row] - end - end - end - # Get the column index - zero_index = findall(x->x==0, matrix_zero[min_row[2],:])[1] - # Store tuple in zero_list the tuple of coordinates - append!(zero_list, [(min_row[2], zero_index)]) - # Mark the specific row and column as 1. - matrix_zero[min_row[2], :] .= 1 - matrix_zero[:, zero_index] .= 1 - return min_row, zero_list -end - -# ╔═╡ 571d7a9b-0c6b-466e-9761-3f4a4ada9e86 -md""" -**`mark_matrix`** needs as an input the matrix with the already subtracted the smallest entry in each row from all the other entries and it returns the `zero_list` and the marked row and column indexes. For that, it creates the binary matrix and calls the function `find_min_row`. It performs steps 2 and 3. -""" - -# ╔═╡ 8d04677a-5f97-4e76-937c-e79f69c14788 -""" - mark_matrix(mat) - -Perform steps 2 and 3: It marks the rows and columns that have the 0 entries such that the fewest lines possible are drawn. If there are "m" marked rows and columns, an optimal assignment solution can be found. - -Input: - - `mat` : cost matrix already modified by step 1 or an adjusted matrix by `adjust_matrix` - -Outputs: - - `zero_list` : coordinates of the zeros found by `find_min_row` - - `marked_rows`: array of marked rows - - `marked_cols`: array of marked columns -""" -function mark_matrix(mat) - - #Transform the matrix to binary matrix(0 = 0, others = 1) - binary_mat = copy(mat) - binary_mat[binary_mat .!= 0] .= 1 - binary_mat_copy = copy(binary_mat) - #Recording possible answer positions by zero_list - zero_list = [] - while 0 in binary_mat_copy - find_min_row(binary_mat_copy, zero_list) - end - #Recording the row indexes - zero_list_row = [] - for i in 1:length(zero_list) - append!(zero_list_row, zero_list[i][1]) - end - - # Get non marked rows - non_marked_row = (x->collect(x))(setdiff(Set(1:size(mat)[1]), Set(zero_list_row))) - - marked_cols = [] - flag = 0 - while flag == 0 # Enter in the loop until there's no more unmarked cols and rows - flag = 1 - for i in 1:length(non_marked_row) - row_array = binary_mat[non_marked_row[i], :] - for j in 1:length(row_array) - # Find unmarked 0 elements in the corresponding column - if row_array[j] == 0 && j ∉ marked_cols - # Store column index in "marked_cols" - append!(marked_cols, j) - flag = 0 - end - end - end - zero_rows = [t[1] for t in zero_list] - zero_cols = [t[2] for t in zero_list] - for i in 1:length(zero_list) - # If in "zero_list" coordinates there was a 0 marked in cols, - # but not in marked_rows, add its row index to "non_marked_row" - if zero_rows[i] ∉ non_marked_row && zero_cols[i] in marked_cols - append!(non_marked_row, zero_rows[i]) - flag = 0 - end - end - end - # Add those the indexes not stored in "non_marked_row" to "marked_rows" - marked_rows = (x->collect(x))(setdiff(Set(1:size(mat)[1]), Set(non_marked_row))) - return zero_list, marked_rows, marked_cols -end - -# ╔═╡ 05e77871-d6d1-4d7b-b368-89aeeed878a4 -md""" -**`adjust_matrix`** is a function needed when, after performing steps 1, 2 and 3, the number of marked rows plus the number of marked columns is not equal to the number of tasks/activities to perform by the agents. Then, it adjustes and returns the matrix as described in step 4. -""" - -# ╔═╡ f94e0b59-80d0-4d26-bac3-d75c30e4d3ee -""" - adjust_matrix(mat, marked_rows, marked_cols) - -Perform step 4: Adjust the matrix by finding the smallest entry not marked by any marked row and by any column. Subtract this entry from each row that isn’t marked, and then add it to each column that is marked. - -Inputs: - - `mat` : binary matrix created and modified by `mark_matrix` - - `marked_rows`: array of marked rows produced by `mark_matrix` - - `marked_cols`: array of marked columns produced by `mark_matrix` - -Output: - - `adjusted`: the adjusted matrix -""" -function adjust_matrix(mat, marked_rows, marked_cols) - adjusted = mat - min_values = [] - - # Find the minimum value for that is not in marked_rows and not in marked_cols - for row in 1:size(adjusted)[1] - if row ∉ marked_rows - for i in 1:length(adjusted[row,:]) - if i ∉ marked_cols - append!(min_values, adjusted[row,i]) - end - end - end - end - min_value = minimum(min_values) - # Substract that min value to all elements not in marked rows and columns - for row in 1:size(adjusted)[1] - if row ∉ marked_rows - for i in 1:length(adjusted[row,:]) - if i ∉ marked_cols - adjusted[row, i] = adjusted[row, i] - min_value - end - end - end - end - # Add the min value to elements that are in both marked row and columns - for row in marked_rows - for col in marked_cols - adjusted[row, col] = adjusted[row,col] + min_value - end - end - return adjusted -end - -# ╔═╡ 0dd294c1-1b4e-44fb-990d-1d12cfc067c4 -md""" -**`Hungarian_algorithm`** is the funtion that uses as an input the cost matrix and gives as an output the cost value and the matrix solution. This function performs steps 1 to 4, by calling the previous functions. Once the marked rows and columns sum the number of tasks to perform, it calculates the cost value by adding each cost value of the different agent-task selected. The matrix solution has all zeros, except for each agent-task pair selected, where it has its original value. -""" - -# ╔═╡ 41b83fdc-8d80-4791-83aa-ad1c678728e1 -""" - Hungarian_algorithm(mat) - -Solves a linear balanced assignment problem. - -Input: - - 'mat`: the cost matrix - -Outputs: - - `cost`: the resulting cost value - - `matrix solution`: the matrix with the selected agent-task as its original cost value and the rest zeros. -""" -function Hungarian_algorithm(mat) - matrix = copy(mat) - - #Step 1: subtract its internal minimum from every column and every row - matrix .-= minimum(matrix, dims=2) # from rows - matrix .-= minimum(matrix, dims=1) # from columns - - len = size(mat)[1] - num_zeros = 0 - - # Step 2: mark rows and columns that have the 0 entries - pos = [] - while num_zeros < len - pos, rows, cols = mark_matrix(matrix) - rows = reverse(rows) - num_zeros = length(rows) + length(cols) - # Step 3: if marked rows & columns is less than len, go to step 4. - if num_zeros < len - # Step 4: adjust the matrix - matrix = adjust_matrix(matrix, rows, cols) - end - end - # Calculate total cost and matrix solution - cost = 0 - matrix_solution = zeros(Int64, size(mat)[1], size(mat)[2]) - for i in 1:len - cost += mat[pos[i][1], pos[i][2]] - matrix_solution[pos[i][1], pos[i][2]] = mat[pos[i][1], pos[i][2]] - end - return cost, matrix_solution -end - -# ╔═╡ d8dd3d3f-2ed6-434c-8878-c3af69abc45b -md""" -### Example and solution of assignment problem - -Suppose we have 5 companies having different costs to realize 5 different tasks. You want to select a different company for each task in the way that we spend the minimum money. In order to find that combination, you just have to create a matrix with the cost each company asks for performing each activity. Here we have the following cost matrix with the companies as rows, the tasks as columns, and the values in thousand euros unit. -""" - -# ╔═╡ 4cbb69df-9573-4b9f-a03a-4d1e3c53b8ff -cost_matrix = [7 6 2 9 2; - 1 2 5 3 9; - 5 3 9 6 5; - 9 2 5 8 7; - 2 5 3 6 1] - -# ╔═╡ 8f59c095-4cab-4d2f-bfe5-85ab121070bd -md""" -After applying the function `Hungarian_algorithm`, you get the minimum cost (12000 €), -and the solution matrix, which shows the company-task combination to get that minimum cost. The first company will perform the third task for 2000 €, the second company the first task for 1000 €, etc. -""" - -# ╔═╡ 545a38bf-4edc-4c16-9f1a-0c26ff2e5f33 -Hungarian_algorithm(cost_matrix) - -# ╔═╡ 011e0f2f-ac2f-4ca6-94a9-912dee4b21ae -md""" -In case you want to maximize the values (e.g. instead of cost values you have benefit values), you just have to create the benefit matrix with negative values. This would solve an assigment problem maximizing the solution. -""" - -# ╔═╡ 0ad00f08-c712-4dde-892f-e48a8b7f02d4 -begin - benefit_matrix = copy(cost_matrix) - benefit_matrix .= - cost_matrix -end - -# ╔═╡ 50b784ac-64a1-41eb-ba01-fd1af65f6fe7 -md""" -After applying `Hungarian_agorithm` to the benefit matrix, you get a maximum benefit of 41000 € by selecting the first company performing the fourth task, the second company the fifth, etc. -""" - -# ╔═╡ b76c5a89-fb4c-4840-b5e7-ce816ba4b4fc -Hungarian_algorithm(benefit_matrix) - -# ╔═╡ dfd65b50-b0a7-4ad1-83d8-7bfa0bedfed7 -md""" -## References - -- H. W. Kuhn. The Hungarian Method for the Assignment Problem. (2010), from http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/Lec10-HungarianMethod-Kuhn.pdf -- Chapter 6 - Selected Topic in Mathematical Optimization course by Michiel Stock -- https://brilliant.org/wiki/hungarian-matching/ -- https://python.plainenglish.io/hungarian-algorithm-introduction-python-implementation-93e7c0890e15 - -""" - -# ╔═╡ 00000000-0000-0000-0000-000000000001 -PLUTO_PROJECT_TOML_CONTENTS = """ -[deps] -StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" - -[compat] -StatsBase = "~0.33.13" -""" - -# ╔═╡ 00000000-0000-0000-0000-000000000002 -PLUTO_MANIFEST_TOML_CONTENTS = """ -# This file is machine-generated - editing it directly is not advised - -[[ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" - -[[Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "4c26b4e9e91ca528ea212927326ece5918a04b47" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.11.2" - -[[ChangesOfVariables]] -deps = ["ChainRulesCore", "LinearAlgebra", "Test"] -git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1" -uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" -version = "0.1.2" - -[[Compat]] -deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.41.0" - -[[DataAPI]] -git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.9.0" - -[[DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.11" - -[[Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[DelimitedFiles]] -deps = ["Mmap"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.6" - -[[Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.2" - -[[IrrationalConstants]] -git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.1.1" - -[[LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" - -[[LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" - -[[LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[LinearAlgebra]] -deps = ["Libdl"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[LogExpFunctions]] -deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "e5718a00af0ab9756305a0392832c8952c7426c1" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.6" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" - -[[Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.0.2" - -[[Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" - -[[NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" - -[[OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" - -[[Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.0.1" - -[[SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[StatsAPI]] -git-tree-sha1 = "0f2aa8e32d511f758a2ce49208181f7733a0936a" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.1.0" - -[[StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "2bb0cb32026a66037360606510fca5984ccc6b75" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.33.13" - -[[TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" - -[[Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" - -[[Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" - -[[nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" - -[[p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -""" - -# ╔═╡ Cell order: -# ╠═e7e7c0e4-47e1-4856-9e71-11dfd12dfcd3 -# ╟─f3aa9d9c-75e1-4948-b7dd-7f0596486e83 -# ╟─8c0c6652-aa5d-4cb8-a4cf-018c80b380cf -# ╟─bf771d76-099c-449b-bebd-5201ed72ebb6 -# ╟─ed527906-da70-4186-a6db-da9906d72efa -# ╟─23020cd7-333d-4d97-aabb-c13614d57c65 -# ╠═8fa3a099-d325-4675-9c05-491f25ea73c8 -# ╟─571d7a9b-0c6b-466e-9761-3f4a4ada9e86 -# ╠═8d04677a-5f97-4e76-937c-e79f69c14788 -# ╟─05e77871-d6d1-4d7b-b368-89aeeed878a4 -# ╠═f94e0b59-80d0-4d26-bac3-d75c30e4d3ee -# ╟─0dd294c1-1b4e-44fb-990d-1d12cfc067c4 -# ╠═41b83fdc-8d80-4791-83aa-ad1c678728e1 -# ╟─d8dd3d3f-2ed6-434c-8878-c3af69abc45b -# ╠═4cbb69df-9573-4b9f-a03a-4d1e3c53b8ff -# ╟─8f59c095-4cab-4d2f-bfe5-85ab121070bd -# ╠═545a38bf-4edc-4c16-9f1a-0c26ff2e5f33 -# ╟─011e0f2f-ac2f-4ca6-94a9-912dee4b21ae -# ╠═0ad00f08-c712-4dde-892f-e48a8b7f02d4 -# ╟─50b784ac-64a1-41eb-ba01-fd1af65f6fe7 -# ╠═b76c5a89-fb4c-4840-b5e7-ce816ba4b4fc -# ╟─dfd65b50-b0a7-4ad1-83d8-7bfa0bedfed7 -# ╟─00000000-0000-0000-0000-000000000001 -# ╟─00000000-0000-0000-0000-000000000002 From fe6a8d9c47fb591e6444af10b1f7b3024ff997dd Mon Sep 17 00:00:00 2001 From: triforment <91782749+triforment@users.noreply.github.com> Date: Sun, 30 Jan 2022 19:29:09 +0100 Subject: [PATCH 4/4] Add files via upload --- Hungarian_algorithm.jl | 579 +++++++++++++++++++++ "\360\237\216\210 Hungarian_algorithm.pdf" | Bin 0 -> 131718 bytes 2 files changed, 579 insertions(+) create mode 100644 Hungarian_algorithm.jl create mode 100644 "\360\237\216\210 Hungarian_algorithm.pdf" diff --git a/Hungarian_algorithm.jl b/Hungarian_algorithm.jl new file mode 100644 index 00000000..256cff49 --- /dev/null +++ b/Hungarian_algorithm.jl @@ -0,0 +1,579 @@ +### A Pluto.jl notebook ### +# v0.16.4 + +using Markdown +using InteractiveUtils + +# ╔═╡ e7e7c0e4-47e1-4856-9e71-11dfd12dfcd3 +using StatsBase + +# ╔═╡ 8c0c6652-aa5d-4cb8-a4cf-018c80b380cf +student_names = "Triana Forment"; + +# ╔═╡ f3aa9d9c-75e1-4948-b7dd-7f0596486e83 +md""" +# Project: Hungarian algorithm + +**STMO** + +2021-2022 + +project by $student_names + +## Introduction + +Optimal transportation leads with two probability distributions and there is a cost function for moving elements from one distribution to the other distribution. And you have to find a transportation scheme to map one distribution into the other one. The original version of this problem of optimal transport dates back to Gaspard Monge in 1781. The Monge's problem has a discrete n number iron mines and n factories and, the cost is the distance between the mine and the factory. The solution is to find which mine suplies which factory, finding the minimum average distance transported. + +The Hungarian algorithm solves an assignment problem which can be considered as a special type of transportation problem in which the number of sources and sinks are equal. The capacity of each source as well as the requirement of each sink is taken as 1. In this project, the Hungarian algorithm is implemented using an adjacency matrix. +This algorithm can be used to find the map that minimizes the transport cost, given two distributions and a cost function. For two discrete probability vectors, $$\mathbf{a} ∈ Σ_n$$ and $$\mathbf{b} ∈ Σ_m$$, we have a $$n \times m$$ cost matrix $$C$$. It can be represented as a adjacency matrix, with elements in $$a$$ as rows and elements in $$b$$ as columns, and their weights as entries in the matrix. + +An example of an assignment problem, can be, given $$n$$ agents and the money they ask for performing each task, finding which agent performs which task in order to minimize the cost of performing all $$m$$ tasks. +When there are the same number of agents than tasks, the the problem is called balanced assignment, otherwise is called unbalanced assignment. And if the total cost is the sum for each agent performing its task, the problem is called linear assignment, because the cost function to be optimized as well as all the constraints contain only linear terms. This implementation can be used to solve linear balanced assignment problems. +""" + +# ╔═╡ bf771d76-099c-449b-bebd-5201ed72ebb6 +md""" +# Implementation +""" + +# ╔═╡ ed527906-da70-4186-a6db-da9906d72efa +md""" +## Outline of the approach + +1. Subtract the smallest entry in each row from all the entries in the row, thus making the smallest entry in the row now equal to `0`. The same for each column. + +2. Mark the rows and columns which have 0 entries, such that the fewest lines possible are drawn. + +3. If there are $m$ marked rows and columns, an optimal assignment of zeros is possible and the algorithm is finished. The cost value and the optimal agent-task combination can be calculated. If the number of lines is less than $$m$$, then the optimal number of zeroes is not yet reached and the next step needs to be performed. + +4. Find the smallest entry not marked by any marked row and by any column. Subtract this entry from each row which is not marked, and then add it to each column which is marked. Then, go back to step 2. +""" + +# ╔═╡ 6be9cccf-160a-4d05-88bd-9f5e33ad3d05 +md""" +**`Hungarian_algorithm`** is the funtion that uses as an input the cost matrix and gives as an output the cost value and the matrix solution. This function performs steps 1 to 4, by calling the previous functions. Once the marked rows and columns sum the number of tasks to perform, it calculates the cost value by adding each cost value of the different agent-task selected. The matrix solution has all zeros, except for each agent-task pair selected, where it has its original value. +""" + +# ╔═╡ 23020cd7-333d-4d97-aabb-c13614d57c65 +md""" +**`find_min_row`** is a function that gets the row with the fewest zeros. For that purpose, it needs as an input a boolean matrix, having `true` if the original value after subtracting the smallest entry in each row from all the other entries in the row was `0`, and a `false` if it was different from `0`. It also needs a vector `zero_list` that will store the coordinates of the `0` in the row with fewest zeros. After the first finding, it reajusts the boolean matrix so the whole row and column from the last coordinate stored is set to `false`. This function is used in the next function `mark_matrix`. +""" + +# ╔═╡ d7c22bc5-088d-4a74-a00d-5833430bf219 +""" + find_min_row(matrix_zero, zero_list) + +Inputs: + - `matrix_zero`: boolean matrix + - `zero_list`: array to store the coordinates of the zeros in the row with fewest zeros. + +Outputs: + - `min_row`: tuple with the first element the number of zeros in the row with fewest zeros and the index of that row as second element + - `zero_list`: list of coordinates tuples of the zeros found +""" +function find_min_row(matrix_zero, zero_list) + min_row = [Inf, -1] + + for row in 1:size(matrix_zero)[1] + #if true in matrix_zero[row, :] # Needs a 0 in the row + # If the number of zeros < than the last min stored + if sum(matrix_zero[row,:]) > 0 && min_row[1] > sum(matrix_zero[row,:]) + #stores the number of zeros and the row index + min_row = [sum(matrix_zero[row,:]), row] + end + end + # Get the column index + zero_index = findall(x->x==true, matrix_zero[min_row[2],:])[1] + # Store tuple in zero_list the tuple of coordinates + append!(zero_list, [(min_row[2], zero_index)]) + # Mark the specific row and column as false. + matrix_zero[min_row[2], :] .= false + matrix_zero[:, zero_index] .= false + return min_row, zero_list +end + +# ╔═╡ 4f82e659-944a-4ff2-aa77-db81187da001 +md""" +**`mark_matrix`** needs as an input the matrix with the already subtracted the smallest entry in each row from all the other entries and it returns the `zero_list` and the marked row and column indexes. For that, it creates the boolean matrix and calls the function `find_min_row`. It performs steps 2 and 3. +""" + +# ╔═╡ 8d04677a-5f97-4e76-937c-e79f69c14788 +""" + mark_matrix(mat) + +Perform steps 2 and 3: It marks the rows and columns that have the 0 entries such that the fewest lines possible are drawn. If there are "m" marked rows and columns, an optimal assignment solution can be found. + +Input: + - `mat` : cost matrix already modified by step 1 or an adjusted matrix by `adjust_matrix` + +Outputs: + - `zero_list` : coordinates of the zeros found by `find_min_row` + - `marked_rows`: array of marked rows + - `marked_cols`: array of marked columns +""" +function mark_matrix(mat) + + #Transform the matrix to boolean matrix(0 = true, others = false) + cur_mat = mat + boolean_mat = iszero.(mat) + boolean_mat_copy = copy(boolean_mat) + #Recording possible answer positions by zero_list + zero_list = [] + while true in boolean_mat_copy + find_min_row(boolean_mat_copy, zero_list) + end + #Recording the row indexes + zero_list_row = [] + for i in 1:length(zero_list) + append!(zero_list_row, zero_list[i][1]) + end + + # Get non marked rows + non_marked_row = (x->collect(x))(setdiff(Set(1:size(cur_mat)[1]), Set(zero_list_row))) + + marked_cols = [] + flag = 0 + while flag == 0 # Enter in the loop until there's no more unmarked cols and rows + flag = 1 + for i in 1:length(non_marked_row) + row_array = boolean_mat[non_marked_row[i], :] + for j in 1:length(row_array) + # Find unmarked 0 elements in the corresponding column + if row_array[j] == true && j ∉ marked_cols + # Store column index in "marked_cols" + append!(marked_cols, j) + flag = 0 + end + end + end + zero_rows = [t[1] for t in zero_list] + zero_cols = [t[2] for t in zero_list] + for i in 1:length(zero_list) + # If in "zero_list" coordinates there was a 0 marked in cols, + # but not in marked_rows, add its row index to "non_marked_row" + if zero_rows[i] ∉ non_marked_row && zero_cols[i] in marked_cols + append!(non_marked_row, zero_rows[i]) + flag = 0 + end + end + end + # Add those the indexes not stored in "non_marked_row" to "marked_rows" + marked_rows = (x->collect(x))(setdiff(Set(1:size(cur_mat)[1]), Set(non_marked_row))) + return zero_list, marked_rows, marked_cols +end + +# ╔═╡ 05e77871-d6d1-4d7b-b368-89aeeed878a4 +md""" +**`adjust_matrix`** is a function needed when, after performing steps 1, 2 and 3, the number of marked rows plus the number of marked columns is not equal to the number of tasks/activities to perform by the agents. Then, it adjustes and returns the matrix as described in step 4. +""" + +# ╔═╡ f94e0b59-80d0-4d26-bac3-d75c30e4d3ee +""" + adjust_matrix(mat, marked_rows, marked_cols) + +Perform step 4: Adjust the matrix by finding the smallest entry not marked by any marked row and by any column. Subtract this entry from each row that isn’t marked, and then add it to each column that is marked. + +Inputs: + - `mat` : boolean matrix created and modified by `mark_matrix` + - `marked_rows`: array of marked rows produced by `mark_matrix` + - `marked_cols`: array of marked columns produced by `mark_matrix` + +Output: + - `adjusted`: the adjusted matrix +""" +function adjust_matrix(mat, marked_rows, marked_cols) + adjusted = mat + min_values = [] + n = size(adjusted)[1] + + # Find the minimum value for that is not in marked_rows and not in marked_cols + for row in 1:n + if row ∉ marked_rows + for i in 1:n + if i ∉ marked_cols + append!(min_values, adjusted[row,i]) + end + end + end + end + min_value = minimum(min_values) + # Substract that min value to all elements not in marked rows and columns + for row in 1:n + if row ∉ marked_rows + for i in 1:n + if i ∉ marked_cols + adjusted[row, i] = adjusted[row, i] - min_value + end + end + end + end + # Add the min value to elements that are in both marked row and columns + for row in marked_rows + for col in marked_cols + adjusted[row, col] = adjusted[row,col] + min_value + end + end + return adjusted +end + +# ╔═╡ d4435d9e-1c3a-4d0d-80b3-8c0061336975 +""" + Hungarian_algorithm(mat) + +Solves a linear balanced assignment problem. + +Input: + - 'mat`: the cost matrix + +Outputs: + - `cost`: the resulting cost value + - `matrix solution`: the matrix with the selected agent-task as its original cost value and the rest zeros. +""" +function Hungarian_algorithm(mat) + num_rows = size(mat)[1] + num_cols = size(mat)[1] + @assert num_rows == num_cols throw(DimensionMismatch("It is not balanced. Number of sources and sinks need to match")) + + matrix = copy(mat) + #Step 1: subtract its internal minimum from every column and every row + matrix .-= minimum(matrix, dims=2) # from rows + matrix .-= minimum(matrix, dims=1) # from columns + + + num_zeros = 0 + + # Step 2: mark rows and columns that have the 0 entries + pos = [] + while num_zeros < num_rows + pos, rows, cols = mark_matrix(matrix) + rows = reverse(rows) + num_zeros = length(rows) + length(cols) + # Step 3: if marked rows & columns is less than num_rows, go to step 4. + if num_zeros < num_rows + # Step 4: adjust the matrix + matrix = adjust_matrix(matrix, rows, cols) + end + end + # Calculate total cost and matrix solution + cost = 0 + matrix_solution = zeros(Int64, size(mat)[1], size(mat)[2]) + for i in 1:num_rows + cost += mat[pos[i][1], pos[i][2]] + matrix_solution[pos[i][1], pos[i][2]] = mat[pos[i][1], pos[i][2]] + end + return cost, matrix_solution +end + +# ╔═╡ d8dd3d3f-2ed6-434c-8878-c3af69abc45b +md""" +### Example and solution of assignment problem + +Suppose we have 5 companies having different costs to realize 5 different tasks. You want to select a different company for each task in the way that we spend the minimum money. In order to find that combination, you just have to create a matrix with the cost each company asks for performing each activity. Here we have the following cost matrix with the companies as rows, the tasks as columns, and the values in thousand euros unit. +""" + +# ╔═╡ 4cbb69df-9573-4b9f-a03a-4d1e3c53b8ff +cost_matrix = [7 6 2 9 2; + 1 2 5 3 9; + 5 3 9 6 5; + 9 2 5 8 7; + 2 5 3 6 1] + +# ╔═╡ 8f59c095-4cab-4d2f-bfe5-85ab121070bd +md""" +After applying the function `Hungarian_algorithm`, you get the minimum cost (12000 €), +and the solution matrix, which shows the company-task combination to get that minimum cost. The first company will perform the third task for 2000 €, the second company the first task for 1000 €, etc. +""" + +# ╔═╡ 545a38bf-4edc-4c16-9f1a-0c26ff2e5f33 +Hungarian_algorithm(cost_matrix) + +# ╔═╡ 011e0f2f-ac2f-4ca6-94a9-912dee4b21ae +md""" +In case you want to maximize the values (e.g. instead of cost values you have benefit values), you just have to create the benefit matrix with negative values. This would solve an assigment problem maximizing the solution. +""" + +# ╔═╡ 0ad00f08-c712-4dde-892f-e48a8b7f02d4 +begin + benefit_matrix = copy(cost_matrix) + benefit_matrix .= - cost_matrix +end + +# ╔═╡ 50b784ac-64a1-41eb-ba01-fd1af65f6fe7 +md""" +After applying `Hungarian_agorithm` to the benefit matrix, you get a maximum benefit of 41000 € by selecting the first company performing the fourth task, the second company the fifth, etc. +""" + +# ╔═╡ b76c5a89-fb4c-4840-b5e7-ce816ba4b4fc +Hungarian_algorithm(benefit_matrix) + +# ╔═╡ dfd65b50-b0a7-4ad1-83d8-7bfa0bedfed7 +md""" +## References + +- H. W. Kuhn. The Hungarian Method for the Assignment Problem. (2010), from http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/Lec10-HungarianMethod-Kuhn.pdf +- M. Thorpe. Introduction to Optimal Transport. (2018), from https://www.math.cmu.edu/~mthorpe/OTNotes +- Chapter 6 - Selected Topic in Mathematical Optimization course by Michiel Stock +- https://brilliant.org/wiki/hungarian-matching/ +- https://python.plainenglish.io/hungarian-algorithm-introduction-python-implementation-93e7c0890e15 + +""" + +# ╔═╡ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" + +[compat] +StatsBase = "~0.33.13" +""" + +# ╔═╡ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "4c26b4e9e91ca528ea212927326ece5918a04b47" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.11.2" + +[[ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.2" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.41.0" + +[[DataAPI]] +git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.9.0" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.11" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.6" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.2" + +[[IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "e5718a00af0ab9756305a0392832c8952c7426c1" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.6" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[StatsAPI]] +git-tree-sha1 = "0f2aa8e32d511f758a2ce49208181f7733a0936a" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.1.0" + +[[StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "2bb0cb32026a66037360606510fca5984ccc6b75" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.13" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +""" + +# ╔═╡ Cell order: +# ╟─e7e7c0e4-47e1-4856-9e71-11dfd12dfcd3 +# ╟─f3aa9d9c-75e1-4948-b7dd-7f0596486e83 +# ╟─8c0c6652-aa5d-4cb8-a4cf-018c80b380cf +# ╟─bf771d76-099c-449b-bebd-5201ed72ebb6 +# ╟─ed527906-da70-4186-a6db-da9906d72efa +# ╟─6be9cccf-160a-4d05-88bd-9f5e33ad3d05 +# ╠═d4435d9e-1c3a-4d0d-80b3-8c0061336975 +# ╠═23020cd7-333d-4d97-aabb-c13614d57c65 +# ╠═d7c22bc5-088d-4a74-a00d-5833430bf219 +# ╠═4f82e659-944a-4ff2-aa77-db81187da001 +# ╠═8d04677a-5f97-4e76-937c-e79f69c14788 +# ╟─05e77871-d6d1-4d7b-b368-89aeeed878a4 +# ╠═f94e0b59-80d0-4d26-bac3-d75c30e4d3ee +# ╟─d8dd3d3f-2ed6-434c-8878-c3af69abc45b +# ╠═4cbb69df-9573-4b9f-a03a-4d1e3c53b8ff +# ╟─8f59c095-4cab-4d2f-bfe5-85ab121070bd +# ╠═545a38bf-4edc-4c16-9f1a-0c26ff2e5f33 +# ╟─011e0f2f-ac2f-4ca6-94a9-912dee4b21ae +# ╠═0ad00f08-c712-4dde-892f-e48a8b7f02d4 +# ╟─50b784ac-64a1-41eb-ba01-fd1af65f6fe7 +# ╠═b76c5a89-fb4c-4840-b5e7-ce816ba4b4fc +# ╟─dfd65b50-b0a7-4ad1-83d8-7bfa0bedfed7 +# ╟─00000000-0000-0000-0000-000000000001 +# ╟─00000000-0000-0000-0000-000000000002 diff --git "a/\360\237\216\210 Hungarian_algorithm.pdf" "b/\360\237\216\210 Hungarian_algorithm.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..97b97e4e3b6291fc666236af3bd6b93ad5ed6e94 GIT binary patch literal 131718 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%0Dm+y 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%0Deg{z6yr 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 I)!&T^0M=`=?f?J) literal 0 HcmV?d00001