diff --git a/src/inport/ConversionUtil.java b/src/inport/ConversionUtil.java index d1e6e11b531bb6ce1e528ec23b2bdd0f2b26f016..4f8ee9831483286a12491ee85ed7ac79dd130489 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 bb59bf24e737dcca69bb93c4ab827499f037a6cf..997678127058fcd072be83af85d2dc44b7106a33 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 c04c7f4ec4ae8dd426080fc856b4d4b0f3dd3727..536d7f4fef1422bdd5fc9f5bf88f43ea3a278c76 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 e9e90665d22d2fc86707558690b95db4a4870714..b0716b0ecd07d21c13d31db3782395f0c6a0a5b1 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 2a0740c9dc2c913d278d70be35e6b7a218b501cd..ea5f85ba756925f9f0d26b57535d8e50fae136a0 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 009470dd18d8eb7f4ea06654848d64f9d50f9bc9..170c99c2cc7d363acf81daa7b27f028ab59d0080 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)