Commit 51f93abe authored by Vladislav Kiselev's avatar Vladislav Kiselev

Вторая версия жадного алгоритма.

parent aee5e993
This diff is collapsed.
......@@ -115,8 +115,10 @@ public class MZnResultsResolver {
}
ArrayList<ArrayList<String>> cargoOpIntensity;
if (arrays.containsKey("cargo_op_intensity")) {
if (arrays.containsKey("cargo_op_intensity")) { // Явные нецелые операции.
cargoOpIntensity = arrays.get("cargo_op_intensity");
} else if (arrays.containsKey("real_cargo_value")) { // Жадный алгоритм.
cargoOpIntensity = arrays.get("real_cargo_value");
} else {
cargoOpIntensity = new ArrayList<>();
for (int opNo = 0; opNo < opStatus.size(); opNo++) {
......@@ -205,7 +207,7 @@ public class MZnResultsResolver {
}
if (! cargoOpIntensity.get(opNo).get(t - 1).equals("0")) {
op.setIntensity(Optional.of(Integer.valueOf(cargoOpIntensity.get(opNo).get(t - 1))));
op.setIntensity(Optional.of(Math.abs(Integer.valueOf(cargoOpIntensity.get(opNo).get(t - 1)))));
}
op.setFixation(true);
......
......@@ -10,7 +10,6 @@ import java.io.UncheckedIOException;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import static inport.ConversionUtils.MZnFormat.*;
import static inport.ConversionUtils.Utils.*;
......@@ -1347,7 +1346,7 @@ public class Task {
}
}
void dataForGreediness() throws IOException {
private void dataForGreediness() throws IOException {
ArrayList<ArrayList<Integer>> connectedSections = arrayOfIntegerArrays(sectionNById.size());
ArrayList<Set<Integer>> connectedSectionsSet = arrayOfIntegerSet(sectionNById.size());
......@@ -1466,6 +1465,50 @@ public class Task {
}
}
private void addIsOpUsedStorAsSecondary() throws IOException {
ArrayList<ArrayList<Boolean>> is_op_used_stor_as_secondary = new ArrayList<>();
for (int i = 0; i <= nSectionsOfRealStorageAndBunkers; i++) {
is_op_used_stor_as_secondary.add(new ArrayList<>());
for (int j = 0; j <= operationTemplates.size(); j++) {
is_op_used_stor_as_secondary.get(i).add(false);
}
}
for (int j = 0; j < operationTemplates.size(); j++) {
if (operationTemplates.get(j) instanceof LoadingTemplate) {
LoadingTemplate op = (LoadingTemplate) operationTemplates.get(j);
int section;
if (op.getBunker().isPresent()) {
section = sectionIdToN(op.getBunker().get(), op.getCargo());
} else {
section = sectionIdToN(op.getStorage(), op.getCargo());
}
is_op_used_stor_as_secondary.get(section + 1).set(j + 1, true);
}
}
locWrite2DArray(writer, "is_op_used_stor_as_secondary", is_op_used_stor_as_secondary, Objects::toString, true);
}
private void addInvolvedOperations() throws IOException {
ArrayList<Set<Integer>> involved_operations_as_main_stor = arrayOfIntegerSet(sectionNById.size());
ArrayList<Set<Integer>> involved_operations_as_sec_stor = arrayOfIntegerSet(sectionNById.size());
for (int i = 0; i < operationTemplates.size(); i++) {
if (operationTemplates.get(i) instanceof LoadingTemplate) {
LoadingTemplate op = (LoadingTemplate) operationTemplates.get(i);
int section_1 = sectionIdToN(op.getLoader(), op.getCargo());
int section_2;
if (op.getBunker().isPresent()) {
section_2 = sectionIdToN(op.getBunker().get(), op.getCargo());
} else {
section_2 = sectionIdToN(op.getStorage(), op.getCargo());
}
involved_operations_as_main_stor.get(section_1).add(i + 1);
involved_operations_as_sec_stor .get(section_2).add(i + 1);
}
}
writeArray(writer, "involved_operations_as_main_stor", involved_operations_as_main_stor, MZnFormat::setToString);
writeArray(writer, "involved_operations_as_sec_stor", involved_operations_as_sec_stor, MZnFormat::setToString);
}
void portToMiniZinc_2_greedy() {
if (!task.isTypified()) {
throw new ParserException("Attempt to convert untyped task as typified.");
......@@ -1478,6 +1521,19 @@ public class Task {
}
}
void portToMiniZinc_2_greedy_v2() {
if (!task.isTypified()) {
throw new ParserException("Attempt to convert untyped task as typified.");
}
try {
portToMiniZinc_2_greedy();
addIsOpUsedStorAsSecondary();
addInvolvedOperations();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
static public void portToMiniZinc_0(TaskCase task, String fileName) {
startConversion(task, fileName, Task::portToMiniZinc_0);
}
......@@ -1490,6 +1546,9 @@ public class Task {
static public void portToMiniZincGreedy(TaskCase task, String fileName) {
startConversion(task, fileName, Task::portToMiniZinc_2_greedy);
}
static public void portToMiniZincGreedyV2(TaskCase task, String fileName) {
startConversion(task, fileName, Task::portToMiniZinc_2_greedy_v2);
}
static private void startConversion(TaskCase task, String fileName, Consumer<Task> conversion) {
try {
......
......@@ -68,7 +68,7 @@ public class Testing {
return solveTask(
task,
"conversion_2_greedy_v2.mzn",
Task::portToMiniZincGreedy,
Task::portToMiniZincGreedyV2,
MZnResultsResolver::resolveMiniZincResults,
timeLimitS);
}
......
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