From e5a324ff8544ab6e9eb9baacbb095bc3a3d423ca Mon Sep 17 00:00:00 2001 From: Vlad_kv Date: Thu, 8 Aug 2019 19:05:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=96=D0=B0=D0=B4=D0=BD=D0=B0=D1=8F=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20?= =?UTF-8?q?flatZinc=20=D1=80=D0=B5=D1=88=D0=B0=D1=82=D0=B5=D0=BB=D1=8F?= =?UTF-8?q?=D0=BC=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constraints/conversion_2_greedy_v2.mzn | 87 ++++++++++++---------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/src/constraints/conversion_2_greedy_v2.mzn b/src/constraints/conversion_2_greedy_v2.mzn index 23db4ca..8e640d3 100644 --- a/src/constraints/conversion_2_greedy_v2.mzn +++ b/src/constraints/conversion_2_greedy_v2.mzn @@ -59,8 +59,8 @@ array [0..n_moving_obj, 0..n_operations] of bool : moving_op_of_obj; array [0..n_locations, 0..n_moving_obj, 1..op_with_nominally_mooring_max_size] of 1..n_operations : op_with_nominally_mooring; % current_moored_obj соответствуе какому-либо реально пришвартованному объекту. - constraint forall (loc in 1..n_locations, t in 1..n_intervals, obj = current_moored_obj[loc, t] - where loc mod 2 = 0) ( + constraint forall (loc in 1..n_locations, t in 1..n_intervals where loc mod 2 = 0) ( + let {var 0..n_moving_obj : obj = current_moored_obj[loc, t]} in (obj != 0) -> ((m_obj_loc[obj, t] = loc) \/ (exists (op in [op_with_nominally_mooring[loc, obj, id] | id in 1..op_with_nominally_mooring_sizes[loc, obj]]) (op_status[op, t])) @@ -68,7 +68,8 @@ array [0..n_moving_obj, 0..n_operations] of bool : moving_op_of_obj; ); % Если объект пришвартован или швартуется, то current_moored_obj об это знает. - constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals, loc = m_obj_loc[obj, t]) ( + constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals) ( + let {var 0..n_locations : loc = m_obj_loc[obj, t]} in (loc mod 2 = 0) -> (current_moored_obj[loc, t] = obj) ); @@ -258,23 +259,24 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац % Наличие главных объектов на месте. constraint forall (op in 1..n_operations, - t in 1..n_intervals, - obj = main_obj_of_operation[op]) ( + t in 1..n_intervals) ( + let {1..n_moving_obj : obj = main_obj_of_operation[op]} in op_start[op, t] -> (m_obj_loc[obj, t] == main_obj_start_loc[op]) ); % Наличие бункеровщиков на месте. constraint forall (op in 1..n_operations, - t in 1..n_intervals, - obj = bunker_of_cargo_op[op] where obj != 0) ( - op_start[op, t] -> (m_obj_loc[obj, t] == bunker_start_loc[op]) + t in 1..n_intervals + where bunker_of_cargo_op[op] != 0) ( + op_start[op, t] -> (m_obj_loc[bunker_of_cargo_op[op], t] == bunker_start_loc[op]) ); % Непрерывность перемещения и швартовки. array [0..n_operations] of int : operations_duration; array [0..n_operations] of bool : is_continuous_operation; - constraint forall (i in 1..n_operations, len = operations_duration[i] where is_continuous_operation[i]) ( + constraint forall (i in 1..n_operations where is_continuous_operation[i]) ( + let {int : len = operations_duration[i]} in (forall (j in 1..(n_intervals - len + 1)) ( (op_start[i, j] == 1) -> ( (forall (k in 1..(len - 1)) (op_status[i, j + k])) @@ -397,34 +399,37 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац % Определение nominal_cargo_value % Операция грузообработки активна -> нужные номинальные значения согласованы с ней. constraint forall (op in 1..n_operations, - t in 1..(n_intervals + 1), - section_1 = operations_main_stor[op], - section_2 = operations_secondary_stor[op], - pos = operations_main_stor_no_in_secondary[op] - where pos != 0) ( - let {var int : total_vol = storage_used_volume[section_1, t - 1] + loading_op_delta_of_main_obj[op];} in + t in 1..(n_intervals + 1) + where operations_main_stor_no_in_secondary[op] != 0) ( + let { + var 1..n_all_storage_sections : section_1 = operations_main_stor[op]; + var 1..n_all_storage_sections : section_2 = operations_secondary_stor[op]; + var int : total_vol = storage_used_volume[section_1, t - 1] + loading_op_delta_of_main_obj[op]; + } in (op_status[op, t] /\ total_vol > storage_greedy_upper_limit[section_1]) -> ( nominal_cargo_value[op, t] = -(loading_op_delta_of_main_obj[op] - (total_vol - storage_greedy_upper_limit[section_1])) ) ); constraint forall (op in 1..n_operations, - t in 1..(n_intervals + 1), - section_1 = operations_main_stor[op], - section_2 = operations_secondary_stor[op], - pos = operations_main_stor_no_in_secondary[op] - where pos != 0) ( - let {var int : total_vol = storage_used_volume[section_1, t - 1] + loading_op_delta_of_main_obj[op];} in + t in 1..(n_intervals + 1) + where operations_main_stor_no_in_secondary[op] != 0) ( + let { + var 1..n_all_storage_sections : section_1 = operations_main_stor[op]; + var 1..n_all_storage_sections : section_2 = operations_secondary_stor[op]; + var int : total_vol = storage_used_volume[section_1, t - 1] + loading_op_delta_of_main_obj[op]; + } in (op_status[op, t] /\ total_vol < storage_greedy_lower_limit[section_1]) -> ( nominal_cargo_value[op, t] = -(loading_op_delta_of_main_obj[op] - (total_vol - storage_greedy_lower_limit[section_1])) ) ); constraint forall (op in 1..n_operations, - t in 1..(n_intervals + 1), - section_1 = operations_main_stor[op], - section_2 = operations_secondary_stor[op], - pos = operations_main_stor_no_in_secondary[op] - where pos != 0) ( - let {var int : total_vol = storage_used_volume[section_1, t - 1] + loading_op_delta_of_main_obj[op];} in + t in 1..(n_intervals + 1) + where operations_main_stor_no_in_secondary[op] != 0) ( + let { + var 1..n_all_storage_sections : section_1 = operations_main_stor[op]; + var 1..n_all_storage_sections : section_2 = operations_secondary_stor[op]; + var int : total_vol = storage_used_volume[section_1, t - 1] + loading_op_delta_of_main_obj[op]; + } in (op_status[op, t] /\ (total_vol >= storage_greedy_lower_limit[section_1]) /\ (total_vol <= storage_greedy_upper_limit[section_1])) -> ( nominal_cargo_value[op, t] = -loading_op_delta_of_main_obj[op] @@ -452,8 +457,8 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ); % Нецелая операция. % Переполнение за нижнюю границу. - constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1), - section = operations_secondary_stor[op]) ( % Нецелая операция. + constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1)) ( % Нецелая операция. + let {1..n_all_storage_sections : section = operations_secondary_stor[op]} in ( (current_partial_cargo_op[section, t] == op) /\ (nominal_cargo_value[op, t] < 0) /\ (nominal_incoming_sum[section, t] + storage_used_volume[section, t - 1] < storage_greedy_lower_limit[section]) @@ -465,8 +470,8 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ) ); % Переполнение за верхнюю границу. - constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1), - section = operations_secondary_stor[op]) ( % Нецелая операция. + constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1)) ( % Нецелая операция. + let {1..n_all_storage_sections : section = operations_secondary_stor[op]} in ( (current_partial_cargo_op[section, t] == op) /\ (nominal_cargo_value[op, t] > 0) /\ (nominal_incoming_sum[section, t] + storage_used_volume[section, t - 1] > storage_greedy_upper_limit[section]) @@ -478,16 +483,16 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ) ); % Переполнения нет. - constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1), - section = operations_secondary_stor[op]) ( % Нецелая операция. + constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1)) ( % Нецелая операция. + let {1..n_all_storage_sections : section = operations_secondary_stor[op]} in ( (current_partial_cargo_op[section, t] == op) /\ (nominal_incoming_sum[section, t] + storage_used_volume[section, t - 1] <= storage_greedy_upper_limit[section]) /\ (nominal_incoming_sum[section, t] + storage_used_volume[section, t - 1] >= storage_greedy_lower_limit[section]) ) -> (real_cargo_value[op, t] = nominal_cargo_value[op, t]) ); % Неустранимое переполнение за нижнюю границу. - constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1), - section = operations_secondary_stor[op]) ( % Нецелая операция. + constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1)) ( % Нецелая операция. + let {1..n_all_storage_sections : section = operations_secondary_stor[op]} in ( (current_partial_cargo_op[section, t] == op) /\ (nominal_cargo_value[op, t] <= 0) /\ (nominal_incoming_sum[section, t] + storage_used_volume[section, t - 1] < storage_greedy_lower_limit[section]) @@ -496,8 +501,8 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ) -> (real_cargo_value[op, t] = 0) ); % Неустранимое переполнение за верхнюю границу. - constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1), - section = operations_secondary_stor[op]) ( % Нецелая операция. + constraint forall (op in 1..n_operations, t in 1..(n_intervals + 1)) ( % Нецелая операция. + let {1..n_all_storage_sections : section = operations_secondary_stor[op]} in ( (current_partial_cargo_op[section, t] == op) /\ (nominal_cargo_value[op, t] >= 0) /\ (nominal_incoming_sum[section, t] + storage_used_volume[section, t - 1] > storage_greedy_upper_limit[section]) @@ -546,11 +551,11 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац array [0..n_operations, 0..n_intervals] of bool : is_fixed; array [0..n_moving_obj, 0..(n_intervals + 1)] of bool : is_obj_involved_in_fixed_op; - constraint forall (no in 1..n_fixed_op, op = fixed_op[no]) ( + constraint forall (no in 1..n_fixed_op) ( forall (t in fixed_op_start[no]..fixed_op_end[no]) ( - (op_status[op, t]) - /\ (forall (obj in fixed_op_resources[no]) (participation_as_resource[obj, t] = op)) - /\ (real_cargo_value[op, t] = -fixed_op_intensity[no]) + (op_status[fixed_op[no], t]) + /\ (forall (obj in fixed_op_resources[no]) (participation_as_resource[obj, t] = fixed_op[no])) + /\ (real_cargo_value[fixed_op[no], t] = -fixed_op_intensity[no]) ) ); -- GitLab