Implementation probleme ouvert rendu final

This commit is contained in:
Bensouda Idriss 2023-05-24 13:41:49 +02:00
parent ac09b33f99
commit 915e7e7da4
16 changed files with 312 additions and 3 deletions

View file

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View file

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View file

@ -8,6 +8,7 @@ import java.util.Set;
import java.util.TreeSet;
import org.insa.graphs.algorithm.shortestpath.AStarAlgorithm;
import org.insa.graphs.algorithm.shortestpath.Autonomie;
import org.insa.graphs.algorithm.shortestpath.BellmanFordAlgorithm;
import org.insa.graphs.algorithm.shortestpath.DijkstraAlgorithm;
import org.insa.graphs.algorithm.shortestpath.ShortestPathAlgorithm;
@ -32,6 +33,8 @@ public class AlgorithmFactory {
registerAlgorithm(ShortestPathAlgorithm.class, "Bellman-Ford", BellmanFordAlgorithm.class);
registerAlgorithm(ShortestPathAlgorithm.class, "Dijkstra", DijkstraAlgorithm.class);
registerAlgorithm(ShortestPathAlgorithm.class, "A*", AStarAlgorithm.class);
registerAlgorithm(ShortestPathAlgorithm.class, "Autonomie", Autonomie.class);
// Register your algorithms here:
// registerAlgorithm(CarPoolingAlgorithm.class, "My Awesome Algorithm",

View file

@ -0,0 +1,175 @@
package org.insa.graphs.algorithm.shortestpath;
import org.insa.graphs.algorithm.AbstractSolution.Status;
import java.util.ArrayList;
import java.util.Collections;
import org.insa.graphs.algorithm.utils.BinaryHeap;
import org.insa.graphs.model.Arc;
import org.insa.graphs.model.Node;
import org.insa.graphs.model.Path;
import org.insa.graphs.model.Point;
public class Autonomie extends ShortestPathAlgorithm {
public Autonomie(ShortestPathData data) {
super(data);
}
public Label CreationLabel(Node x, Double cout, Arc parent){
ShortestPathData data = getInputData();
//On utilise Point.distance qui permet d'obtenir la distance à vol d'oiseau d'un point x vers un point destination
return new LabelStar(x,cout,parent,Point.distance(data.getGraph().get(x.getId()).getPoint(), data.getDestination().getPoint()));
}
@Override
protected ShortestPathSolution doRun() {
final ShortestPathData data = getInputData();
ShortestPathSolution solution = null;
int nombreRecharges = 0;
ArrayList<Label> List_Label = new ArrayList<Label>(data.getGraph().size()); //Liste de labels
BinaryHeap<Label> Tas = new BinaryHeap<Label>();
ArrayList<Arc> Arcs = new ArrayList<Arc>();
ArrayList<Integer> nodeRecharge = new ArrayList<Integer>();
/* Initialise nos label */
for (Node x: data.getGraph().getNodes())
{
if(x != data.getOrigin()){
Label a= CreationLabel(x,Double.MAX_VALUE,null);
List_Label.add(x.getId(), a);
}
else{
Label a = CreationLabel(data.getOrigin(), 0.0, null);
List_Label.add(data.getOrigin().getId(), a);
}
}
Tas.insert(List_Label.get(data.getOrigin().getId()));
Label x;
boolean recharge = false;
//Tant que le tas n'est pas vide et que notre destination n'est pas marquée (noir)
while (!List_Label.get(data.getDestination().getId()).isMarque() && !Tas.isEmpty()){
x = Tas.findMin();
x.setMarque(true);
Tas.deleteMin();
for(Arc suivant : x.getSommet().getSuccessors()){
// Small test to check allowed roads...
if (!data.isAllowed(suivant)) {
continue;
}
// On récupère le label correspondant au sommet destination de notre arc suivant
Label l=List_Label.get(suivant.getDestination().getId());
if(!l.isMarque()){
Boolean changé = false;
if(suivant.getRoadInformation().getType().toString() == "MOTORWAY" && x.getParent() != null){
if (x.getParent().getRoadInformation().getType().toString() != "MOTORWAY"){
if (x.getDerniereRecharge() >= x.getParcoursSansRecharge() ){
l.setEnleverRecharge(true);
x.setEnleverRecharge(true);
}
}
}
//On vérifie si le coût sera amélioré avec notre label destination
if (x.getRealCost()+data.getCost(suivant) < l.getRealCost() && suivant.getRoadInformation().getType().toString() == "MOTORWAY"){
changé = true;
if (x.getAutonomie() < data.getCost(suivant)/1000){
l.setAutonomie(50);
l.setRecharge(true);
} else {
l.setAutonomie(x.getAutonomie()-data.getCost(suivant)/1000);
l.setRecharge(false);
}
}else if (x.getRealCost()+data.getCost(suivant) < l.getRealCost() && x.getParent() != null) {
if (x.getParent().getRoadInformation().getType().toString() == "MOTORWAY") {
changé = true;
l.setAutonomie(50);
l.setRecharge(true);
l.setDerniereRecharge(x.getAutonomie());
l.setParcoursSansRecharge(0);
}else {
changé = true;
if (x.getParcoursSansRecharge() != Double.MAX_VALUE) {
l.setParcoursSansRecharge(x.getParcoursSansRecharge()+data.getCost(suivant)/1000);
}
l.setDerniereRecharge(x.getDerniereRecharge());
l.setAutonomie(x.getAutonomie()-data.getCost(suivant)/1000);
l.setRecharge(false);
}
} else if (x.getRealCost()+data.getCost(suivant) < l.getRealCost()) {
changé = true;
l.setAutonomie(x.getAutonomie()-data.getCost(suivant)/1000);
l.setRecharge(false);
}
//Si oui, si le label à déjà été atteint, on le sort du tas, met à jour ses attributs et le réinsère
if(changé && l.getAutonomie() > 0){
if (l.getRealCost() != Double.MAX_VALUE){
Tas.remove(l);
l.setCost(x.getRealCost()+data.getCost(suivant));
Tas.insert(l);
l.setParent(suivant);
}
//Sinon, on met juste à jour ses attributs et l'insère dans le tas
else{
l.setCost(x.getRealCost()+data.getCost(suivant));
Tas.insert(l);
l.setParent(suivant);
}
notifyNodeReached(suivant.getDestination());
}
}
}
}
System.out.println(recharge);
//On récupère le chemin (liste d'arcs) de la destination vers la source
Label dest =List_Label.get(data.getDestination().getId());
//Si on n'a pas de parent ou que la destination = origin on renvoie une solution avec status() infaisable
if (dest.getParent() == null || data.getOrigin()==data.getDestination()) {
return solution = new ShortestPathSolution(data, Status.INFEASIBLE);
}
else {
// The destination has been found, notify the observers.
notifyDestinationReached(data.getDestination());
double cost = 0;
String type = "";
while (dest.getParent() != null){
Arcs.add(dest.getParent());
dest = List_Label.get(dest.getParent().getOrigin().getId());
if (dest.isRecharge()){
nombreRecharges++;
nodeRecharge.add(dest.getParent().getOrigin().getId());
System.out.println(cost + " " + type);
System.out.println("parcours sans recharge : " + dest.getParcoursSansRecharge());
System.out.println("derniere recharge : " + dest.getDerniereRecharge());
if (dest.isEnleverRecharge()){
System.out.println("une node recharge à enlever");
}
} else{
if (dest.getParent()!=null){
cost = data.getCost(dest.getParent());
type =dest.getParent().getRoadInformation().getType().toString();
}
}
}
}
System.out.println("nombre de recharges : " + nombreRecharges);
System.out.println("Liste des noeuds de Recharge : " + nodeRecharge);
//On inverse la liste d'arcs
Collections.reverse(Arcs);
//On construit la solution
solution = new ShortestPathSolution(data, Status.OPTIMAL, new Path(data.getGraph(), Arcs));
return solution;
}
}

View file

@ -44,6 +44,7 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm {
}
Tas.insert(List_Label.get(data.getOrigin().getId()));
Label x;
boolean recharge = false;
//Tant que le tas n'est pas vide et que notre destination n'est pas marquée (noir)
while (!List_Label.get(data.getDestination().getId()).isMarque() && !Tas.isEmpty()){
x = Tas.findMin();
@ -86,6 +87,7 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm {
}
}
System.out.println(recharge);
//On récupère le chemin (liste d'arcs) de la destination vers la source
Label dest =List_Label.get(data.getDestination().getId());

View file

@ -9,14 +9,22 @@ public class Label implements Comparable<Label> {
private boolean marque;
private double cost;
private Arc parent;
private double autonomie;
private double derniereRecharge;
private double parcoursSansRecharge;
private boolean recharge;
private boolean enleverRecharge;
public Label(Node sommet, double cost, Arc parent) {
this.sommet = sommet;
this.marque = false;
this.cost = cost;
this.parent = parent;
this.autonomie = 50;
this.derniereRecharge = 0;
this.parcoursSansRecharge = Double.MAX_VALUE;
this.recharge = false;
this.enleverRecharge = false;
}
@Override
@ -47,6 +55,22 @@ public class Label implements Comparable<Label> {
return result;
}
public double getDerniereRecharge() {
return derniereRecharge;
}
public void setDerniereRecharge(double derniereRecharge) {
this.derniereRecharge = derniereRecharge;
}
public double getParcoursSansRecharge() {
return parcoursSansRecharge;
}
public void setParcoursSansRecharge(double parcoursSansRecharge) {
this.parcoursSansRecharge = parcoursSansRecharge;
}
public Node getSommet() {
return sommet;
}
@ -57,6 +81,14 @@ public class Label implements Comparable<Label> {
return cost;
}
public boolean isRecharge() {
return recharge;
}
public void setRecharge(boolean recharge) {
this.recharge = recharge;
}
public double getRealCost()
{
return cost;
@ -81,10 +113,30 @@ public class Label implements Comparable<Label> {
}
public double getAutonomie() {
return autonomie;
}
public void setParent(Arc parent) {
this.parent = parent;
}
public void setAutonomie(double autonomie) {
this.autonomie = autonomie;
}
public double getCost() {
return cost;
}
public boolean isEnleverRecharge() {
return enleverRecharge;
}
public void setEnleverRecharge(boolean enleverRecharge) {
this.enleverRecharge = enleverRecharge;
}

View file

@ -9,6 +9,7 @@
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
@ -28,5 +29,29 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View file

@ -0,0 +1,2 @@
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=false

View file

@ -4,5 +4,6 @@ org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8

View file

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View file

@ -23,5 +23,35 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View file

@ -0,0 +1,2 @@
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=false

View file

@ -4,5 +4,6 @@ org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8

View file

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1