Skip to content
Snippets Groups Projects
Commit 5400343c authored by OUATTARA Sie's avatar OUATTARA Sie
Browse files

correction de la methode solutionFractionnelle et explore_from

parent 2b35d353
No related branches found
No related tags found
2 merge requests!2Implémentation finalisée,!1Dev1
This commit is part of merge request !1. Comments created here will be created in the context of that merge request.
No preview for this file type
......@@ -2,7 +2,7 @@ import java.util.List;
public class App {
public static void main(String[] args) throws Exception {
Backpack backpack= new InstanceReader().read("src/sac2");
Backpack backpack= new InstanceReader().read("src/sac4");
backpack.solve();
System.out.println("meilleur solution :" + backpack.getBestValue());
}
......
......@@ -2,13 +2,9 @@ import java.util.Comparator;
import java.util.List;
public class Backpack {
private int capacity;
private List<Loot> loots;
private int sfValuee = 0;
private int sfWeight = 0;
private final int capacity;
private final List<Loot> loots;
private int bestValue = 0;
private boolean[] bestSolution;
private boolean[] currentSolution;
private int currentWeight = 0;
private int currentValue = 0;
......@@ -18,10 +14,9 @@ public class Backpack {
}
public void solve() {
bestSolution = new boolean[loots.size()];
currentSolution = new boolean[loots.size()];
solutionFractionnelle();
this.sortByRatio();
explore_from(0);
System.out.println("La valeur optimale est : " + bestValue);
}
public String toString(){
......@@ -35,21 +30,26 @@ public class Backpack {
loots.sort(Comparator.comparing(Loot::getRatio).reversed());
}
public void solutionFractionnelle(){
this.sortByRatio();
for(Loot loot : loots){
if(sfWeight + loot.getWeight() <= this.capacity){
public int solutionFractionnelle(int startIndex, int remainingCapacity) {
int sfValuee = 0;
int sfWeight = 0;
// On commence à partir de startIndex
for(int i = startIndex; i < loots.size(); i++) {
Loot loot = loots.get(i);
if(sfWeight + loot.getWeight() <= remainingCapacity){
// Si l'objet entier peut entrer dans le sac
sfValuee += loot.getValue();
sfWeight += loot.getWeight();
}
else {
// Si l'objet ne peut pas entrer entièrement dans le sac
int remainingWeight = this.capacity - sfWeight;
int remainingWeight = remainingCapacity - sfWeight;
sfValuee += (int) (loot.getRatio() * remainingWeight);
break;
}
}
return sfValuee;
}
private void explore_from(int index) {
......@@ -57,37 +57,33 @@ public class Backpack {
if (index >= loots.size()) {
if (currentValue > bestValue) {
bestValue = currentValue;
System.arraycopy(currentSolution, 0, bestSolution, 0, loots.size());
}
return;
}
// Si la valeur actuelle + la valeur restante possible (sfValuee - valeur déjà utilisée)
// est inférieure à la meilleure solution, on coupe la branche
if (currentValue + (sfValuee - currentValue) <= bestValue) {
// On calcule la borne supérieure pour ce nœud
int remainingCapacity = capacity - currentWeight;
int borneSuperieure = currentValue + solutionFractionnelle(index, remainingCapacity);
// Si la borne supérieure est inférieure à la meilleure solution
if (borneSuperieure <= bestValue) {
return;
}
// Branche gauche - avec l'objet
// on essaye d'explorer avec l'objet
Loot currentLoot = loots.get(index);
if (currentWeight + currentLoot.getWeight() <= capacity) {
currentSolution[index] = true;
currentWeight += currentLoot.getWeight();
currentValue += currentLoot.getValue();
explore_from(index + 1);
currentWeight -= currentLoot.getWeight();
currentValue -= currentLoot.getValue();
currentSolution[index] = false;
}
// Branche droite - sans l'objet
// on explore sans l'objet
explore_from(index + 1);
}
public int getSfValuee() {
return sfValuee;
}
public int getBestValue() {
return bestValue;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment