/* (Hitchcock-Koopmans) Transportation problem in Picat. Given sum of rows and columns, calculate a minimum transportation matrix. Data and principal model from http://www.math.niu.edu/~rusin/known-math/99/transport This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. % import cp. % import sat. % 1:27.22 minutes import mip. % 0.01s main => go. go => NumRows = 5, Rows = 1..NumRows, NumCols = 5, Cols = 1..NumCols, MinVal = 0, % minimum value RR = [101, 200, 350, 1400, 600], CC = [1250, 200, 300, 401, 500], X = new_array(NumRows,NumCols), X :: MinVal..1000, % minimum value in the transportation matrix foreach(I in Rows, J in Cols) X[I,J] #>= MinVal end, Total #= sum([X[I,J] : I in Rows, J in Cols]), % sum rows foreach({Row,R} in zip(X.rows(), RR)) sum(Row.to_list()) #= R end, % sum cols foreach({Col,C} in zip(X.columns(), CC)) sum(Col.to_list()) #= C end, %% Inferred domains of Total and X % writeln(total=Total), % foreach(I in Rows) % foreach(J in Cols) % printf("%w ", X[I,J]) % end, % nl % end, Vars = X.to_list() ++ [Total], solve($[updown,min(Total),report(print_sol(X,Total))], Vars), print_sol(X,Total), nl. print_sol(X,Total) => writeln(total=Total), foreach(Row in X) writeln(Row.to_list()) end, nl.