Graphique 5-Coloration

14

Honnêtement, je ne peux pas croire que cela n'ait pas déjà été demandé, mais ici c'est

Contexte

Étant donné un simple plan non orienté graphique (le graphique peut être dessiné dans le plan sans intersections), il est prouvé que le graphique est quadri-colorable, un terme que nous explorerons un peu. Cependant, il est beaucoup plus facile de tracer un graphique en 5 couleurs, sur lequel nous concentrerons notre défi aujourd'hui.

Une coloration k valide d'un graphe est une affectation de "couleurs" aux nœuds du graphe avec les propriétés suivantes

  1. Si deux nœuds sont reliés par une arête, les nœuds sont colorés avec des couleurs différentes.
  2. Sur le graphique, il y a un maximum de 5 couleurs.

Compte tenu de cela, je vais vous présenter un algorithme assez basique pour colorier n'importe quel graphe planaire simple non dirigé. Cet algorithme nécessite les définitions suivantes

Accessibilité : si le nœud 1 est accessible à partir du nœud 2, cela signifie qu'il existe une séquence de nœuds, chacun connecté au suivant par un bord, de sorte que le premier nœud est le nœud 2 et le dernier est le nœud 1. Notez que, puisque les graphiques non orientés sont symétriques, si le nœud 1 est accessible à partir du nœud 2, le nœud 2 est accessible à partir du nœud 1.

Sous-graphique -graphe: un sous-graphe d'un graphe d'un ensemble donné de nœuds N est un graphe où les nœuds du sous-graphe sont tous en N, et une arête du graphe d'origine est dans le sous-graphe si et seulement si les deux nœuds sont connectés par l'arête sont en N.

Soit Color (N) une fonction pour colorer des graphes planaires à N nœuds à 5 couleurs. Nous définissons la fonction ci-dessous

  1. Trouvez le nœud avec le moins de nœuds connectés. Ce nœud aura au plus 5 nœuds connectés.
  2. Supprimez ce nœud du graphique.
  3. Appelez Couleur (N-1) sur ce nouveau graphique pour le colorer.
  4. Ajoutez le nœud supprimé au graphique.
  5. Si possible, coloriez le nœud ajouté d'une couleur qu'aucun de ses nœuds connectés n'a.
  6. Si ce n'est pas possible, alors les 5 nœuds voisins du nœud ajouté ont 5 couleurs différentes, nous devons donc essayer le processus suivant.
  7. Numéroter les nœuds entourant le nœud ajouté n1 ... n5
  8. Considérez le sous-graphique de tous les nœuds du graphique d'origine coloré de la même couleur que n1 ou n3.
  9. Si dans ce sous-graphique, n3 n'est pas accessible à partir de n1, dans l'ensemble de nœuds accessibles à partir de n1 (y compris n1), remplacez toutes les occurrences de la couleur de n1 par n3 et vice versa. Colorez maintenant la couleur d'origine du nœud ajouté n1.
  10. Si n3 était accessible à partir de n1 dans ce nouveau graphique, effectuez le processus à partir de l'étape 9 sur les nœuds n2 et n4, plutôt que n1 et n3.

Défi

Étant donné l'entrée d'une liste edgelist (représentant un graphique), coloriez le graphique, en attribuant à chaque nœud une valeur.

Entrée : une liste des bords du graphique (c.-à-d. [('a','b'),('b','c')...])

Notez que la liste de bord d'entrée sera telle que si (a, b) se trouve dans la liste, (b, a) ne se trouve PAS dans la liste.

Sortie : un objet contenant des paires de valeurs, où le premier élément de chaque paire est un nœud et le second sa couleur, c'est-à-dire, [('a',1),('b',2)...]ou{'a':1,'b':2,...}

Vous pouvez utiliser n'importe quoi pour représenter les couleurs, des nombres aux caractères, en passant par autre chose.

L'entrée et la sortie sont assez flexibles, tant qu'il est assez clair quelles sont les entrées et les sorties.

Règles

  • C'est un défi de
  • Vous n'êtes pas obligé d'utiliser l'algorithme que j'ai décrit ci-dessus. Il est simplement là pour référence.
  • Pour tout graphique, il existe souvent de nombreuses méthodes valides pour les colorer. Tant que la coloration produite par votre algorithme est valide, cela est acceptable.
  • N'oubliez pas que le graphique doit être en 5 couleurs.

Cas de test

Utilisez le code suivant pour tester la validité de vos résultats de coloration. Comme il existe de nombreuses couleurs de graphique valides par graphique, cet algorithme vérifie simplement la validité de la coloration. Voir la docstring pour voir comment utiliser le code.

Quelques cas de test aléatoires (et plutôt stupides) :

Cas de test 2: Krackhardt Kite Graph [(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]

Une sortie valide: {0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}

Remarque : Ces cas de test sont trop petits pour tester le comportement plus nuancé de l'algorithme de coloration, donc la construction de vos propres graphiques est probablement un bon test de la validité de votre travail.

Remarque 2 : je vais ajouter un autre morceau de code qui représentera bientôt votre solution de coloration.

Remarque 3 : Je n'ai pas prévu les algorithmes de coloration aléatoire qui ont été présentés, ce qui est si cool avec PPCG! Cependant, si quelqu'un pouvait jouer à un algorithme plus déterministe, ce serait très cool aussi.

Don mille
la source
3
Le graphe de Petersen et de Chvatal n'est-il pas non planaire?
Kroppeb
1
@NicHartley Il existe des opérations de transposition bien connues sur des matrices d'adjacence qui colorent efficacement les graphiques. J'attacherai un papier quand j'en trouverai un.
Don Thousand
1
Je pense que vous auriez mieux fait de restreindre les solutions au temps polynomial ou d'exiger un cas de test volumineux pour fonctionner avec succès afin de forcer les solutions à utiliser des algorithmes graphiques comme ce que vous semblez avoir à l'esprit.
xnor
2
@xnor Il me semble avoir appris ma leçon. Ça va! Penser hors des sentiers battus devrait être récompensé et non pénalisé.
Don Thousand
1
Oui, je sais, mais une question 4 coloration dois être conçu de telle sorte que les gens ne peuvent prendre que leurs réponses à cette question, le changement 5à 4, et les soumettre à nouveau.
Peter Taylor

Réponses:

6

Python 2 , 96 octets

i=0
g=input()
while 1:i+=1;c={k:i/4**k%4for k in sum(g,())};all(c[s]^c[t]for s,t in g)>0<exit(c)

Essayez-le en ligne!

gjeccc est une coloration valide.

L'entrée est planaire, il est donc toujours possible de trouver une coloration 4.

(Ainsi: cela trouve la coloration lexicographiquement la plus ancienne dans un sens, et le fait de manière très inefficace.)

kje4kmod4kje

Lynn
la source
Bel effort, mais je pense qu'il vous manque un composant. Qu'en est-il du cas où un nœud est entouré de 5 couleurs différentes?
Don Thousand
Je vais essayer de construire un cas de test pour briser cela
Don Thousand
Supposons qu'un nœud donné dans votre graphique soit entouré de 5 autres nœuds, dont vous avez déjà coloré les 5 couleurs qui vous sont autorisées.
Don Thousand
1
Mon code génère aléatoirement des colorations de graphique et les vérifie jusqu'à ce qu'il génère une coloration de graphique correcte, qu'il imprime ensuite à la sortie. Dans le cas où vous le décrivez, cela recommencerait et, espérons-le, ne colorerait pas ces 5 nœuds, les 5 couleurs disponibles.
Lynn
2
Maintenant, il vérifie toutes les couleurs dans l'ordre lexicographique :) donc c'est déterministe et O (5 ^ n), mais beaucoup plus lent pour la plupart des entrées.
Lynn
3

JavaScript (ES7), 80 76 74 octets

Sauvegardé 2 octets grâce à @Neil

Même approche que Lynn . Résout en 4 couleurs, numérotées de 0 à 3 .

a=>{for(x=0;a.some(a=>a.map(n=>z=c[n]=x>>n*2&3)[0]==z,c={});x++);return c}

Essayez-le en ligne!

Arnauld
la source
Si vous avez droit à un 4 coloris, alors pourquoi pas x>>n+n&3?
Neil
@Neil Ah oui, merci. J'ai été distrait par l'explication concernant le 5-coloriage et j'ai oublié que l'entrée pouvait être résolue en 4.
Arnauld
3

Brachylog , 38 octets

cd{∧4>ℕ}ᶻ.g;?z{tT&h⊇ĊzZhpT∧Zt≠}ᵐ∧.tᵐ≜∧

Essayez-le en ligne!

Explication

Example input: [["a","b"],["c","b"]]

cd                                       Concatenate and remove duplicates: ["a","b","c"]
  {∧4>ℕ}ᶻ.                               The output is this list zipped zith integers that
                                           are in [0..4]: [["a",I],["b",J],["c",K]]
         .g;?z                           Zip the output with the input:
                                           [[[["a",I],["b",J],["c",K]],["a","b"]],[["a",I],["b",J],["c",K]],["c","b"]]
              {               }ᵐ∧        Map for each element
               tT                        Call T the couple of nodes denoting an edge
                 &h⊇Ċ                    Take a subset of 2 elements in the head
                     zZ                  Zip and call it Z
                      ZhpT               The nodes in Z are T up to a permutation
                          ∧Zt≠           The integers in Z are all different color
                                 .tᵐ≜∧   Label the integers (i.e. colors) in the output so that
                                           it matches the set constraints
Fatalize
la source
1

Python 2 , 211 octets

def f(g):
 g={k:[(a,b)[a==k]for a,b in g if k in(a,b)]for k in sum(g,())};c={k:0 for k in g}
 for a,b in sorted(g.iteritems(),key=lambda a:len(a[1])):c={k:(c[k],c[k]+1)[c[a]==c[k]and k in b]for k in c}
 return c

Essayez-le en ligne!

Déterministe! Échouerait probablement sur des cas de test plus compliqués, mais je suis trop épuisé pour trouver un graphique pour lequel il échoue. Plus de cas de test et. Ou critique bienvenus!

Triggernométrie
la source
1

Nettoyer , 139 octets

import StdEnv,Data.List
$l#(a,b)=unzip l
#e=nub(a++b)
=hd[zip2 e c\\c<- ?e|all(\(a,b)=c!!a<>c!!b)l]
?[h:t]=[[n:m]\\n<-[0..4],m<- ?t]
?e=[e]

Essayez-le en ligne!

Génère toutes les colorations et renvoie la première valide.

Οurous
la source
1

Gelée , 23 octets

®iⱮⱮ³¤ịE€S
FQ©L4ṗÇÐḟḢ®ż

Essayez-le en ligne!

Force brute. Suppose que les nœuds sont étiquetés par des entiers.

dylnan
la source