From 659aa53d8a59bc3155ec3775e1a00299a56ac9b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B8=D1=81=D0=B5=D0=BB=D1=91=D0=B2=20=D0=92=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D0=B8=D1=81=D0=BB=D0=B0=D0=B2?= Date: Fri, 26 Apr 2019 14:32:47 +0300 Subject: [PATCH] =?UTF-8?q?current=5Fmoving=5Foperation=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BE=D0=B7=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=20=D0=BE=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constraints/conversion_2.mzn | 33 ++++++++++++++------------------ src/inport/ConversionUtil.java | 22 ++++++++++++++++----- src/inport/Main.java | 14 -------------- 3 files changed, 31 insertions(+), 38 deletions(-) diff --git a/src/constraints/conversion_2.mzn b/src/constraints/conversion_2.mzn index 125f5df..adf4e50 100644 --- a/src/constraints/conversion_2.mzn +++ b/src/constraints/conversion_2.mzn @@ -9,31 +9,27 @@ array [1..n_operations, 0..(n_intervals + 1)] of var bool : op_status; array [1..n_operations, 0..(n_intervals + 1)] of var bool : op_start; array [1..n_operations, 0..(n_intervals + 1)] of var bool : op_fin; -int : moving_op_of_obj_max_size; -array [1..n_moving_obj] of 0..moving_op_of_obj_max_size : moving_op_of_obj_sizes; -array [1..n_moving_obj, 0..moving_op_of_obj_max_size] of 1..n_operations : moving_op_of_obj; % Операции перемещения затрагивающие данный объект. +array [1..n_moving_obj, 1..n_operations] of bool : moving_op_of_obj; % Определение current_moving_operation. % Текущая операция операция перемещения, в которой задействован данный объект. - array [1..n_moving_obj, 0..(n_intervals + 1)] of var 0..moving_op_of_obj_max_size : current_moving_operation; + array [1..n_moving_obj, 0..(n_intervals + 1)] of var 0..n_operations : current_moving_operation; % Текущая операция лежит в множестве тех, которые затрагивают данный объект. constraint forall (obj in 1..n_moving_obj, t in 0..(n_intervals + 1)) ( - current_moving_operation[obj, t] <= moving_op_of_obj_sizes[obj] + (current_moving_operation[obj, t] != 0) -> moving_op_of_obj[obj, current_moving_operation[obj, t]] ); % Если операция, затрагивающая данный объект в качестве главного, выполняется - то именно она текущая операция перемещения для этого объекта. constraint forall (op in 1..n_operations, t in 0..(n_intervals + 1), obj = main_obj_of_operation[op] where is_moving_operation[op]) ( - op_status[op, t] -> ((current_moving_operation[obj, t] != 0) /\ - (moving_op_of_obj[obj, current_moving_operation[obj, t]] = op)) + op_status[op, t] -> (current_moving_operation[obj, t] = op) ); % TODO упростить в conversion_1 % Связь current_moving_operation c op_status. constraint forall (obj in 1..n_moving_obj, t in 0..(n_intervals + 1)) ( - (current_moving_operation[obj, t] != 0) - -> (op_status[moving_op_of_obj[obj, current_moving_operation[obj, t]], t]) + (current_moving_operation[obj, t] != 0) -> (op_status[current_moving_operation[obj, t], t]) ); % Ограничение на количество пришвартованных кораблей. @@ -90,18 +86,18 @@ array [1..n_operations] of 1..n_locations : operations_destination; % Локац constraint forall (obj in 1..n_moving_obj, t in 2..(n_intervals + 1)) ( ((current_moving_operation[obj, t - 1] != current_moving_operation[obj, t - 2]) /\ (current_moving_operation[obj, t - 1] != 0) /\ - ((obj = main_obj_of_operation[moving_op_of_obj[obj, current_moving_operation[obj, t - 1]]]) + ((obj = main_obj_of_operation[current_moving_operation[obj, t - 1]]) \/ - (not is_mooring_op[moving_op_of_obj[obj, current_moving_operation[obj, t - 1]]]) + (not is_mooring_op[current_moving_operation[obj, t - 1]]) ) - ) -> (m_obj_loc[obj, t] = operations_destination[moving_op_of_obj[obj, current_moving_operation[obj, t - 1]]]) + ) -> (m_obj_loc[obj, t] = operations_destination[current_moving_operation[obj, t - 1]]) ); constraint forall (obj in 1..n_moving_obj, t in 2..(n_intervals + 1)) ( ((current_moving_operation[obj, t - 1] != current_moving_operation[obj, t - 2]) /\ (current_moving_operation[obj, t - 1] != 0) /\ - ((obj != main_obj_of_operation[moving_op_of_obj[obj, current_moving_operation[obj, t - 1]]]) + ((obj != main_obj_of_operation[current_moving_operation[obj, t - 1]]) /\ - ( is_mooring_op[moving_op_of_obj[obj, current_moving_operation[obj, t - 1]]]) + ( is_mooring_op[current_moving_operation[obj, t - 1]]) ) ) -> (m_obj_loc[obj, t] = m_obj_loc[obj, t - 1]) ); @@ -156,9 +152,9 @@ array [1..n_operations] of 1..n_locations : operations_destination; % Локац % { Если объект движется, и движется как ресурс, то participation_as_resource должен отображать этот факт. } constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals) ( (current_moving_operation[obj, t] != 0) -> ( - (moving_op_of_obj[obj, current_moving_operation[obj, t]] in operations_that_used_obj_as_resource[obj]) + (current_moving_operation[obj, t] in operations_that_used_obj_as_resource[obj]) -> - (participation_as_resource[obj, t] = moving_op_of_obj[obj, current_moving_operation[obj, t]]) + (participation_as_resource[obj, t] = current_moving_operation[obj, t]) ) ); @@ -168,7 +164,7 @@ array [1..n_operations] of 1..n_locations : operations_destination; % Локац (is_moving_operation[participation_as_resource[obj, t]]) -> ( (current_moving_operation[obj, t] != 0) /\ - (participation_as_resource[obj, t] = moving_op_of_obj[obj, current_moving_operation[obj, t]]) + (participation_as_resource[obj, t] = current_moving_operation[obj, t]) ) ) ); @@ -350,7 +346,7 @@ array [1..n_operations] of 1..n_locations : operations_destination; % Локац constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals) ( is_obj_involved_in_cargo_op[obj, t] = ( - ((participation_as_resource[obj, t] != 0) /\ (current_moving_operation[obj, t] = 1)) % В качестве ресурса. + ((participation_as_resource[obj, t] != 0) /\ (current_moving_operation[obj, t] = 0)) % В качестве ресурса. \/ exists (op in 1..n_operations where main_obj_of_operation[op] = obj) ( % В качестве главного объекта. op_status[op, t] @@ -420,7 +416,6 @@ output [show(sum(is_not_terminated)), "\n", "participation_as_resource = ", show(participation_as_resource), "\n\n", "real_current_moving_operation = ", show(current_moving_operation), "\n\n", - "moving_op_of_obj {", show(moving_op_of_obj_max_size + 1), "}= ", show(moving_op_of_obj), "\n\n", /* "is_op_possible {", show(n_intervals), "} = ", show(is_op_possible), "\n\n", "debug_1 {", show(n_intervals), "} = ", show(debug_1), "\n\n", diff --git a/src/inport/ConversionUtil.java b/src/inport/ConversionUtil.java index de26307..aa4e9ee 100644 --- a/src/inport/ConversionUtil.java +++ b/src/inport/ConversionUtil.java @@ -197,6 +197,10 @@ public class ConversionUtil { return res.toString(); } + static private String arrayToStringAsSet(ArrayList a) { + return setToString(new TreeSet<>(a)); + } + static private ArrayList integerArray(int size, int initVal) { ArrayList res = new ArrayList<>(); for (int i = 0; i < size; i++) { @@ -331,10 +335,6 @@ public class ConversionUtil { private ArrayList mainObjOfOperation; private ArrayList isMooringOp; - public ArrayList> getMovingOpOfObj() { - return movingOpOfObj; - } - private ArrayList> objectsOfType; Task(TaskCase task, String fileName) { @@ -879,7 +879,19 @@ public class ConversionUtil { if (! isV1) { writeArray(writer, "is_mooring_op", isMooringOp); writeArray(writer, "main_obj_of_operation", mainObjOfOperation, (Integer val) -> val + 1); - writeArrayOfSetAs2DArray(writer, "moving_op_of_obj", movingOpOfObj, true, true); + + ArrayList> locMovingOpOfObj = new ArrayList<>(); + for (ArrayList operations : movingOpOfObj) { + ArrayList lOperations = new ArrayList<>(); + for (int i = 0; i < operationTemplates.size(); i++) { + lOperations.add(false); + } + for (Integer op : operations) { + lOperations.set(op - 1, true); + } + locMovingOpOfObj.add(lOperations); + } + locWrite2DArray(writer, "moving_op_of_obj", locMovingOpOfObj, Objects::toString); } else { writeArrayOfSetAs2DArray(writer, "moving_op_of_obj", movingOpOfObj, true, false); } diff --git a/src/inport/Main.java b/src/inport/Main.java index 1259478..46a6c26 100644 --- a/src/inport/Main.java +++ b/src/inport/Main.java @@ -116,7 +116,6 @@ public class Main { } case "testing" : test_2(); - test_1(); break; case "testing_2": test_2_0(); @@ -218,19 +217,6 @@ public class Main { elements.add(val.trim()); } - if (name.equals("current_moving_operation")) { - ArrayList> movingOpOfObj = t.getMovingOpOfObj(); - for (int i = 0; i < elements.size(); i += arrayFirstDim) { - for (int j = 0; j < arrayFirstDim; j++) { - int val = Integer.valueOf(elements.get(i + j)); - if (val != 0) { - elements.set(i + j, Integer.toString(movingOpOfObj.get(i / arrayFirstDim).get(val - 1))); - } - } - } - name = name + " *"; - } - { // bool to int for (int i = 0; i < elements.size(); i++) { if (elements.get(i).equals("true")) { -- GitLab