Commit 77589340 authored by Vladislav Kiselev's avatar Vladislav Kiselev

Добавлен вывод интенсивности грузовых операций в ответ.

parent 7472c3be
...@@ -1328,7 +1328,7 @@ public class ConversionUtil { ...@@ -1328,7 +1328,7 @@ public class ConversionUtil {
return Integer.compare(opId, o.opId); return Integer.compare(opId, o.opId);
} }
if (! bunkerId.isPresent()) { if (! bunkerId.isPresent()) {
return -1; return (! o.bunkerId.isPresent()) ? 0 : -1;
} }
if (! o.bunkerId.isPresent()) { if (! o.bunkerId.isPresent()) {
return 1; return 1;
...@@ -1646,6 +1646,24 @@ public class ConversionUtil { ...@@ -1646,6 +1646,24 @@ public class ConversionUtil {
templates = Task.renumberOperations(taskCase); templates = Task.renumberOperations(taskCase);
} }
ArrayList<ArrayList<String>> 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<Integer, OperationTemplate> operationById = new TreeMap<>(); Map<Integer, OperationTemplate> operationById = new TreeMap<>();
for (OperationTemplate operation : taskCase.getTemplates()) { for (OperationTemplate operation : taskCase.getTemplates()) {
operationById.put(operation.getId(), operation); operationById.put(operation.getId(), operation);
...@@ -1669,12 +1687,25 @@ public class ConversionUtil { ...@@ -1669,12 +1687,25 @@ public class ConversionUtil {
for (int opNo = 1; opNo < opStatus.size(); opNo++) { for (int opNo = 1; opNo < opStatus.size(); opNo++) {
int duration = 0; int duration = 0;
int t = 0; int t = 1;
boolean lastFixation = false; boolean lastFixation = false;
while (t < opStatus.get(opNo).size()) { while (t < opStatus.get(opNo).size()) {
if ((opStatus.get(opNo).get(t).equals("true") && (lastFixation != isFixed.get(opNo).get(t)) && (duration != 0)) boolean isOpLogicallyInterrupted = false;
|| (opStatus.get(opNo).get(t).equals("false") && (duration != 0))) { // Добавляем новую операцию. 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(); Operation op = new Operation();
op.setStart(t - duration - 1); op.setStart(t - duration - 1);
op.setDuration(duration); op.setDuration(duration);
...@@ -1705,6 +1736,10 @@ public class ConversionUtil { ...@@ -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); op.setFixation(true);
if (! oldSolution.contains(op.toString())) { if (! oldSolution.contains(op.toString())) {
op.setFixation(false); op.setFixation(false);
......
...@@ -113,11 +113,36 @@ public class Main { ...@@ -113,11 +113,36 @@ public class Main {
break; 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" : case "testing" :
test_2(); test_2();
break; break;
case "testing_2": case "testing_with_partial_op":
test_2_0(); testWithPartialOp();
break; break;
case "testing_exp": case "testing_exp":
test_2_exp(); test_2_exp();
......
...@@ -19,8 +19,16 @@ public class Operation { ...@@ -19,8 +19,16 @@ public class Operation {
private double duration; private double duration;
private MovingObject executor; private MovingObject executor;
private Optional<Bunker> bunker = Optional.empty(); private Optional<Bunker> bunker = Optional.empty();
private Optional<Integer> intensity = Optional.empty();
private List<MovingObject> resources; private List<MovingObject> resources;
public void setIntensity(Optional<Integer> intensity) {
this.intensity = intensity;
}
public Optional<Integer> getIntensity() {
return intensity;
}
public Optional<Bunker> getBunker() { public Optional<Bunker> getBunker() {
return bunker; return bunker;
} }
...@@ -130,7 +138,9 @@ public class Operation { ...@@ -130,7 +138,9 @@ public class Operation {
} }
sb.append(obj.getId()); sb.append(obj.getId());
} }
sb.append("])"); sb.append("]");
sb.append(intensity.map(i -> " " + i).orElse(""));
sb.append(")");
return sb.toString(); return sb.toString();
} }
} }
...@@ -718,6 +718,10 @@ public class TaskCase { ...@@ -718,6 +718,10 @@ public class TaskCase {
op.setBunker(Optional.of(m_bunker.get(Integer.valueOf(items[1].trim())))); 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); solution.add(op);
} }
......
...@@ -35,6 +35,14 @@ public class Testing { ...@@ -35,6 +35,14 @@ public class Testing {
ConversionUtil::resolveMiniZincResults); 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) { public static String solveTask_2_0(TaskCase task) {
return solveTask( return solveTask(
task, task,
...@@ -155,13 +163,16 @@ public class Testing { ...@@ -155,13 +163,16 @@ public class Testing {
testGroup("without_typing", Testing::solveTask_1); testGroup("without_typing", Testing::solveTask_1);
} }
public static void test_2() { static void test_2() {
testGroup("with_typing", Testing::solveTask_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); testGroup("with_typing", Testing::solveTask_2_0);
} }
public static void test_2_exp() { static void test_2_exp() {
testGroup("experiments", Testing::solveTask_2); testGroup("experiments", Testing::solveTask_2);
} }
} }
...@@ -79,4 +79,4 @@ Task Properties ...@@ -79,4 +79,4 @@ Task Properties
Solution Solution
8.0 8.0
20; F; 1.0; 2.0 (101 202 []) 20; F; 1.0; 2.0 (101 202 [] 2)
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