nodjim a écrit:Oui Nicolas L, tu as bien résumé ce que Groucho et moi avons écrit. Je ne suis cependant pas en mesure de suivre ce qu'a écrit Groucho.
found better solution : 6
1111100000
1100011100
0011011010
0010110101
1000101011
0101000111
found better solution : 29
111110000000000
110001110000000
001101101000000
001011010100000
100010101100000
010100011100000
000110110010000
010011001010000
101000011010000
100101000110000
011000100110000
101001000001100
010100100001100
000010011001100
000111000001010
011000010001010
100000100011010
001010100000110
100100010000110
010001000100110
100100001001001
000001100101001
001010000011001
011000001000101
000110000100101
000001010010101
000000111000011
101000000100011
010100000010011
#include
#include
#include
#include
#include
#include
#include
template
class Combination{
public:
std::string toString() const{
return _v.to_string();
}
std::string toHumanString() const{
std::stringstream oss;
for(size_t i=0; i& other)const{
const typename Combination::bitVect &v=_v & other._v;
return v.count();
}
bool operator[](size_t pos)const{
return _v[pos];
}
typename std::bitset::reference operator[](size_t pos){
return _v[pos];
}
typedef std::bitset bitVect;
static const size_t size=T;
bitVect _v;
};
template
void combinatorial(std::deque >& ol, size_t k){
std::vector v(n);
std::fill(v.begin() + n - k, v.end(), true);
do {
Combination combination;
for (size_t i = 0; i
std::string toString(const std::deque >& ol){
std::string s;
for(typename std::deque >::const_iterator it=ol.begin();
it!=ol.end(); ++it){
s+=it->toString()+"\n";
}
return s;
}
template
class Combi{
public:
static const int value=(Combi::value*n)/k;
};
template
class Combi{
public:
static const int value=n;
};
template
class Matrix{
public:
Matrix():_v(n){};
Combination& operator[](size_t pos){
return _v[pos];
}
std::string toString()const{
std::string s;
for(size_t i=0;i > _v;
typedef Combination rowType;
};
template
void fill(Mat& m, const List &l){
for(size_t i=0;i
class SolutionDisplayer{
public:
SolutionDisplayer(T* aList):_list(aList){};
std::string toString(const std::set &solIndexes)const{
std::string s;
for(std::set::const_iterator it=solIndexes.begin(); it!=solIndexes.end();++it){
std::cout
class SolutionFinder{
public:
SolutionFinder(Mat* mat, Displayer s):_matrix(mat),_bestCount(0),_solutionDisplayer(s){}
class Solution{
public:
std::set _indexes;
std::bitset _intersect;
typedef std::set SolutionIndexes;
};
void explore(Solution s, size_t k){
Solution g;
g = s;
g._indexes.insert(k);
g._intersect = s._intersect & (*_matrix)[k]._v;
if(g._indexes.size() > _bestCount){
_bestCount = g._indexes.size();
_bestSolution = g;
std::cout find(){
Solution s;
s._indexes.insert(0);
s._intersect = (*_matrix)[0]._v;
for(size_t i=1;i
void compute(){
std::deque > aList;
combinatorial(aList, k);
Matrix::value> adjencyMatrix;
fill(adjencyMatrix, aList);
SolutionDisplayer > > solutionDisplayer(&aList);
SolutionFinder::value>,
SolutionDisplayer > >
> solutionFinder(&adjencyMatrix, solutionDisplayer);
solutionFinder.find();
}
int main() {
compute();
return 0;
}
fatal_error a écrit:salut Groucho,
comme j'ai pas lu ton poste parce que c'était un peu compliqué et que je savais pas si ca aboutissait,
j'ai continué de mon côté pour élaguer l'arbre de recherche.
La seule conclusion à laquelle je suis parvenu, est lors de l'exploration d'une nouvelle ligne, de regarder si le set courant + la nouvelle ligne forme un graphe isomorphe à un graphe déjà exploré.
J'ai pas encore mis en place, mais même avec une procedure plus rapide et plus destructive pour la comparaison de graphe, l'algo ne converge pas...
est-ce que tu peux détailler les solutions pour ton p qui marche, histoire de voir si ca tient!
---mis à part
une deuxième possibilité c'est de chercher à partir de la matrice d'adjacence à opérer des isomorphismes jusqu'à ce qu'on obtienne une matrice carrée de 1 dans un coin. (la plus grande possible). Mais bon, de là à trouver une telle suite...
soit y={e_j}
x*y=
pour i des e_i de x
pour j des e_j de y
si compatible(e_i,e_j)
ajouter {e_iUe_j}
//si rien ajouté, ensemble vide==0
proc compatible(e_i,e_j)
pour tout index k de e_j
si(k in e_i)
return false;
finsi
si exist combi de e_i tq combi(k) pas compatible
return false;
finsi
finpour
return true
finproc
fatal_error a écrit:au risque de paraitre un peu teubé,
tu sembles prendre le produit 5*5*5 correspondant aux valeurs possibles de a,b et c.
Mais si tu prends a=b=c=0
et a=b=c=1, tu as deux combinaisons qui sont pas compatibles (trois boules commun) non?
je suppose que x c'est les lignes et y les colonnes.
note à part:
comment peut on montrer que pour a!=b!=c, a,b,c dans {0,4} que a+b+c %5 c'est différent de a et b et c?
edit: c'est pas le cas pour
a b c d e
0 1 4 0 0
0 2 3 0 0
1 2 3 1 1
d==a+b+c
e==a+2b+3c
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :