-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCSP.java
More file actions
203 lines (170 loc) · 5.87 KB
/
Copy pathCSP.java
File metadata and controls
203 lines (170 loc) · 5.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
package tp1;
import java.util.ArrayList;
import java.util.*;
/**
* Solveur : permet de résoudre un problème de contrainte par Backtrack :
* Calcul d'une solution,
* Calcul de toutes les solutions
*
*/
public class CSP {
private Network network; // le réseau à résoudre
private ArrayList<Assignment> solutions; // les solutions du réseau (résultat de searchAllSolutions)
private Assignment assignment; // l'assignation courante (résultat de searchSolution)
int cptr; // le compteur de noeuds explorés
/**
* Crée un problème de résolution de contraintes pour un réseau donné
*
* @param r le réseau de contraintes à résoudre
*/
public CSP(Network r) {
network = r;
solutions = new ArrayList<Assignment>();
assignment = new Assignment();
}
/********************** BACKTRACK UNE SOLUTION *******************************************/
/**
* Cherche une solution au réseau de contraintes
*
* @return une assignation solution du réseau, ou null si pas de solution
*/
public Assignment searchSolution() {
cptr=1;
// pretraitement
Assignment sol = backtrack();
System.out.println(cptr + " noeuds ont été explorés");
System.out.println(sol.toString());
return sol;
}
/* La methode bactrack ci-dessous travaille directement sur l'attribut assignment.
* On peut aussi choisir de ne pas utiliser cet attribut et de créer plutot un objet Assignment local à searchSolution :
* dans ce cas il faut le passer en parametre de backtrack
*/
/**
* Exécute l'algorithme de backtrack à la recherche d'une solution en étendant l'assignation courante
* Utilise l'attribut assignment
* @return la prochaine solution ou null si pas de nouvelle solution
*/
private Assignment backtrack() {
cptr++;
System.out.println(assignment.toString());
if (assignment.size()==network.getVarNumber()){
return assignment;}
String x=chooseVar(assignment);
for(int i=0;i<tri(network.getDom(x)).size();i++){
assignment.put(x,network.getDom(x).get(i));
//System.out.println("variable : "+x+" Valeur : " + network.getDom(x).get(i));
if (consistant(x)) {
if (backtrack() != null){
return assignment;
}
else {}// A IMPLANTER
}
}
return null;
}
/********************** BACKTRACK TOUTES SOLUTIONS *******************************************/
/**
* Calcule toutes les solutions au réseau de contraintes
*
* @return la liste des assignations solution
*
*/
public ArrayList<Assignment> searchAllSolutions(){
//cptr=1;
solutions.clear(); // SI ON CHOISIT DE TRAVAILLER DIRECTEMENT SUR L'ATTRIBUT SOLUTIONS
backtrackAll();
System.out.println("Nb solutions : " + solutions.size());
//System.out.println(cptr + " noeuds ont été explorés");
return solutions;
}
/**
* Exécute l'algorithme de backtrack à la recherche de toutes les solutions
* étendant l'assignation courante
*
*/
private void backtrackAll() {
if (assignment.size() == network.getVarNumber()){
Assignment a = assignment.clone();
solutions.add(a);
}
else {String x=chooseVar(assignment);
for(int i=0;i<tri(network.getDom(x)).size();i++){
assignment.put(x,network.getDom(x).get(i));
if (consistant(x)) {backtrackAll();}
assignment.remove(x);
}
}
}
// IMPLANTER l'UNE DES DEUX METHODES CHOOSEVAR CI-DESSOUS (SELON QUE L'ASSIGNATION COURANTE EST PASSEE EN PARAMETRE OU PAS)
/**
* Retourne la prochaine variable à assigner étant donné assignment (qui doit contenir la solution partielle courante)
*
* @return une variable non encore assignée
*/
private String chooseVar() {
System.err.println("Méthode chooseVar() à implanter !!!");
return null;
}
/*****************************************************************/
/**
* Retourne la prochaine variable à assigner étant donné la solution partielle passée en paramètre
*
* @param sol solution partielle courante
* @return une variable non encore assignée
*/
private String chooseVar(Assignment sol) {
return network.getVars().get(sol.size());
}
/**
* Fixe un ordre de prise en compte des valeurs d'un domaine
*
* @param values une liste de valeurs
* @return une liste de valeurs
*/
private ArrayList<Object> tri(ArrayList<Object> values) {
return values; // donc en l'état n'est pas d'une grande utilité !
}
// IMPLANTER l'UNE DES DEUX METHODES CONSISTANT CI-DESSOUS (SELON QUE L'ASSIGNATION COURANTE EST PASSEE EN PARAMETRE OU PAS)
/**
* Teste si l'assignation courante stokée dans l'attribut assignment est consistante, c'est à dire qu'elle
* ne viole aucune contrainte.
*
* @param lastAssignedVar la variable que l'on vient d'assigner à cette étape
* @return vrai ssi l'assignment courante ne viole aucune contrainte
*/
private boolean consistant() {
for(Constraint con : network.getConstraints()){
if(con.violation(assignment)){
return false;
}
}
return true;
}
/**
* Teste si l'assignation courante stockée dans assignment est consistante par rapport à sol, c'est à dire qu'elle
* ne viole aucune contrainte.
*
* @param sol solution partielle courante
* @param lastAssignedVar la variable que l'on vient d'assigner à cette étape
* @return vrai ssi l'assignment courante ne viole aucune contrainte
*/
/* private boolean consistant(Assignment sol, String lastAssignedVar) {
for(int i=0;i<network.getConstraints(lastAssignedVar).size();i++){
if (network.getConstraints(lastAssignedVar).get(i).violation(sol)){
return false;
}
}
return true;
}*/
private boolean consistant(String lastAssignedVar) {
for(Constraint con : network.getConstraints()){
if(con.getVars().contains(lastAssignedVar)){
if(con.violation(assignment)){
return false;
}
}
}
return true;
}
}