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; % Локац
% Операции погрузки, которые используют этот объект в качестве главного или в качестве бункеровщика.
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.
constraint forall (obj in 1..n_moving_obj, t in 1..n_intervals) (
is_involved_in_cargo_op[obj, t] = (
......@@ -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;
% Критерий оптимизации
......
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 {
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;
import static inport.Testing.*;
import inport.ConversionUtil.*;
import inport.ConversionUtils.MZnResultsResolver;
import inport.ConversionUtils.ParserException;
import inport.ConversionUtils.Task;
public class Main {
......@@ -85,8 +87,8 @@ public class Main {
error = solveTask(
task,
constraintName,
ConversionUtil::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults,
Task::portToMiniZinc_2,
MZnResultsResolver::resolveMiniZincResults,
DEFAULT_TIME_LIMIT_S);
}
......@@ -106,7 +108,7 @@ public class Main {
TaskCase task = new TaskCase();
try {
task.deserialize(input);
ConversionUtil.portToMiniZinc_0(task, output);
Task.portToMiniZinc_0(task, output);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
......@@ -118,7 +120,7 @@ public class Main {
TaskCase task = new TaskCase();
try {
task.deserialize(input);
ConversionUtil.portToMiniZinc_1(task, output);
Task.portToMiniZinc_1(task, output);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
......@@ -133,7 +135,7 @@ public class Main {
TaskCase task = new TaskCase();
task.deserialize(input);
ConversionUtil.resolveMiniZincResults(task, fileWIthResult);
MZnResultsResolver.resolveMiniZincResults(task, fileWIthResult);
task.serialize(output);
} catch (IOException | ParserException ex) {
......@@ -153,6 +155,10 @@ public class Main {
debug(Testing::solveTaskWithGreedyConstraints, DEFAULT_TIME_LIMIT_S);
break;
}
case "debug greedy v2" : {
debug(Testing::solveTaskWithGreedyConstraintsV2, DEFAULT_TIME_LIMIT_S);
break;
}
case "debug read-write" : {
debugReadWrite();
break;
......
......@@ -4,6 +4,8 @@
*/
package inport;
import inport.ConversionUtils.Utils;
import java.util.*;
/**
......@@ -118,10 +120,10 @@ public class Operation {
@Override
public String toString() {
if (executor == null) {
executor = ConversionUtil.getExecutor(template);
executor = Utils.getExecutor(template);
}
if (resources == null) {
resources = ConversionUtil.getResources(template);
resources = Utils.getResources(template);
}
StringBuilder sb = new StringBuilder();
sb.append(template.getId()).append("; ");
......
package inport;
import inport.ConversionUtils.MZnResultsResolver;
import inport.ConversionUtils.ParserException;
import inport.ConversionUtils.Task;
import javafx.util.Pair;
import java.io.*;
......@@ -29,8 +32,8 @@ public class Testing {
return solveTask(
task,
"conversion_1.mzn",
ConversionUtil::portToMiniZinc_1,
ConversionUtil::resolveMiniZincResults,
Task::portToMiniZinc_1,
MZnResultsResolver::resolveMiniZincResults,
timeLimitS);
}
......@@ -38,8 +41,8 @@ public class Testing {
return solveTask(
task,
"conversion_2.mzn",
ConversionUtil::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults,
Task::portToMiniZinc_2,
MZnResultsResolver::resolveMiniZincResults,
timeLimitS);
}
......@@ -47,8 +50,8 @@ public class Testing {
return solveTask(
task,
"conversion_2_with_partial_cargo_operations.mzn",
ConversionUtil::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults,
Task::portToMiniZinc_2,
MZnResultsResolver::resolveMiniZincResults,
timeLimitS);
}
......@@ -56,8 +59,17 @@ public class Testing {
return solveTask(
task,
"conversion_2_greedy.mzn",
ConversionUtil::portToMiniZincGreedy,
ConversionUtil::resolveMiniZincResults,
Task::portToMiniZincGreedy,
MZnResultsResolver::resolveMiniZincResults,
timeLimitS);
}
public static String solveTaskWithGreedyConstraintsV2(TaskCase task, int timeLimitS) {
return solveTask(
task,
"conversion_2_greedy_v2.mzn",
Task::portToMiniZincGreedy,
MZnResultsResolver::resolveMiniZincResults,
timeLimitS);
}
......@@ -65,8 +77,8 @@ public class Testing {
return solveTask(
task,
"conversion_2.0.mzn",
ConversionUtil::portToMiniZinc_2,
ConversionUtil::resolveMiniZincResults,
Task::portToMiniZinc_2,
MZnResultsResolver::resolveMiniZincResults,
"temp_data_2",
timeLimitS);
}
......
......@@ -223,10 +223,10 @@ Initial Vessel State
38; 6
/* Бункеровщики.
11; 4
12; 4
13; 5
14; 5
11; 1
12; 1
13; 2
14; 2
/* Буксиры.
21; 3
......@@ -292,7 +292,7 @@ Final Storage State
10002; 38; 4500
Task Properties
20.0; 0
16.0; 0
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