Commit aee5e993 authored by Vladislav Kiselev's avatar Vladislav Kiselev

Refactoring.

parent 6f4e16e6
...@@ -218,6 +218,9 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ...@@ -218,6 +218,9 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац
% Операции погрузки, которые используют этот объект в качестве главного или в качестве бункеровщика. % Операции погрузки, которые используют этот объект в качестве главного или в качестве бункеровщика.
array [0..n_moving_obj] of set of 0..n_operations : related_cargo_op; array [0..n_moving_obj] of set of 0..n_operations : related_cargo_op;
% Операции отшвартовки, которые используют объект в качестве главного.
array [0..n_moving_obj] of set of 1..n_operations : related_unmooring_op;
% Определение is_involved_in_cargo_op. % Определение is_involved_in_cargo_op.
constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals) ( constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals) (
is_involved_in_cargo_op[obj, t] = ( is_involved_in_cargo_op[obj, t] = (
...@@ -698,6 +701,11 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац ...@@ -698,6 +701,11 @@ array [0..n_operations] of 0..n_locations : operations_destination; % Локац
); );
*/ */
% Для оптимизаций.
array [1..n_all_storage_sections, 1..n_locations] of int : min_positive_cargo_val; % Объём максимальной положительной операции, которая может быть произведена с этой секцией в этом хранилище. Если в локации таковой нет, то это значение объёма хранилища + 1.
array [1..n_all_storage_sections, 1..n_locations] of int : max_negative_cargo_val;
array [1..n_moving_obj, 1..n_locations] of bool : can_obj_leave_loc_only_alone;
array [1..n_moving_obj, 1..n_locations, 1..n_intervals] of bool : is_fixed_op_planned_in_future; array [1..n_moving_obj, 1..n_locations, 1..n_intervals] of bool : is_fixed_op_planned_in_future;
% Критерий оптимизации % Критерий оптимизации
......
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
package inport; package inport.ConversionUtils;
public class ParserException extends RuntimeException { public class ParserException extends RuntimeException {
ParserException(String mess) { ParserException(String mess) {
......
This diff is collapsed.
package inport.ConversionUtils;
import inport.*;
import javafx.util.Pair;
import java.util.*;
public class Utils {
static class PairComparator<T extends Comparable<T>, U extends Comparable<U>> implements Comparator<Pair<T, U>> {
public int compare(Pair<T, U> p1, Pair<T, U> p2) {
int res = p1.getKey().compareTo(p2.getKey());
if (res != 0) {
return res;
} else {
return p1.getValue().compareTo(p2.getValue());
}
}
}
static public ArrayList<Integer> integerArray(int size, int initVal) {
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < size; i++) {
res.add(initVal);
}
return res;
}
static public ArrayList<ArrayList<Integer>> arrayOfIntegerArrays(int size) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
for (int i = 0; i < size; i++) {
res.add(new ArrayList<>());
}
return res;
}
static public ArrayList<Set<Integer>> arrayOfIntegerSet(int size) {
ArrayList<Set<Integer>> res = new ArrayList<>();
for (int i = 0; i < size; i++) {
res.add(new TreeSet<>());
}
return res;
}
static public MovingObject getExecutor(OperationTemplate t) {
if (t instanceof LoadingTemplate) {
return ((LoadingTemplate) t).getLoader();
}
if (t instanceof MooringTemplate) {
return ((MooringTemplate) t).getMoorer();
}
if (t instanceof MovingTemplate) {
return ((MovingTemplate) t).getMover();
}
return null;
}
static public List<MovingObject> getResources(OperationTemplate t) {
List<MovingObject> res = new ArrayList<>();
if (t instanceof LoadingTemplate) {
res.addAll(((LoadingTemplate) t).getResources());
}
if (t instanceof MooringTemplate) {
res.addAll(((MooringTemplate) t).getResources());
}
if (t instanceof MovingTemplate) {
res.addAll(((MovingTemplate) t).getResources());
}
return res;
}
static public boolean isCompatible(OperationTemplate t1, OperationTemplate t2) {
MovingObject exec1 = getExecutor(t1);
Berth place1 = t1.getStartLocation();
List<MovingObject> resources1 = getResources(t1);
MovingObject exec2 = getExecutor(t2);
Berth place2 = t2.getStartLocation();
List<MovingObject> resources2 = getResources(t2);
// Пересекаемость ресурсов
for (Object res2 : resources2)
if (resources1.contains(res2))
return false;
// Выполнитель = ресурс
if (resources1.contains(exec2))
return false;
// Ресурс = выполнитель
if (resources2.contains(exec1))
return false;
// Выполнитель = выполнитель
if (exec1.equals(exec2))
{
// Это не погрузка
if (!(t1 instanceof LoadingTemplate) || (!(t2 instanceof LoadingTemplate)))
return false;
// Разные причалы
if (!place1.equals(place2))
return false;
Storage s1 = ((LoadingTemplate)t1).getStorage();
Storage s2 = ((LoadingTemplate)t2).getStorage();
// В одно хранилище
if (s1.equals(s2))
return false;
}
else
// На одном причале и это не перемещения
if (place1.equals(place2) && (!(t1 instanceof MovingTemplate)) && (!(t2 instanceof MovingTemplate)))
return false;
return true;
}
}
...@@ -8,7 +8,9 @@ import java.util.function.BiFunction; ...@@ -8,7 +8,9 @@ import java.util.function.BiFunction;
import static inport.Testing.*; import static inport.Testing.*;
import inport.ConversionUtil.*; import inport.ConversionUtils.MZnResultsResolver;
import inport.ConversionUtils.ParserException;
import inport.ConversionUtils.Task;
public class Main { public class Main {
...@@ -85,8 +87,8 @@ public class Main { ...@@ -85,8 +87,8 @@ public class Main {
error = solveTask( error = solveTask(
task, task,
constraintName, constraintName,
ConversionUtil::portToMiniZinc_2, Task::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults, MZnResultsResolver::resolveMiniZincResults,
DEFAULT_TIME_LIMIT_S); DEFAULT_TIME_LIMIT_S);
} }
...@@ -106,7 +108,7 @@ public class Main { ...@@ -106,7 +108,7 @@ public class Main {
TaskCase task = new TaskCase(); TaskCase task = new TaskCase();
try { try {
task.deserialize(input); task.deserialize(input);
ConversionUtil.portToMiniZinc_0(task, output); Task.portToMiniZinc_0(task, output);
} catch (IOException ex) { } catch (IOException ex) {
System.out.println(ex.getMessage()); System.out.println(ex.getMessage());
} }
...@@ -118,7 +120,7 @@ public class Main { ...@@ -118,7 +120,7 @@ public class Main {
TaskCase task = new TaskCase(); TaskCase task = new TaskCase();
try { try {
task.deserialize(input); task.deserialize(input);
ConversionUtil.portToMiniZinc_1(task, output); Task.portToMiniZinc_1(task, output);
} catch (IOException ex) { } catch (IOException ex) {
System.out.println(ex.getMessage()); System.out.println(ex.getMessage());
} }
...@@ -133,7 +135,7 @@ public class Main { ...@@ -133,7 +135,7 @@ public class Main {
TaskCase task = new TaskCase(); TaskCase task = new TaskCase();
task.deserialize(input); task.deserialize(input);
ConversionUtil.resolveMiniZincResults(task, fileWIthResult); MZnResultsResolver.resolveMiniZincResults(task, fileWIthResult);
task.serialize(output); task.serialize(output);
} catch (IOException | ParserException ex) { } catch (IOException | ParserException ex) {
...@@ -153,6 +155,10 @@ public class Main { ...@@ -153,6 +155,10 @@ public class Main {
debug(Testing::solveTaskWithGreedyConstraints, DEFAULT_TIME_LIMIT_S); debug(Testing::solveTaskWithGreedyConstraints, DEFAULT_TIME_LIMIT_S);
break; break;
} }
case "debug greedy v2" : {
debug(Testing::solveTaskWithGreedyConstraintsV2, DEFAULT_TIME_LIMIT_S);
break;
}
case "debug read-write" : { case "debug read-write" : {
debugReadWrite(); debugReadWrite();
break; break;
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
*/ */
package inport; package inport;
import inport.ConversionUtils.Utils;
import java.util.*; import java.util.*;
/** /**
...@@ -118,10 +120,10 @@ public class Operation { ...@@ -118,10 +120,10 @@ public class Operation {
@Override @Override
public String toString() { public String toString() {
if (executor == null) { if (executor == null) {
executor = ConversionUtil.getExecutor(template); executor = Utils.getExecutor(template);
} }
if (resources == null) { if (resources == null) {
resources = ConversionUtil.getResources(template); resources = Utils.getResources(template);
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(template.getId()).append("; "); sb.append(template.getId()).append("; ");
......
package inport; package inport;
import inport.ConversionUtils.MZnResultsResolver;
import inport.ConversionUtils.ParserException;
import inport.ConversionUtils.Task;
import javafx.util.Pair; import javafx.util.Pair;
import java.io.*; import java.io.*;
...@@ -29,8 +32,8 @@ public class Testing { ...@@ -29,8 +32,8 @@ public class Testing {
return solveTask( return solveTask(
task, task,
"conversion_1.mzn", "conversion_1.mzn",
ConversionUtil::portToMiniZinc_1, Task::portToMiniZinc_1,
ConversionUtil::resolveMiniZincResults, MZnResultsResolver::resolveMiniZincResults,
timeLimitS); timeLimitS);
} }
...@@ -38,8 +41,8 @@ public class Testing { ...@@ -38,8 +41,8 @@ public class Testing {
return solveTask( return solveTask(
task, task,
"conversion_2.mzn", "conversion_2.mzn",
ConversionUtil::portToMiniZinc_2, Task::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults, MZnResultsResolver::resolveMiniZincResults,
timeLimitS); timeLimitS);
} }
...@@ -47,8 +50,8 @@ public class Testing { ...@@ -47,8 +50,8 @@ public class Testing {
return solveTask( return solveTask(
task, task,
"conversion_2_with_partial_cargo_operations.mzn", "conversion_2_with_partial_cargo_operations.mzn",
ConversionUtil::portToMiniZinc_2, Task::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults, MZnResultsResolver::resolveMiniZincResults,
timeLimitS); timeLimitS);
} }
...@@ -56,8 +59,17 @@ public class Testing { ...@@ -56,8 +59,17 @@ public class Testing {
return solveTask( return solveTask(
task, task,
"conversion_2_greedy.mzn", "conversion_2_greedy.mzn",
ConversionUtil::portToMiniZincGreedy, Task::portToMiniZincGreedy,
ConversionUtil::resolveMiniZincResults, MZnResultsResolver::resolveMiniZincResults,
timeLimitS);
}
public static String solveTaskWithGreedyConstraintsV2(TaskCase task, int timeLimitS) {
return solveTask(
task,
"conversion_2_greedy_v2.mzn",
Task::portToMiniZincGreedy,
MZnResultsResolver::resolveMiniZincResults,
timeLimitS); timeLimitS);
} }
...@@ -65,8 +77,8 @@ public class Testing { ...@@ -65,8 +77,8 @@ public class Testing {
return solveTask( return solveTask(
task, task,
"conversion_2.0.mzn", "conversion_2.0.mzn",
ConversionUtil::portToMiniZinc_2, Task::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults, MZnResultsResolver::resolveMiniZincResults,
"temp_data_2", "temp_data_2",
timeLimitS); timeLimitS);
} }
......
...@@ -223,10 +223,10 @@ Initial Vessel State ...@@ -223,10 +223,10 @@ Initial Vessel State
38; 6 38; 6
/* Бункеровщики. /* Бункеровщики.
11; 4 11; 1
12; 4 12; 1
13; 5 13; 2
14; 5 14; 2
/* Буксиры. /* Буксиры.
21; 3 21; 3
...@@ -292,7 +292,7 @@ Final Storage State ...@@ -292,7 +292,7 @@ Final Storage State
10002; 38; 4500 10002; 38; 4500
Task Properties Task Properties
20.0; 0 16.0; 0
Solution Solution
......
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