diff --git a/src/inport/ConversionUtil.java b/src/inport/ConversionUtil.java index a73e48ffb4a3775c9a7974232dcf4238884c5f9d..5ea02a7c99183ba85cbc02b72260f9e3f5af8311 100644 --- a/src/inport/ConversionUtil.java +++ b/src/inport/ConversionUtil.java @@ -89,19 +89,28 @@ public class ConversionUtil { static private void writeArrayOfSetAs2DArray(FileWriter writer, String name, - ArrayList> operations) throws IOException { + ArrayList> operations) throws IOException { + writeArrayOfSetAs2DArray(writer, name, operations, true); + } + + static private void writeArrayOfSetAs2DArray(FileWriter writer, + String name, + ArrayList> operations, + boolean addAdditionalInfo) throws IOException { int maxSize = 0; ArrayList sizes = new ArrayList<>(); - for (Set s : operations) { + for (ArrayList s : operations) { maxSize = Math.max(maxSize, s.size()); sizes.add(s.size()); } - writer.write(name + "_max_size = " + maxSize + ";\n"); - writeArray(writer, name + "_sizes", sizes); - writer.write(name + " = array2d(1.." + operations.size() + ", 1.." + name + "_max_size, ["); + if (addAdditionalInfo) { + writer.write(name + "_max_size = " + maxSize + ";\n"); + writeArray(writer, name + "_sizes", sizes); + } + writer.write(name + " = array2d(1.." + operations.size() + ", 1.." + maxSize + ", ["); boolean isFirst = true; - for (Set s : operations) { + for (ArrayList s : operations) { for (Integer val : s) { if (isFirst) { isFirst = false; @@ -444,47 +453,40 @@ public class ConversionUtil { /* Наличие всех ресурсов на месте, в том числе и самого корабля. */ private void presenceOfResourcesInLocation() throws IOException { - // TODO ресурсы покрываются "Конфликтующими операциями" (кроме наличия корабля на месте). - ArrayList> operationsResources = new ArrayList<>(); - ArrayList operationsStartLoc = integerArray(operationTemplates.size(), 0); - for (int i = 0; i < operationTemplates.size(); i++) { - operationsResources.add(new TreeSet<>()); - if (operationTemplates.get(i) instanceof MovingTemplate) { // Перемещение. - MovingTemplate op = (MovingTemplate)operationTemplates.get(i); + ArrayList> operationsResources = new ArrayList<>(); + ArrayList> operationsResourcesStartLoc = new ArrayList<>(); + + BiConsumer addResource = (MovingObject r, Integer stLoc) -> { + operationsResources.get(operationsResources.size() - 1).add(mObjToN.apply(r) + 1); + operationsResourcesStartLoc.get(operationsResourcesStartLoc.size() - 1).add(stLoc + 1); + }; - Set s = new TreeSet<>(); - s.add(mObjToN.apply(op.getMover()) + 1); + for (OperationTemplate operationTemplate : operationTemplates) { + operationsResources.add(new ArrayList<>()); + operationsResourcesStartLoc.add(new ArrayList<>()); + + if (operationTemplate instanceof MovingTemplate) { // Перемещение. + MovingTemplate op = (MovingTemplate) operationTemplate; + addResource.accept(op.getMover(), getLocNById.apply(op.getStartLocation().getId(), false)); for (MovingObject obj : op.getResources()) { - s.add(mObjToN.apply(obj) + 1); + addResource.accept(obj, getLocNById.apply(op.getStartLocation().getId(), false)); } - operationsResources.set(i, s); - operationsStartLoc.set(i, getLocNById.apply(op.getStartLocation().getId(), false) + 1); - } else if (operationTemplates.get(i) instanceof MooringTemplate) { // Швартовка. - MooringTemplate op = (MooringTemplate)operationTemplates.get(i); - - Set s = new TreeSet<>(); - s.add(mObjToN.apply(op.getMoorer()) + 1); + } else if (operationTemplate instanceof MooringTemplate) { // Швартовка. + MooringTemplate op = (MooringTemplate) operationTemplate; + addResource.accept(op.getMoorer(), getLocNById.apply(op.getStartLocation().getId(), !op.isDirect())); for (MovingObject obj : op.getResources()) { - s.add(mObjToN.apply(obj) + 1); + addResource.accept(obj, getLocNById.apply(op.getStartLocation().getId(), false)); + } + } else if (operationTemplate instanceof LoadingTemplate) { // Погрузка. + LoadingTemplate op = (LoadingTemplate) operationTemplate; + addResource.accept(op.getLoader(), getLocNById.apply(op.getStartLocation().getId(), op.getWithMooring())); + for (MovingObject obj : op.getResources()) { + addResource.accept(obj, getLocNById.apply(op.getStartLocation().getId(), false)); } - operationsResources.set(i, s); - operationsStartLoc.set(i, getLocNById.apply(op.getStartLocation().getId(), !op.isDirect()) + 1); - } else if (operationTemplates.get(i) instanceof LoadingTemplate) { // Погрузка. - LoadingTemplate op = (LoadingTemplate) operationTemplates.get(i); - - Set s = new TreeSet<>(); - s.add(mObjToN.apply(op.getLoader()) + 1); - - // TODO ресурсы у операции погрузки. - - operationsResources.set(i, s); - operationsStartLoc.set(i, getLocNById.apply(op.getStartLocation().getId(), op.getWithMooring()) + 1); } - // TODO швартовка, погрузка. } - writeArray(writer, "operations_start_loc", operationsStartLoc); - //writeArray(writer, "operations_resources", operationsResources, ConversionUtil::setToString); writeArrayOfSetAs2DArray(writer, "operations_resources", operationsResources); + writeArrayOfSetAs2DArray(writer, "operations_resources_start_loc", operationsResourcesStartLoc, false); writer.write("\n"); } @@ -637,9 +639,9 @@ public class ConversionUtil { /* Ограничение на необходимость полезной операции между движениями к одному пункту назначения. */ private void constraintOnUsefulOperationBetweenMovements_0() throws IOException { - ArrayList> objUsefulOperations = new ArrayList<>(); + ArrayList> objUsefulOperations = new ArrayList<>(); - ArrayList> movingOpOfObj = new ArrayList<>(); + ArrayList> movingOpOfObj = new ArrayList<>(); BiConsumer addUsOp = (MovingObject obj, Integer op) -> objUsefulOperations.get(mObjToN.apply(obj)).add(op + 1); @@ -647,8 +649,8 @@ public class ConversionUtil { movingOpOfObj.get(mObjToN.apply(obj)).add(op + 1); for (int i = 0; i < movingObjects.size(); i++) { - movingOpOfObj.add(new TreeSet<>()); - objUsefulOperations.add(new TreeSet<>()); + movingOpOfObj.add(new ArrayList<>()); + objUsefulOperations.add(new ArrayList<>()); } for (int i = 0; i < operationTemplates.size(); i++) { @@ -687,13 +689,13 @@ public class ConversionUtil { } private void constraintOnUsefulOperationBetweenMovements_1() throws IOException { - ArrayList> objUsefulOperations = new ArrayList<>(); + ArrayList> objUsefulOperations = new ArrayList<>(); BiConsumer addUsOp = (MovingObject obj, Integer op) -> objUsefulOperations.get(mObjToN.apply(obj)).add(op + 1); for (int i = 0; i < movingObjects.size(); i++) { - objUsefulOperations.add(new TreeSet<>()); + objUsefulOperations.add(new ArrayList<>()); } for (int i = 0; i < operationTemplates.size(); i++) { @@ -725,11 +727,11 @@ public class ConversionUtil { } private void movingObjectLocationDefinition() throws IOException { - ArrayList> movingOpOfObj = new ArrayList<>(); + ArrayList> movingOpOfObj = new ArrayList<>(); ArrayList operationsDestination = new ArrayList<>(); for (int i = 0; i < movingObjects.size(); i++) { - movingOpOfObj.add(new TreeSet<>()); + movingOpOfObj.add(new ArrayList<>()); } BiConsumer addMovingOp = (MovingObject obj, Integer op) -> @@ -823,7 +825,7 @@ public class ConversionUtil { cargoFlows(); cargoOperations(); - constraintOnUsefulOperationBetweenMovements_1(); +// constraintOnUsefulOperationBetweenMovements_1(); } finally { if (writer != null) { writer.close();