Commit 99ae99fe authored by Vladislav Kiselev's avatar Vladislav Kiselev

Добавлены аннотации к операциям из решения.

parent fed0aba4
...@@ -2,8 +2,22 @@ package inport.ConversionUtils; ...@@ -2,8 +2,22 @@ package inport.ConversionUtils;
import inport.*; import inport.*;
import java.util.*; import java.util.*;
import java.util.function.Function;
public class Utils { public class Utils {
public static <A, B> Collection<B> map(Collection<A> as, Function<A, B> f) {
Collection<B> b;
try {
b = as.getClass().newInstance();
} catch (Exception e) {
throw new IllegalArgumentException("Type " + as.getClass() + " needs a parameterless constructor");
}
for (A x : as) {
b.add(f.apply(x));
}
return b;
}
static class PairComparator<T extends Comparable<T>, U extends Comparable<U>> implements Comparator<Pair<T, U>> { 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) { public int compare(Pair<T, U> p1, Pair<T, U> p2) {
int res = p1.getKey().compareTo(p2.getKey()); int res = p1.getKey().compareTo(p2.getKey());
......
...@@ -117,8 +117,57 @@ public class Operation { ...@@ -117,8 +117,57 @@ public class Operation {
public Operation() { public Operation() {
} }
private static String getTransportName(MovingObject obj) {
if (obj instanceof TransportShip) {
return "судно " + obj.getId();
}
if (obj instanceof Bunker) {
return "бункеровщик " + obj.getId();
}
if (obj instanceof Tow) {
return "буксир " + obj.getId();
}
return (obj.getName().isEmpty()) ? "оборудование " + obj.getId() : obj.getName();
}
private static String getShortTransportName(MovingObject obj) {
if ((obj instanceof TransportShip) || (obj instanceof Bunker) || (obj instanceof Tow)) {
return Integer.toString(obj.getId());
}
return (obj.getName().isEmpty()) ? Integer.toString(obj.getId()) : obj.getName();
}
private static String firstCharToUppercase(String s) {
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
private static String resourcesToString(List<MovingObject> resources) {
return "{" + String.join(", ", Utils.map(resources, Operation::getShortTransportName)) + "}";
}
@Override @Override
public String toString() { public String toString() {
return toString(false, null);
}
public String toString(boolean includeAnnotations, ArrayList<Integer> maxSizes) {
ArrayList<String> components = getComponentsOfStringValue(includeAnnotations);
StringBuilder sb = new StringBuilder();
for (int compNo = 0; compNo < components.size(); compNo++) {
sb.append(components.get(compNo));
if (maxSizes != null) {
for (int delta = maxSizes.get(compNo) - components.get(compNo).length(); delta > 0; delta--) {
sb.append(" ");
}
}
}
return sb.toString();
}
public ArrayList<String> getComponentsOfStringValue(boolean includeAnnotations) {
ArrayList<String> res = new ArrayList<>();
if (executor == null) { if (executor == null) {
executor = Utils.getExecutor(template); executor = Utils.getExecutor(template);
} }
...@@ -126,8 +175,12 @@ public class Operation { ...@@ -126,8 +175,12 @@ public class Operation {
resources = Utils.getResources(template); resources = Utils.getResources(template);
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(template.getId()).append("; ");
sb.append(fixation ? "F" : "R").append("; ").append(start).append("; ").append(duration); res.add(Integer.toString(template.getId()));
res.add("; " + (fixation ? "F" : "R"));
res.add("; " + start);
res.add("; " + duration);
sb.append(" (").append(executor.getId()).append(" "); sb.append(" (").append(executor.getId()).append(" ");
sb.append(bunker.map(b -> b.getId() + " ").orElse("")).append("["); sb.append(bunker.map(b -> b.getId() + " ").orElse("")).append("[");
boolean isFirst = true; boolean isFirst = true;
...@@ -142,7 +195,68 @@ public class Operation { ...@@ -142,7 +195,68 @@ public class Operation {
sb.append("]"); sb.append("]");
sb.append(intensity.map(i -> " " + i).orElse("")); sb.append(intensity.map(i -> " " + i).orElse(""));
sb.append(")"); sb.append(")");
return sb.toString();
res.add(sb.toString());
sb = new StringBuilder();
if (includeAnnotations) {
sb.append(" \\* ");
if (template instanceof MovingTemplate) {
MovingTemplate o = (MovingTemplate) template;
sb.append(firstCharToUppercase(getTransportName(executor)) + " идёт к причалу " + o.getDestination().getId()
+ " от причала " + o.getStartLocation().getId());
if (! resources.isEmpty()) {
sb.append(" используя буксиры " + resourcesToString(resources));
}
sb.append(".");
} else if (template instanceof LoadingTemplate) {
LoadingTemplate o = (LoadingTemplate) template;
sb.append(firstCharToUppercase(getTransportName(executor)));
sb.append(" принимает груз " + o.getCargo().getId());
if (bunker.isPresent()) {
sb.append(" из бункеровщика " + bunker.get().getId());
} else {
sb.append(" из хранилища " + o.getStorage().getId());
}
sb.append(" с интенсивностью " + o.getIntensity());
sb.append(" у причала " + o.getStartLocation().getId());
if (! resources.isEmpty()) {
sb.append(" используя оборудование " + resourcesToString(resources));
}
sb.append(".");
} else if (template instanceof MooringTemplate) {
MooringTemplate o = (MooringTemplate) template;
sb.append(firstCharToUppercase(getTransportName(executor)));
if (o.isDirect()) {
sb.append(" швартуется к причалу ");
} else {
sb.append(" отшвартовывается от причала ");
}
sb.append(o.getStartLocation().getId());
if (! resources.isEmpty()) {
sb.append(" используя буксиры " + resourcesToString(resources));
}
sb.append(".");
}
}
res.add(sb.toString());
return res;
}
public static ArrayList<Integer> getMaxSizesOfComponents(Collection<Operation> operations, boolean includeAnnotations) {
ArrayList<Integer> res = new ArrayList<>();
for (Operation operation : operations) {
ArrayList<String> components = operation.getComponentsOfStringValue(includeAnnotations);
for (int i = 0; i < components.size(); i++) {
if (i >= res.size()) {
res.add(0);
}
res.set(i, Math.max(res.get(i), components.get(i).length()));
}
}
return res;
} }
public Operation(String str, public Operation(String str,
......
...@@ -812,19 +812,24 @@ public class TaskCase { ...@@ -812,19 +812,24 @@ public class TaskCase {
writer.write("\n"); writer.write("\n");
writer.write("\nTask Properties"+"\n"); writer.write("\nTask Properties"+"\n");
writer.write(planningInterval+"; "+criterionType+"\n"); writer.write(planningInterval+"; "+criterionType+"\n");
{
ArrayList<Integer> maxSizes = Operation.getMaxSizesOfComponents(fixedOperations, true);
writer.write("\n" + Tag.Fixed_Operations.text + "\n"); writer.write("\n" + Tag.Fixed_Operations.text + "\n");
for (Operation op : fixedOperations) { for (Operation op : fixedOperations) {
writer.write(op.toString() + "\n"); writer.write(op.toString(true, maxSizes) + "\n");
}
} }
writer.write("\n"); writer.write("\n");
writer.write("\nSolution"+"\n"); writer.write("\nSolution"+"\n");
writer.write(solution_result+"\n"); writer.write(solution_result+"\n");
solution.sort(new OperationsComparator()); solution.sort(new OperationsComparator());
{
for (Operation c : solution) ArrayList<Integer> maxSizes = Operation.getMaxSizesOfComponents(solution, true);
writer.write(c.toString()+"\n"); for (Operation c : solution)
writer.write(c.toString(true, maxSizes) + "\n");
}
writer.flush(); writer.flush();
} }
catch(IOException ex) { catch(IOException ex) {
......
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