Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
3.1 kB · 100 lines
at develop
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101% RUNS ON mzn20_fd% RUNS ON mzn-fzn_fd% RUNS ON mzn20_mip%-----------------------------------------------------------------------------%% Radiation problem, Minizinc version%% Sebastian Brand% 05/2007%-----------------------------------------------------------------------------%%-----------------------------------------------------------------------------%% Instances%-----------------------------------------------------------------------------%m = 5; % Rowsn = 5; % ColumnsIntensity = [| % g5c 7, 2, 14, 8, 9 | 13, 4, 1, 2, 9 | 5, 12, 2, 11, 9 | 10, 2, 4, 9, 7 | 10, 2, 8, 11, 1 |];%-----------------------------------------------------------------------------%% Parameters%-----------------------------------------------------------------------------%int: m; % Rowsint: n; % Columnsset of int: Rows = 1..m;set of int: Columns = 1..n; % Intensity matrixarray[Rows, Columns] of int: Intensity;set of int: BTimes = 1..Bt_max;int: Bt_max = max(i in Rows, j in Columns) (Intensity[i,j]);int: Ints_sum = sum(i in Rows, j in Columns) (Intensity[i,j]);%-----------------------------------------------------------------------------%% Variables%-----------------------------------------------------------------------------% % Total beam-on timevar 0..Ints_sum: Beamtime; % Number of shape matricesvar 0..m*n: K; % N[b] is the number of shape matrices with associated beam-on time barray[BTimes] of var 0..m*n: N; % Q[i,j,b] is the number of shape matrices with associated beam-on time % b that expose cell (i,j)array[Rows, Columns, BTimes] of var 0..m*n: Q;%-----------------------------------------------------------------------------%% Constraints%-----------------------------------------------------------------------------% % For FD/LP hybrid solving, all these should go the LP solver % (with a suitable linearisation of the 'max' expressions).constraint Beamtime = sum(b in BTimes) (b * N[b]) /\ K = sum(b in BTimes) (N[b]) /\ forall(i in Rows, j in Columns) ( Intensity[i,j] = sum([b * Q[i,j,b] | b in BTimes]) ) /\ forall(i in Rows, b in BTimes) ( upper_bound_on_increments(N[b], [Q[i,j,b] | j in Columns]) );predicate upper_bound_on_increments(var int: N_b, array[int] of var int: L) = N_b >= L[1] + sum([ max(L[j] - L[j-1], 0) | j in 2..n ]);%-----------------------------------------------------------------------------%% Objective%-----------------------------------------------------------------------------%solve :: int_search( [Beamtime] ++ N ++ [ Q[i,j,b] | i in Rows, j in Columns, b in BTimes ], input_order, indomain_split, complete) minimize (ub(K) + 1) * Beamtime + K; % really: (Beamtime, K), i.e. in lexicographic order%-----------------------------------------------------------------------------%output ["radiation:\n", "B / K = ", show(Beamtime), " / ", show(K), "\n", % "N = ", show(N), "\n"];%-----------------------------------------------------------------------------%%-----------------------------------------------------------------------------%