Skip to content

Commit

Permalink
Изменена структура
Browse files Browse the repository at this point in the history
  • Loading branch information
Pastor committed Nov 30, 2024
1 parent f7860ec commit fb65fc8
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 148 deletions.
7 changes: 0 additions & 7 deletions vol5/src/main/java/ru/mifi/practice/vol5/graph/Factory.java

This file was deleted.

119 changes: 37 additions & 82 deletions vol5/src/main/java/ru/mifi/practice/vol5/graph/Graph.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,39 +7,24 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;

@SuppressWarnings("UnusedReturnValue")
public interface Graph<T, W extends Number & Comparable<W>> {

int size();

int indexOf(String label);

Vertex<T, W> ofIndex(int index);

Vertex<T, W> createVertex(T value);

Vertex<T, W> createVertex(String label, T value);

Edge<T, W> createEdge(Vertex<T, W> source, Vertex<T, W> target, W weight);

Edge<T, W> createEdge(String source, String target, W weight);

List<Edge<T, W>> getEdges(String source);

default List<Edge<T, W>> getEdges(Vertex<T, W> source) {
return getEdges(source.label());
}
Vertex<T, W> addVertex(String label, T value);

Vertex<T, W> getVertex(String source);

Vertex<T, W> getVertex(int index);

List<Graph.Vertex<T, W>> getVertices();

@FunctionalInterface
interface Loader<T, W extends Number & Comparable<W>> {
Graph<T, W> load(InputStream stream, Function<String, T> value) throws IOException;
interface Loader<I, T, W extends Number & Comparable<W>> {
Graph<T, W> parse(InputStream stream, Function<I, T> value, Function<I, W> weight) throws IOException;
}

interface Vertex<T, W extends Number & Comparable<W>> {
Expand All @@ -50,10 +35,15 @@ interface Vertex<T, W extends Number & Comparable<W>> {

T value();

List<Graph.Edge<T, W>> edges();

Edge<T, W> addEdge(Vertex<T, W> target, W weight);

final class Default<T, W extends Number & Comparable<W>> implements Vertex<T, W> {
private final int index;
private final String label;
private final T value;
private final List<Graph.Edge<T, W>> edges = new ArrayList<>();

Default(int index, String label, T value) {
this.index = index;
Expand All @@ -76,6 +66,18 @@ public T value() {
return value;
}

@Override
public List<Edge<T, W>> edges() {
return edges;
}

@Override
public Edge<T, W> addEdge(Vertex<T, W> target, W weight) {
Edge<T, W> edge = new Edge.Default<>(this, target, weight);
edges.add(edge);
return edge;
}

@Override
public String toString() {
return "(" + label + ")";
Expand Down Expand Up @@ -146,7 +148,6 @@ public String toString() {

abstract class AbstractGraph<T, W extends Number & Comparable<W>> implements Graph<T, W> {
protected final List<Vertex<T, W>> vertices = new ArrayList<>();
protected final List<List<Edge<T, W>>> edges = new ArrayList<>();
protected final Map<String, Integer> labelIndexes = new HashMap<>();


Expand All @@ -155,13 +156,6 @@ public int size() {
return vertices.size();
}

@Override
public Vertex<T, W> ofIndex(int index) {
Objects.checkIndex(index, vertices.size());
return vertices.get(index);
}

@Override
public int indexOf(String label) {
Integer index = labelIndexes.get(label);
Objects.requireNonNull(index, "Index not found");
Expand All @@ -170,77 +164,38 @@ public int indexOf(String label) {

@Override
public Vertex<T, W> getVertex(String label) {
return vertices.get(indexOf(label));
return getVertex(indexOf(label));
}

@Override
public List<Edge<T, W>> getEdges(String label) {
List<Edge<T, W>> list = edges.get(indexOf(label));
return list == null ? List.of() : list;
}

@Override
public Vertex<T, W> createVertex(T value) {
return createVertex(null, value);
public Vertex<T, W> getVertex(int index) {
Objects.checkIndex(index, size());
return vertices.get(index);
}

@Override
public Vertex<T, W> createVertex(String label, T value) {
final int index;
if (labelIndexes.containsKey(label)) {
index = labelIndexes.get(label);
} else {
index = nextVertexIndex();
}
if (label == null) {
label = String.valueOf(index);
}
Vertex.Default<T, W> vertex = new Vertex.Default<>(index, label, value);
labelIndexes.put(label, index);
if (index < vertices.size()) {
vertices.set(index, vertex);
} else {
public Vertex<T, W> addVertex(String label, T value) {
final Vertex<T, W> vertex;
if (!hasVertex(label)) {
vertex = new Vertex.Default<>(size(), label, value);
vertices.add(vertex);
edges.add(new ArrayList<>());
labelIndexes.put(label, vertex.index());
} else {
vertex = getVertex(label);
}
Objects.checkIndex(index, vertices.size());
Objects.checkIndex(index, edges.size());
return vertex;
}

@Override
public Edge<T, W> createEdge(Vertex<T, W> source, Vertex<T, W> target, W weight) {
Edge.Default<T, W> edge = new Edge.Default<>(source, target, weight);
List<Edge<T, W>> list = edges.get(source.index());
if (list == null) {
list = new ArrayList<>();
}
list.add(edge);
edges.set(source.index(), list);
return edge;
}

@Override
public Edge<T, W> createEdge(String source, String target, W weight) {
Vertex<T, W> sourceVertex = getVertex(source);
Vertex<T, W> targetVertex = getVertex(target);
return createEdge(sourceVertex, targetVertex, weight);
}

protected abstract int nextVertexIndex();

@Override
public List<Graph.Vertex<T, W>> getVertices() {
return vertices;
}

private boolean hasVertex(String label) {
return labelIndexes.containsKey(label);
}
}

final class Standard<T, W extends Number & Comparable<W>> extends AbstractGraph<T, W> {
private final AtomicInteger vertexCount = new AtomicInteger(0);

@Override
protected int nextVertexIndex() {
return vertexCount.getAndIncrement();
}
}
}
16 changes: 8 additions & 8 deletions vol5/src/main/java/ru/mifi/practice/vol5/graph/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
import ru.mifi.practice.vol5.graph.algorithms.AntShortestPath;
import ru.mifi.practice.vol5.graph.algorithms.Base;
import ru.mifi.practice.vol5.graph.algorithms.DijkstraShortestPath;
import ru.mifi.practice.vol5.graph.loader.StandardWeightLoader;
import ru.mifi.practice.vol5.graph.loader.ParserText;

import java.io.IOException;
import java.util.Objects;

public abstract class Main {
public static void main(String[] args) throws IOException {
Graph<String, Integer> graph = new StandardWeightLoader<String>()
.load(Objects.requireNonNull(Main.class.getResourceAsStream("/standard.graph")), s -> s);
Graph<String, Integer> graph = new ParserText<String>()
.parse(Objects.requireNonNull(Main.class.getResourceAsStream("/standard.graph")), s -> s, Integer::parseInt);
var algorithms = new Base<String, Integer>();
System.out.print("DFS: ");
algorithms.dfs(graph, vertex -> System.out.printf("%s", vertex));
Expand All @@ -22,15 +22,15 @@ public static void main(String[] args) throws IOException {
var circle = algorithms.searchCircle(graph);
System.out.println("CRL: " + circle);
var dist = new DijkstraShortestPath<String, Integer>(Integer.MAX_VALUE, 0, Integer::sum);
var distances = dist.distances(graph, "1");
var distances = dist.distances(graph, graph.getVertex("1"));
System.out.println("DST: " + distances);
graph = new StandardWeightLoader<String>()
.load(Objects.requireNonNull(Main.class.getResourceAsStream("/standard-weight.graph")), s -> s);
graph = new ParserText<String>()
.parse(Objects.requireNonNull(Main.class.getResourceAsStream("/standard-weight.graph")), s -> s, Integer::parseInt);
dist = new DijkstraShortestPath<>(Integer.MAX_VALUE, 0, Integer::sum);
distances = dist.distances(graph, "1");
distances = dist.distances(graph, graph.getVertex("1"));
System.out.println("DST: " + distances);
var path = new AntShortestPath<String, Integer>();
var shortest = path.shortestPath(graph, "1", "3");
var shortest = path.shortestPath(graph, graph.getVertex("1"), graph.getVertex("3"));
System.out.println("ANT: " + shortest);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,11 @@ interface CircleSearch<T, W extends Number & Comparable<W>> {

@FunctionalInterface
interface ShortestDistance<T, W extends Number & Comparable<W>> {

Map<Graph.Vertex<T, W>, W> distances(Graph<T, W> graph, String source);
Map<Graph.Vertex<T, W>, W> distances(Graph<T, W> graph, Graph.Vertex<T, W> source);
}

@FunctionalInterface
interface ShortestPath<T, W extends Number & Comparable<W>> {
List<Graph.Vertex<T, W>> shortestPath(Graph<T, W> graph, String source, String target);
List<Graph.Vertex<T, W>> shortestPath(Graph<T, W> graph, Graph.Vertex<T, W> source, Graph.Vertex<T, W> target);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public final class AntShortestPath<T, W extends Number & Comparable<W>> implemen
private final Parameters parameters = Parameters.started();

@Override
public List<Graph.Vertex<T, W>> shortestPath(Graph<T, W> graph, String source, String target) {
public List<Graph.Vertex<T, W>> shortestPath(Graph<T, W> graph, Graph.Vertex<T, W> source, Graph.Vertex<T, W> target) {
Matrix pheromones = new Matrix(graph.size(), parameters.kPheromone.doubleValue());
Colony<T, W> colony = new Colony<>(graph, source, target, parameters);
int counter = 0;
Expand Down Expand Up @@ -79,7 +79,6 @@ static final class Matrix {
@SuppressWarnings("PMD.UnusedPrivateField")
private static final class Ant<T, W extends Number & Comparable<W>> {
private final Random random;
private final Graph<T, W> graph;
private final Graph.Vertex<T, W> source;
private final Graph.Vertex<T, W> target;
private final Set<Graph.Vertex<T, W>> visited;
Expand All @@ -88,9 +87,8 @@ private static final class Ant<T, W extends Number & Comparable<W>> {
private Graph.Vertex<T, W> current;
private boolean canContinue;

private Ant(Random random, Graph<T, W> graph, Graph.Vertex<T, W> source, Graph.Vertex<T, W> target) {
private Ant(Random random, Graph.Vertex<T, W> source, Graph.Vertex<T, W> target) {
this.random = random;
this.graph = graph;
this.source = source;
this.target = target;
this.visited = new HashSet<>();
Expand All @@ -112,7 +110,7 @@ void step(Matrix pheromones, Parameters parameters) {
return;
}
List<Graph.Vertex<T, W>> neighbours = new ArrayList<>();
List<Graph.Edge<T, W>> edges = graph.getEdges(current);
List<Graph.Edge<T, W>> edges = current.edges();
edges.forEach(edge -> {
if (!visited.contains(edge.target())) {
neighbours.add(edge.target());
Expand Down Expand Up @@ -165,7 +163,7 @@ void step(Matrix pheromones, Parameters parameters) {
path.add(next);
visited.add(next);
Graph.Vertex<T, W> finalNext = next;
distance += graph.getEdges(current).stream().filter(e -> e.target().equals(finalNext))
distance += current.edges().stream().filter(e -> e.target().equals(finalNext))
.findAny().map(e -> e.weight().doubleValue()).orElse(0.);
current = finalNext;
}
Expand All @@ -179,7 +177,7 @@ private static final class Colony<T, W extends Number & Comparable<W>> {
private final List<Ant<T, W>> ants;


private Colony(Graph<T, W> graph, String source, String target, Parameters parameters) {
private Colony(Graph<T, W> graph, Graph.Vertex<T, W> source, Graph.Vertex<T, W> target, Parameters parameters) {
this.random = new Random();
this.graph = graph;
int size = graph.getVertices().size();
Expand All @@ -189,22 +187,21 @@ private Colony(Graph<T, W> graph, String source, String target, Parameters param
createAnts(source, target);
}

private void createAnts(String source, String target) {
private void createAnts(Graph.Vertex<T, W> source, Graph.Vertex<T, W> target) {
final int size;
if (source == null) {
size = graph.size();
} else {
size = graph.getEdges(source).size();
size = source.edges().size();
}
List<Graph.Vertex<T, W>> vertices = graph.getVertices();
int length = size * 2;
Graph.Vertex<T, W> targetVertex = graph.getVertex(target);
for (int i = 0; i < length; i++) {
if (source == null) {
int v = (int) random.nextDouble(size - 1);
ants.add(new Ant<>(random, graph, vertices.get(v), targetVertex));
ants.add(new Ant<>(random, vertices.get(v), target));
} else {
ants.add(new Ant<>(random, graph, graph.getVertex(source), targetVertex));
ants.add(new Ant<>(random, source, target));
}
}
}
Expand Down
Loading

0 comments on commit fb65fc8

Please sign in to comment.