Problème de mise en œuvre de la graph_coloring - m coloration problème
Je dois écrire un programme C++, ce qui permettra de déterminer combien de couleurs que je devrais utiliser de la couleur de graphes non orientés.
Aussi, je dois le faire à l'aide de l'algorithme du livre "les Fondations d'Algorithmes à l'aide de C++ pseudo-code".
Description du problème: Déterminer toutes les façons dans lequel les sommets dans un graphe non-dirigé peut être de couleur, en utilisant uniquement des m couleurs, de sorte que les sommets adjacents ne sont pas de la même couleur.
D'entrée: entiers positifs n et m, et un graphe non-dirigé contenant n sommets. Le graphique est représenté par un tableau à deux dimensions W, qui a à la fois de ses lignes et de colonnes indexées de 1 à n, où W [i] [j] est vrai si il existe une arête entre i-ème sommet et la j-ème sommet et false sinon.
De sortie: possible toutes les couleurs du graphique, à l'aide d'au plus m couleurs, de sorte que deux sommets adjacents sont de la même couleur. La sortie de chaque coloriage est un tableau vcolor indexés de 1 à n, où vcolor [i] est la couleur (un entier compris entre 1 et m) affectés à la i-ème sommet.
Là, nous avons algorithme:
void m_coloring (index i)
{
int color;
if (promising (i))
if (i == n)
cout << vcolor [1] through vcolor [n];
else
for (color = 1; color <= m; color++){ //Try every
vcolor [i + 1] = color; //color for
m_coloring (i + 1); //next vertex.
}
}
bool promising (index i)
{
index j;
bool switch;
switch = true;
j = 1;
while (j && switch){ //Check if an
if (W[i][j] && vcolor[i] == vcolor[j]) //adjacent vertex
switch = false; //is already
j++; //this color.
}
return switch;
}
Et commentaire à la fin: à la Suite de notre convention habituelle, n, m, W, et vcolor ne sont pas entrées, soit de routine. Dans une implémentation de l'algorithme, les routines seront définies localement dans une procédure simple qui a n, m, W et que des entrées, et vcolor définis localement. Le haut niveau de l'appel à m_coloring serait m_coloring( 0 )
Je commence à écrire ma propre mise en œuvre. Tout d'abord je tiens à dire que je ne suis pas bon programmeur C++, ce qui est plus, j'ai l'habitude d'utiliser JS et PHP, faiblement typé langues, donc je suis sûr qu'il ya beaucoup de choses que je pourrais faire mieux. Mais ce n'est pas le principal problème.
Problème est: le programme ci-dessus de commencer à travailler, j'écris graphique simple:
4 points, 4 bords
1 2
1 3
2 3
3 4
Prochaine, programme de commencer à utiliser checkFor() (j'ai prévu de l'utiliser pour() de chaque côté nombre de couleurs, mais à des fins de test, je l'utilise au statique, alors je l'ai utilisé 4.
Malheureusement, le lancement d'un programme m_coloring(), à côté de lancement prometteur() et... c'est la fin. - Je passer les trois dernières heures pour savoir, ce que je fais mal, peut-être plus du tout programmeur expérimenté est en mesure de m'expliquer ce que je dois faire et /ou ce que je fais mal...
Moyens aider, je vous remercie beaucoup.
Mon code de programme:
#include <iostream>
using namespace std;
bool **W;
int n, m = 0;
int v, e = 0;
int x, y = 0;
int *vcolor;
bool promising (int i)
{
int j = 1;
bool switcher = true;
while (j && switcher)
{
if ( W[i][j] && vcolor[i] == vcolor[j] )
{
switcher = false;
}
j++;
}
return switcher;
}
void m_coloring (int i)
{
int color;
if ( promising (i) )
{
if (i == n)
{
cout << vcolor [1] << " through " << vcolor [n];
}
else
{
for (color = 1; color <= m; color++)
{
vcolor [i + 1] = color;
m_coloring(i + 1);
}
}
}
}
void initArrays()
{
for( int i = 0; i < n; i++ )
{
W[ i ] = new bool[ n ];
vcolor[ i ] = 0;
}
}
void fillW()
{
for( int i = 0; i < n; i++ )
{
for( int j = 0; j < n; j++ )
{
if( !W[i][j] )
{
W[i][j] = false;
}
}
}
}
void askForEdges()
{
cout << "How many edges? ";
cin >> e;
cout << endl << "Write edges with pattern: [vertex_x][space][vertex_y]:" << endl;
for( int i = 0; i < e; i++ )
{
cin >> x >> y;
W[x][y] = true;
W[y][x] = true;
}
}
void specialMatrixPrint()
{
cout << endl;
int i, j;
for( i = 0; i < n; i++ )
{
for( int j = 0; j < n; j++ )
{
cout << W[i][j] << " ";
}
cout << endl;
}
}
void showEdgesMatrix()
{
int i, j = 0;
cout << endl << " "; for( i = 1; i < n; i++ ) { cout << i << " "; } cout << endl;
cout << endl << " "; for( i = 1; i < n; i++ ) { cout << "# "; } cout << endl;
for( i = 1; i < n; i++ )
{
cout << i << " # ";
for( int j = 1; j < n; j++ )
{
if( W[i][j] == true ) { cout << "1 "; }
else { cout << "0 "; }
}
cout << endl;
}
}
void showVcolor()
{
cout << endl;
for( int i = 1; i < n; i++ )
{
cout << i << ": " << vcolor[ i ] << endl;
}
}
void checkFor( int i )
{
m = i;
m_coloring( 0 );
}
int main()
{
cout << "How many vertexes? " ;
cin >> n;
n += 1;
W = new bool *[ n ];
vcolor = new int[ n ];
initArrays();
askForEdges();
showEdgesMatrix();
checkFor( 4 );
showVcolor();
cin >> y;
return 0;
}
- Il n'y a pas de vérification des limites dans
promising
. - Ok, j'ai vu cela avant, mais, quand j'ai mis la vérification des limites:
while (j && switcher) { if( j < k ) if ( W[i][j] && vcolor[i] == vcolor[j] ) { switcher = false; } j++; } else { switcher = false; } }
programme encore ne rien faire. J'ai aussi mis la vérification des limites pour:m_coloring( i + 1 )
if( !i + 1 < n )
ça n'aide pas...
Vous devez vous connecter pour publier un commentaire.
Vous avez tout un tas de problèmes, principalement dans prometteurs. La principale chose à retenir est que vous souhaitez comparer uniquement les nœuds qui ont eu leur jeu de couleurs, et de ne pas comparer n'importe quel nœud à lui-même. Vous pouvez aussi utiliser le fait que la matrice a été en promettant une récursivité moins profondes et utiliser le raisonnement inductif pour éviter de comparer toutes les paires.
Spoiler:
boolean = false
est coulé à la valeur 255, de sorte qu'il est plus grand que 0 et passe tout de tresorerie.fillW()
. Après l'ajout, ça fonctionne correctement dans VC2010.Il y a un bug dans l'algorithme. Dans la fonction
promising
il y a un beau tableau de dépassement de limite. Ils pensaient probablement quelque chose commej < n
ouj <= n
dans la condition du whilestatement
. Comme l'écrit, l'état n'a pas de sens.while (j < n && switcher)
mais comme je l'ai dit ci-dessus, il ne l'aide pas. Les couleurs de sortie sont les suivants: 0 0 0 0...la première fois que la fonction
m_coloring
est appelée aveci=1, vcolor[i+1] = color
qui estvcolor[2]=color
etvcolor[1]
est raté.. donc la prochaine fois que ça se vérifier par prometteurs interrupteur va retourner la valeur vrai pour toujours..L'algorithme est faux....
Regardez algorithme:
Nous devrions avoir un autre déclaration au bas de l'algorithme d'aller pour prodius une autre couleur pour w[i], Mais il passe au niveau suivant!!!!!!!!!.Je pense que c'est le problème