Sunday, April 16, 2017

Puzzlor | Any Port | Hungarian Algorithm

- no title specified
                      

Puzzlor: Any Port In A Storm

 

http://puzzlor.com/2017-02_PortInAStorm.html

 
  

Solved with the Hungarian Algorithm

 

https://www.youtube.com/watch?v=dQDZNHwuuOY

 
                      

20 Boats must be assigned to 20 Dock spaces

 
                      

Distance Matrix

               
 

Dock 1

 

Dock2

Dock 3

 
                      
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

Boat

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

Group

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

1

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Boat

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Group

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

2

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Boat

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Group

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

3

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
                      
                      

The minimum value in each row is 1.  Subtract the row minimum from every entry.

 
                      
 

Dock 1

 

Dock2

Dock 3

 
                      
 

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Boat

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Group

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

1

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 

Boat

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 

Group

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 

2

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 
 

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 

Boat

2

2

2

2

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 

Group

2

2

2

2

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 

3

2

2

2

2

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

0

 
                      
                      

The column minimum is now zero for Dock 1 and Dock 3, and for Dock 2 the column minimum is 1.

 

Subtract the column minimum from every entry.

 
                      
 

Dock 1

 

Dock2

Dock 3

 
                      
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

Boat

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

Group

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

1

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Boat

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Group

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

2

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Boat

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Group

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

3

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
                      
                      

The algorithm now requires that a minimum number of rows and columns be selected to cover the zero entries.

 

The selected rows and columns are marked with X's below.

 
                      
                      
 

Dock 1

 

Dock2

Dock 3

 
                      
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

Boat

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

Group

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

1

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

0

0

0

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 
 

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

Boat

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

Group

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

2

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

 

1

1

1

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

Boat

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

Group

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

3

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

X

 

X

X

X

X

                 
                      
                      

The zero entries can be covered with 16 X's, so an additional step is required.

 

The minimum value of the non-covered entries (Blue – upper right) is 1.

This value is subtracted from each of the non-covered entries.

 

This value is added to the entries where the selected rows and columns overlap (Orange – lower left).

 
                      
                      
 

Dock 1

 

Dock2

Dock 3

 
                      
 

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Boat

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Group

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Boat

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Group

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

2

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

2

2

2

2

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

3

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

3

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Boat

3

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

Group

3

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

3

3

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

3

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
 

3

3

3

3

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 
                      
                      

Now the minimum rows and/or columns required to cover all the zeros is 20, so we are done!

 

Any of the zero entries can be selected to assign a boat to a dock space and result in the minimum total distance.

 

There are many alternative solutions available.  For convenience I will choose the zeros along the diagonal.

 

The assignment is shown on the original distance matrix here:

 
                      
                      
 

Dock 1

 

Dock2

Dock 3

 
                      
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

Boat

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

Group

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

1

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Boat

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Group

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

2

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Boat

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Group

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

3

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
                      
                      

This assignment has total distance traveled by all boats = 31 km.

 

Here is another optimal assignment which does not require any of the boats to travel 3km.

 
                      
                      
 

Dock 1

 

Dock2

Dock 3

 
                      
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

Boat

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

Group

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 

1

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

1

1

1

1

3

3

3

3

3

3

3

2

2

2

2

2

2

2

2

2

 
 

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Boat

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Group

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

2

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

2

2

2

2

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Boat

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

Group

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 

3

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
 

3

3

3

3

2

2

2

2

2

2

2

1

1

1

1

1

1

1

1

1

 
                      
                      

This assignment also has total distance traveled = 31km.