gestion_table_tournante_libre/test/fixtures/banc/pessimiste.js

79 lines
3.4 KiB
JavaScript
Raw Normal View History

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// La configuration pessimiste du coût du plafond a priori (§ 17, point 4) :
// la salle de la variante sans exception, 33 tables de 8, et 260 personnes
// qui portent chacune deux tours fixés, sur 10 tours. Le plafond a priori se
// mémoïse par signature — statut, ancrage, multiensemble des tables fixées
// (src/moteur/plafond.js) — : ici chaque personne a la sienne, et la
// programmation dynamique se refait 260 fois, chacune sur 8 tours libres.
// C'est le cas que la mémoïsation ne rattrape pas, là où les démonstrations
// livrées n'ont que quelques signatures.
//
// La personne de rang i, de 0 à 259, est fixée à la table a = i mod 33 au
// tour 1 + (i mod 10), et à la table b = (a + d) mod 33 au tour
// 1 + ((i + 5) mod 10), où d = 1 + ⌊i / 33⌋ va de 1 à 8. La paire {a, b}
// détermine (a, d) tant que d ≤ 16 : les 260 paires sont distinctes, et les
// 260 signatures aussi. Les deux tours d'une personne diffèrent de 5. Aucune
// table ne reçoit plus de 8 personnes fixées au même tour : le moteur la
// normalise sans SURRESERVATION. Personne n'a d'appartenance, et les quatre
// contraintes sont actives, comme dans les démonstrations.
//
// Les noms sont forgés : le produit de 20 prénoms et de 13 noms, hors des
// réservoirs de src/demo/noms.js.
/** Les nombres de la configuration, que ses épreuves affirment. */
export const FORME_PESSIMISTE = Object.freeze({ personnes: 260, tables: 33, capacite: 8, tours: 10 });
const PRENOMS = [
'Iris', 'Théo', 'Ondine', 'Basile', 'Capucine', 'Aurèle', 'Mélisande', 'Firmin', 'Clélia', 'Anselme',
'Bérénice', 'Cyprien', 'Daphné', 'Eudes', 'Flavie', 'Gaspard', 'Hortense', 'Ignace', 'Jacinthe', 'Lisandre',
];
const NOMS = [
'Ombrelle', 'Pervenche', 'Lacasse', 'Grisaille', 'Tourmaline', 'Arrosoir', 'Cerfeuil',
'Bruyère', 'Galet', 'Mistral', 'Sarriette', 'Quenouille', 'Vermeil',
];
/**
* La configuration pessimiste, sous la forme que le moteur reçoit
* (src/moteur/types.js › Configuration) : un objet neuf à chaque appel.
* Participants d'identifiants 1 à 260 ; tables d'identifiants et de numéros
* 1 à 33 ; réservations de portée « tour », deux par personne, dans l'ordre
* des personnes, la plus petite des deux tours d'abord.
*
* @returns {import('../../../src/moteur/types.js').Configuration}
*/
export function configurationPessimiste() {
const { personnes, tables, capacite, tours } = FORME_PESSIMISTE;
const participants = [];
const reservations = [];
for (let i = 0; i < personnes; i += 1) {
const id = i + 1;
participants.push({
id,
nom: NOMS[i % NOMS.length],
prenom: PRENOMS[Math.floor(i / NOMS.length)],
appartenance: null,
});
const a = i % tables;
const b = (a + 1 + Math.floor(i / tables)) % tables;
const fixations = [
{ table: a + 1, tour: 1 + (i % tours) },
{ table: b + 1, tour: 1 + ((i + 5) % tours) },
].sort((x, y) => x.tour - y.tour);
for (const { table, tour } of fixations) reservations.push({ participant: id, table, portee: 'tour', tour });
}
return {
participants,
tables: Array.from({ length: tables }, (_, t) => ({ id: t + 1, numero: t + 1, capacite })),
tours,
reservations,
contraintes: {
separerAppartenances: true,
nouveauxVoisins: true,
nouvelleTable: true,
varierAppartenances: true,
},
};
}