Alt-F4 n°27 - Concevoir l’inutile  12-03-2021

Écrit par pocarski, édité par stringweasel, Nanogamer7, Conor_, Therenas, Firerazer,
traduit par bev, relu par Firerazer

Sommaire

Cette semaine, Pocarski poursuit sa descente dans la folie des convoyeurs en s’intéressant aux équilibreurs universels. Le résultat est aussi délirant qu’inutile, alors vous pensez bien qu’on va se régaler !

Un 8-8 universel : Parfaitement équilibré, comme toutes choses devraient l’être pocarski

Récemment, j’ai fabriqué un tas de composants informatiques avec des convoyeurs et des répartiteurs. Cette semaine, je vais poursuivre mon obsession malsaine pour le déplacement d’objets en fabriquant quelque chose d’au moins un peu plus pratique : un équilibreur. Mais pourquoi devrais-je écrire un article entier sur la conception d’un équilibreur ? Eh bien, c’est parce que celui que nous allons fabriquer aujourd’hui n’est pas un équilibreur ordinaire !

Cet article ne s’attardera pas trop sur les principes de conception des équilibreurs, car nous utiliserons principalement des modèles préétablis et bien connus. Cependant, tous les équilibreurs ne sont pas équivalents et vous devez donc connaître certains termes :

  • Équilibré en entrée : prélève uniformément sur toutes les entrées. Particulièrement important lors de la fusion de nombreuses entrées en un petit nombre de sorties.
  • Équilibré en sortie : distribue uniformément vers toutes les sorties. Particulièrement important lorsque l’on divise un petit nombre d’entrées en beaucoup de sorties.
  • Débit limité : possède des goulots d’étranglement internes. La fusion de deux convoyeurs en un seul, puis leur séparation ultérieure en deux, est un exemple de système à débit limité. Un tel système a un débit maximal d’un seul convoyeur, même s’il y en a deux à l’entrée et à la sortie.
  • Débit illimité : c’est l’opposé, il n’a pas de goulot d’étranglement interne. Si x convoyeurs peuvent le traverser, ils le feront.

Tous les plans de cet article (et quelques autres) sont disponibles ici.

Introduction

Imaginez la situation suivante : vous êtes un nouveau joueur, et vous venez d’entendre parler de ces choses appelées “équilibreurs” et de leur grande utilité. Vous voulez séparer un convoyeur en trois. Vous devriez utiliser pour cela un équilibreur 1-3, mais vous ne connaissez pas encore ces dispositifs, alors à la place, vous tentez d’utiliser un équilibreur 4-4 avec une seule entrée et trois sorties connectées. Au lieu du rapport de sortie 1:1:1 attendu, vous vous retrouvez avec un rapport 1:1:2, et une grande déception :

Comment il ne faut pas utiliser un équilibreur

Avec cet article, je me suis fixé pour objectif de réaliser un équilibreur pour lequel cette sorte d’intuition fonctionne ; en d’autres termes, quelle que soit la configuration des entrées/sorties, toutes les sorties sont toujours égales, et toutes les entrées sont prélevées de manière équivalente. Ce type d’équilibreur est connu sous le nom d’”équilibreur universel”, un concept exploré et dénommé pour la première fois dans cet article par l’utilisateur Reddit u/tzwaan, qui est l’un des modérateurs du sousReddit de Factorio.

Les équilibreurs universels peuvent faire ce qu’aucun équilibreur ne devrait être en mesure de faire : quelle que soit la configuration, ils sont à la fois équilibrés en entrée, équilibrés en sortie, et illimités en débit ! Il s’agit d’un ensemble de propriétés que l’on pensait jusqu’à présent réservées à l’équilibreur 2-2, qui n’est qu’un simple répartiteur. L’inconvénient est qu’ils deviennent énormes.

Principes de conception

Réfléchissons à la manière de convertir un équilibreur 4-4 en un équilibreur 3-3. Pour ce faire, il suffit de renvoyer la sortie supplémentaire dans le premier répartiteur. Nous allons utiliser cette idée comme principe de base :

4-4 bouclé

Nous voulons le comportement suivant : lorsqu’une sortie commence à déborder, il faut que les objets en excès retournent automatiquement dans les entrées de l’équilibreur afin de maintenir un débit complet sur toutes les sorties. Comment faire ? C’est simple, nous utilisons des répartiteurs avec une priorité. En faisant en sorte que leur sortie non prioritaire envoie les objets vers la boucle, nous garantissons que le trop-plein, et seulement le trop-plein, ira par là. Nous devons également fusionner les objets issus de la boucle avec les entrées. Pour cela, nous avons encore une fois besoin de répartiteurs avec une priorité, mais cette fois-ci en entrée. Nous ajustons la boucle pour qu’elle soit l’entrée non prioritaire afin que les objets de la boucle n’interfèrent pas du tout avec l’entrée :

4-4 bouclé automatiquement

Après quelques tests, nous avons découvert un problème majeur. Si les objets de la boucle essaient d’entrer dans un convoyeur déjà plein, ils le saturent jusqu’au point de séparation et bloquent le système de trop-plein, ce qui nous ramène à la case départ :

4-4 bouclé automatiquement cassé

Pour éviter cela, nous devons nous assurer que chaque objet de la boucle peut atteindre chacune des sorties de la boucle. Cela peut être fait de plusieurs façons, mais pour nos besoins, nous cherchons à réduire au maximum le nombre de répartiteurs. Il se trouve que la façon la plus économique de le faire est d’utiliser un autre équilibreur. Ajoutons-le à la boucle :

4-4 corrigé

Nous avons maintenant un équilibreur 4-4 universel complètement fonctionnel. Cependant, il peut être amélioré. Grâce à certains mécanismes de l’équilibreur, nous n’avons en fait pas besoin de quatre convoyeurs pour la boucle. En général, nous avons besoin de trois convoyeurs de moins que ce pour quoi notre équilibreur est conçu. Cela signifie que nous pouvons optimiser notre équilibreur en réduisant les convoyeurs de la boucle à deux, puis en les divisant à nouveau :

4-4 universel

Maintenant, nous pouvons réorganiser les composants jusqu’à ce que nous obtenions quelque chose de compact, comme ceci :

4-4 universel compact

Cet équilibreur, bien que plutôt long, ne fait que six tuiles de large, ce qui signifie que vous pouvez le placer dans un bus standard à quatre convoyeurs, et avoir juste assez d’espace pour les empiler les uns à côté des autres. Il est important de noter que ceci n’est pas de ma conception, bien qu’il soit basé sur l’une des miennes. Malheureusement, j’ai perdu le nom du concepteur, donc je ne pourrai pas lui donner le mérite qui lui revient.

Conception améliorée

Maintenant, essayons quelque chose de plus grand : un 8-8 universel. Nous commençons par suivre les mêmes étapes que pour notre 4-4, sauf que nous utilisons des équilibreurs 8-8 à la place. Voilà à quoi nous arrivons :

8-8 universel basique

Malheureusement, le 8-8 universel que nous obtenons de cette manière est imparfait. Contrairement à l’équilibreur 4-4 standard, l’équilibreur 8-8 standard a un débit limité, ce qui limite le débit de l’équilibreur 8-8 universel dans son ensemble. Voici une situation qui provoque ce goulot d’étranglement :

8-8 basique bloqué

Comme vous pouvez le voir, six convoyeurs d’entrée et de sortie sont disponibles, mais moins de six parviennent à passer. Heureusement, ce problème est facilement résolu en remplaçant simplement l’équilibreur central par un équilibreur à débit illimité :

8-8 universel correct

Remarquez que l’équilibreur secondaire peut lui rester limité en termes de débit car son seul rôle est de permettre aux objets d’accéder à tous les convoyeurs en entrée. Maintenant, nous pourrions essayer d’utiliser notre astuce de compression de la boucle, mais nous aurions besoin de comprimer huit convoyeurs en cinq, puis de les diviser à nouveau en huit. Or cela nécessite beaucoup plus de répartiteurs que si l’on se contente de renoncer à la compression et d’équilibrer les huit bandes directement. Vu que nous utilisons des convoyeurs bleus, nous pouvons utiliser le tissage de convoyeurs souterrains et comprimer les huit convoyeurs bleus de la boucle dans deux couloirs de deux tuiles de large de chaque côté :

8-8 universel compact

L’ensemble est méconnaissable, mais c’est parce que l’équilibreur secondaire est maintenant aligné avec l’équilibreur principal, ce qui signifie que nous devons gérer jusqu’à douze courroies comprimées dans un espace de huit tuiles de large, ce qui oblige l’équilibreur secondaire à être extrêmement étalé. Lorsque nous passons des convoyeurs bleus aux convoyeurs rouges, nous pouvons également complètement abandonner le tissage des souterrains, et simplement utiliser quelques souterrains bleus pour obtenir huit convoyeurs rouges dans un espace de quatre. Cela facilite également le passage aux convoyeurs jaunes, même si nous devons toujours utiliser des souterrains rouges et bleus :

Un 8-8 universel bleu, rouge et jaune

Il est tout à fait possible de créer un modèle avec des convoyeurs jaunes sans souterrains bleus, mais cela rendrait l’ensemble beaucoup plus long. Il est également possible de réaliser les modèles en rouge ou en jaune sans aucun souterrain de niveau supérieur, mais cela rendrait l’ensemble 33 % plus large et qui sait de combien plus long.

Explications finales

J’ai intentionnellement laissé quelques mystères dans cet article, car certains étaient trop compliqués à expliquer dans la démarche, et pour d’autres, je ne les comprends pas très bien moi-même. C’est dans cette partie que vais (tenter de) les éclaircir, alors je vous préviens que certains aspects techniques vous attendent.

  • Comment savez-vous qu’un équilibreur est le moyen le plus efficace de distribuer des objets sur des convoyeurs ?

On peut prouver cela par induction. Premièrement, imaginons que nous avons déjà le distributeur le plus efficace possible pour 2N-1 convoyeurs, nous l’appellerons le “petit distributeur”. Maintenant, ajoutons une rangée de répartiteurs pour diviser chacune de ses sorties en 2. Nous avons maintenant un distributeur 2N-1-2N. Pour avoir le bon nombre d’entrées, copions le petit distributeur et envoyons ses sorties vers les entrées restantes de la rangée de répartiteurs ajoutée. Nous avons maintenant un distributeur 2N-2N avec le plus petit nombre possible de répartiteurs. Maintenant, nous disons simplement qu’un distributeur 2-2 est un simple répartiteur, ce qui est évidemment le plus efficace. Cet algorithme de génération de distributeurs efficaces est identique à l’algorithme de génération des équilibreurs les plus simples possible, et vous êtes libre de vérifier cela par vous-même.

  • Comment garantissez-vous l’équilibrage des entrées ?

Pour tout équilibreur N-N, si aucune sortie n’est saturée, elles ont toutes le même débit, quelles que soient les entrées. De même, si aucune entrée n’est en manque, elles ont toutes le même débit, quelles que soient les sorties. Tant que la boucle de retour a une capacité suffisante pour alimenter toutes les entrées manquantes, il y aura un équilibrage des entrées.

  • Pourquoi trois convoyeurs en moins dans la boucle ?

Pour être honnête, je ne le comprends pas vraiment moi-même. C’est un résultat obtenu expérimentalement, et cela a quelque chose à voir avec le fait que trois est le plus petit nombre qui ne divise pas 2N, ce qui fait de trois sorties ouvertes le pire cas que la boucle doit gérer. Cependant, je ne peux pas expliquer pourquoi le premier et le deuxième n’ont pas besoin d’un débit de boucle complet. Si quelqu’un veut se porter volontaire pour m’aider à faire ces calculs, je lui en serai plus que reconnaissant.

Conclusion

Nous avons jeté un regard plus ou moins superficiel sur le monde de l’équilibrage universel. Nous aurions pu approfondir le sujet, en explorant le théorème N-3, mais je ne pense pas que les équilibreurs universels soient suffisamment utiles pour le justifier. Il s’agit plus d’un jouet et d’une curiosité que d’un outil applicable à des problèmes réels. Je ne vois que deux cas d’utilisation potentiels pour un équilibreur universel, l’un étant le chargement/déchargement de trains de longueur variable, et l’autre étant le souhait de ne pas avoir à parcourir des livres de plans d’équilibreurs. Les équilibreurs universels (et en fait, tous les équilibreurs) sont tout simplement trop volumineux et ne présentent pas assez d’avantages, et vous devriez de toute façon plutôt utiliser des compresseurs à convoyeurs basés sur les priorités. L’équilibreur universel 8-8 est une expérience de ce qui peut être fait avec des convoyeurs (c’est presque comme si c’était un successeur spirituel de l’additionneur et de la mémoire à base de convoyeurs) et n’est pas destiné à être utilisé de manière utile. Si vous parvenez à lui trouver une utilisation, faites-le moi savoir, car je suis moi-même très curieux de savoir à quoi peut servir cette monstruosité. Vous êtes également invités à essayer de réduire la taille des modèles présentés si vous êtes un maniaque absolu et que vous avez beaucoup trop de temps libre.

Contribuer

Comme toujours, nous attendons vos contributions pour les Alt-F4, que cela soit par la soumission d’un article ou en aidant pour les traductions. Si vous avez quelque chose d’intéressant en tête que vous souhaitez partager avec la communauté, vous êtes au bon endroit. Si vous n’êtes pas sûr, nous serons heureux de vous aider en discutant structure, contenu et idées. Donc si vous voulez vous impliquer dans les Alt-F4, rejoignez-le Discord pour ne rien rater !