Commit dcc68822 authored by Vladislav Kiselev's avatar Vladislav Kiselev

Исправил баги, убрал сломанный constraintOnUsefulOperationBetweenMovements.

parent 70f4923d
......@@ -89,19 +89,28 @@ public class ConversionUtil {
static private void writeArrayOfSetAs2DArray(FileWriter writer,
String name,
ArrayList<Set<Integer>> operations) throws IOException {
ArrayList<ArrayList<Integer>> operations) throws IOException {
writeArrayOfSetAs2DArray(writer, name, operations, true);
}
static private void writeArrayOfSetAs2DArray(FileWriter writer,
String name,
ArrayList<ArrayList<Integer>> operations,
boolean addAdditionalInfo) throws IOException {
int maxSize = 0;
ArrayList<Integer> sizes = new ArrayList<>();
for (Set<Integer> s : operations) {
for (ArrayList<Integer> 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<Integer> s : operations) {
for (ArrayList<Integer> s : operations) {
for (Integer val : s) {
if (isFirst) {
isFirst = false;
......@@ -444,47 +453,40 @@ public class ConversionUtil {
/* Наличие всех ресурсов на месте, в том числе и самого корабля. */
private void presenceOfResourcesInLocation() throws IOException {
// TODO ресурсы покрываются "Конфликтующими операциями" (кроме наличия корабля на месте).
ArrayList<Set<Integer>> operationsResources = new ArrayList<>();
ArrayList<Integer> 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<ArrayList<Integer>> operationsResources = new ArrayList<>();
ArrayList<ArrayList<Integer>> operationsResourcesStartLoc = new ArrayList<>();
BiConsumer<MovingObject, Integer> addResource = (MovingObject r, Integer stLoc) -> {
operationsResources.get(operationsResources.size() - 1).add(mObjToN.apply(r) + 1);
operationsResourcesStartLoc.get(operationsResourcesStartLoc.size() - 1).add(stLoc + 1);
};
Set<Integer> 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<Integer> 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<Integer> 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<Set<Integer>> objUsefulOperations = new ArrayList<>();
ArrayList<ArrayList<Integer>> objUsefulOperations = new ArrayList<>();
ArrayList<Set<Integer>> movingOpOfObj = new ArrayList<>();
ArrayList<ArrayList<Integer>> movingOpOfObj = new ArrayList<>();
BiConsumer<MovingObject, Integer> 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<Set<Integer>> objUsefulOperations = new ArrayList<>();
ArrayList<ArrayList<Integer>> objUsefulOperations = new ArrayList<>();
BiConsumer<MovingObject, Integer> 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<Set<Integer>> movingOpOfObj = new ArrayList<>();
ArrayList<ArrayList<Integer>> movingOpOfObj = new ArrayList<>();
ArrayList<Integer> operationsDestination = new ArrayList<>();
for (int i = 0; i < movingObjects.size(); i++) {
movingOpOfObj.add(new TreeSet<>());
movingOpOfObj.add(new ArrayList<>());
}
BiConsumer<MovingObject, Integer> addMovingOp = (MovingObject obj, Integer op) ->
......@@ -823,7 +825,7 @@ public class ConversionUtil {
cargoFlows();
cargoOperations();
constraintOnUsefulOperationBetweenMovements_1();
// constraintOnUsefulOperationBetweenMovements_1();
} finally {
if (writer != null) {
writer.close();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment