From 7758934003ce54fc3ec3ff8e2dd04984919a3d62 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: Mon, 13 May 2019 23:01:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D1=81=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BE=D0=B2=D1=8B=D1=85=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=B2=20=D0=BE=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/inport/ConversionUtil.java | 43 ++++++++++++++++++++++++++++++---- src/inport/Main.java | 29 +++++++++++++++++++++-- src/inport/Operation.java | 12 +++++++++- src/inport/TaskCase.java | 4 ++++ src/inport/Testing.java | 17 +++++++++++--- tests/with_typing/Bunkers.tipp | 2 +- 6 files changed, 96 insertions(+), 11 deletions(-) diff --git a/src/inport/ConversionUtil.java b/src/inport/ConversionUtil.java index d1e6e11..4f8ee98 100644 --- a/src/inport/ConversionUtil.java +++ b/src/inport/ConversionUtil.java @@ -1328,7 +1328,7 @@ public class ConversionUtil { return Integer.compare(opId, o.opId); } if (! bunkerId.isPresent()) { - return -1; + return (! o.bunkerId.isPresent()) ? 0 : -1; } if (! o.bunkerId.isPresent()) { return 1; @@ -1646,6 +1646,24 @@ public class ConversionUtil { templates = Task.renumberOperations(taskCase); } + ArrayList> cargoOpIntensity; + if (arrays.containsKey("cargo_op_intensity")) { + cargoOpIntensity = arrays.get("cargo_op_intensity"); + } else { + cargoOpIntensity = new ArrayList<>(); + for (int opNo = 0; opNo < opStatus.size(); opNo++) { + cargoOpIntensity.add(new ArrayList<>()); + for (String val : opStatus.get(opNo)) { + if (val.equals("true") && (templates.get(opNo - 1) instanceof LoadingTemplate)) { + LoadingTemplate op = (LoadingTemplate)templates.get(opNo - 1); + cargoOpIntensity.get(opNo).add(Integer.toString((int)Math.ceil(op.getIntensity()))); + } else { + cargoOpIntensity.get(opNo).add("0"); + } + } + } + } + Map operationById = new TreeMap<>(); for (OperationTemplate operation : taskCase.getTemplates()) { operationById.put(operation.getId(), operation); @@ -1669,12 +1687,25 @@ public class ConversionUtil { for (int opNo = 1; opNo < opStatus.size(); opNo++) { int duration = 0; - int t = 0; + int t = 1; boolean lastFixation = false; while (t < opStatus.get(opNo).size()) { - if ((opStatus.get(opNo).get(t).equals("true") && (lastFixation != isFixed.get(opNo).get(t)) && (duration != 0)) - || (opStatus.get(opNo).get(t).equals("false") && (duration != 0))) { // Добавляем новую операцию. + boolean isOpLogicallyInterrupted = false; + if (opStatus.get(opNo).get(t).equals("true") && + (lastFixation != isFixed.get(opNo).get(t)) && + (duration != 0)) { // У операции изменилась фиксация. + isOpLogicallyInterrupted = true; + } + if (opStatus.get(opNo).get(t).equals("false") && (duration != 0)) { // Операция просто закончилась. + isOpLogicallyInterrupted = true; + } + if ((! cargoOpIntensity.get(opNo).get(t - 1).equals(cargoOpIntensity.get(opNo).get(t))) && + (duration != 0)) { // Изменилась интенсивность погрузки. + isOpLogicallyInterrupted = true; + } + + if (isOpLogicallyInterrupted) { // Добавляем новую операцию. Operation op = new Operation(); op.setStart(t - duration - 1); op.setDuration(duration); @@ -1705,6 +1736,10 @@ public class ConversionUtil { } } + if (! cargoOpIntensity.get(opNo).get(t - 1).equals("0")) { + op.setIntensity(Optional.of(Integer.valueOf(cargoOpIntensity.get(opNo).get(t - 1)))); + } + op.setFixation(true); if (! oldSolution.contains(op.toString())) { op.setFixation(false); diff --git a/src/inport/Main.java b/src/inport/Main.java index bb59bf2..9976781 100644 --- a/src/inport/Main.java +++ b/src/inport/Main.java @@ -113,11 +113,36 @@ public class Main { break; } + case "debug 2" : { + String fileName = "experiment/in.ipp"; + String solverResults = "temp_data/solver_results.txt"; + String output = "experiment/debug_info.txt"; + + TaskCase task = new TaskCase(); + try { + task.deserialize(fileName); + } catch (IOException e) { + System.out.println(e.getMessage()); + break; + } + String error = solveTaskWithPartialCargoOp(task); + + if (!error.isEmpty()) { + System.out.println("Error : " + error); + break; + } else { + task.serialize(fileName); + } + + debugInfo(task, solverResults, output); + + break; + } case "testing" : test_2(); break; - case "testing_2": - test_2_0(); + case "testing_with_partial_op": + testWithPartialOp(); break; case "testing_exp": test_2_exp(); diff --git a/src/inport/Operation.java b/src/inport/Operation.java index c04c7f4..536d7f4 100644 --- a/src/inport/Operation.java +++ b/src/inport/Operation.java @@ -19,8 +19,16 @@ public class Operation { private double duration; private MovingObject executor; private Optional bunker = Optional.empty(); + private Optional intensity = Optional.empty(); private List resources; + public void setIntensity(Optional intensity) { + this.intensity = intensity; + } + public Optional getIntensity() { + return intensity; + } + public Optional getBunker() { return bunker; } @@ -130,7 +138,9 @@ public class Operation { } sb.append(obj.getId()); } - sb.append("])"); + sb.append("]"); + sb.append(intensity.map(i -> " " + i).orElse("")); + sb.append(")"); return sb.toString(); } } diff --git a/src/inport/TaskCase.java b/src/inport/TaskCase.java index e9e9066..b0716b0 100644 --- a/src/inport/TaskCase.java +++ b/src/inport/TaskCase.java @@ -718,6 +718,10 @@ public class TaskCase { op.setBunker(Optional.of(m_bunker.get(Integer.valueOf(items[1].trim())))); } } + String intensity = rStr.substring(rStr.indexOf(']') + 1).trim(); + if (! intensity.isEmpty()) { + op.setIntensity(Optional.of(Integer.valueOf(intensity))); + } solution.add(op); } diff --git a/src/inport/Testing.java b/src/inport/Testing.java index 2a0740c..ea5f85b 100644 --- a/src/inport/Testing.java +++ b/src/inport/Testing.java @@ -35,6 +35,14 @@ public class Testing { ConversionUtil::resolveMiniZincResults); } + public static String solveTaskWithPartialCargoOp(TaskCase task) { + return solveTask( + task, + "conversion_2_with_partial_cargo_operations.mzn", + ConversionUtil::portToMiniZinc_2, + ConversionUtil::resolveMiniZincResults); + } + public static String solveTask_2_0(TaskCase task) { return solveTask( task, @@ -155,13 +163,16 @@ public class Testing { testGroup("without_typing", Testing::solveTask_1); } - public static void test_2() { + static void test_2() { testGroup("with_typing", Testing::solveTask_2); } - public static void test_2_0() { + public static void testWithPartialOp() { + testGroup("with_typing", Testing::solveTaskWithPartialCargoOp); + } + static void test_2_0() { testGroup("with_typing", Testing::solveTask_2_0); } - public static void test_2_exp() { + static void test_2_exp() { testGroup("experiments", Testing::solveTask_2); } } diff --git a/tests/with_typing/Bunkers.tipp b/tests/with_typing/Bunkers.tipp index 009470d..170c99c 100644 --- a/tests/with_typing/Bunkers.tipp +++ b/tests/with_typing/Bunkers.tipp @@ -79,4 +79,4 @@ Task Properties Solution 8.0 -20; F; 1.0; 2.0 (101 202 []) +20; F; 1.0; 2.0 (101 202 [] 2) -- GitLab