Bonjour ou Bonsoir,

Pour celles et ceux qui ne connaissent pas 10 couples parfaits :

10 femmes et 10 hommes doivent former, sans savoir lesquels, 10 couples déjà définis 'scientifiquement'.
Pour cela ils ont 2 possibilités :
  • proposer 10 couples à la cérémonie, il y a autant de projecteurs allumés que de couples parfaits, sans savoir lesquels
  • proposer un couple dans la Love Machine, qui indique si le couple est parfait ou pas.

Il y a aussi un facteur "relations humaines et affinités que je ne gère pas".

Grosso modo il y chaque semaine 1 cérémonie et 1 LoveMachine sur 10 semaines.

Si je ne dis pas de bêtises, il y a au début 10*9*8*7*6*5*4*3*2 = combinaisons.
Au fil des cérémonies et des LoveMachines, ça devrait diminuer.

J'ai l'ambition de faire un script php pour définir les possibles couples parfaits.

Voici mon approche, sans réelles connaissances mathématiques, scientifiques, en statistiques ou probabilités (et une rare pratique du php) :
  • une liste candidats : id_candidat, status, prénom
  • une liste couples : id_couple, status
  • une liste cérémonies : 10 * id_couple, nb_faisceau
  • une liste LoveMachine : id_couple, résultat.



Après réflexions, j'ai créé la liste des hommes numérotés de 100 à 190 et la liste des femmes numérotées de 200 à 209.
De ces 2 listes j'ai créé la listes des 100 couples possibles, numérotés de 300 à 399.
J'ai ajouté le numéro des personnes composant le couple plutôt que de le calculer à chaque fois.
J'ai fusionné les listes des personnes en une liste de candidats.

De la liste cérémonies j'ai extrait les résultats dans une liste projecteurs.

De la liste LoveMachine, je mets à jour l'état du couple dans la liste couples avec :
  • 1 : couple parfait
  • -2 : mauvais couple
  • 0 : par défaut c'est 0 pour indéfini


S'il y a un couple parfait :
  • dans la liste candidats je mets à 1 les 2 personnes du couples, sinon c'est 0 pour indéfini
  • dans la liste couples je mets -1 à chaque couples ayant une des 2 personnes du couple parfait


Jusque là c'est pas trop difficile.

Maintenant je croise ces résultats avec le nombre de faisceaux.
S'il y a autant de faisceaux que de couple parfait à une cérémonie, les autres couples sont mis à -3 dans la liste des couples.

J'affiche le résultat en 3 tableaux, cérémonies, LoveMachine, compatibilités, avec pour code couleur
  • vert : match parfait
  • rouge : mauvais match
  • vert foncé : couple impossible déduit des résultats de la LoveMachine
  • orange : couple impossible déduit des cérémonies, de la LoveMachine et des faisceaux
  • blanc : couple possible ou indéfini


Maintenant pour moi ça se complique : les prédictions.

Pour la première cérémonie j'en extrait la liste des couples possibles ayant pour valeur 0.
Je prends un couple de la liste, je lui mets la valeur 2 de couple en test et aux autres couples la valeur -4 pour couples indisponibles aux tests.
S'il n'y a pas de couple disponible, je le remplace par ##.

Idem pour les cérémonies suivantes.
Je propose ainsi des listes de couples répondant aux "contraintes".

Cette procédure est bancale, elle ne considère que s'il y a 0 ou 1 couple possible en fonction du résultat faisceaux et nombre de couples parfaits, or il peut y en avoir plusieurs pour une même cérémonie.
Pour exemple actuellement les cérémonies 7 et 8. Il y a déjà eut d'autres situations similaires les semaines précédentes (avec moins de résultats).
Il me faudra la réécrire.

A chaque liste il faudrait ajouter une liste les couples disponibles pour avoir 10 couples par liste.
Si possible ajouter le % de probable réussite pour chaque liste.

Par contre, il faudrait auparavant que je calcule le nombre de possibilité, et s'il y en a trop (à définir), je ne vais pas plus loin dans la procédure avec un message genre "il y a xxx possibilités, bien trop pour les afficher !".

Ma programmation est un peu empirique et très basique, sous php 5.4.24.
Voir le code ci-dessous.

J'accepte toutes propositions pour un meilleur code, plus complet et toutes suggestions pour terminer ce projet.

C'est pour un usage perso, donc pas de mysql, pas de formulaire de saisie pour les résultats de cérémonies ou LoveMachine, pas de fioritures pour la présentations des résultats, etc.
J'ouvre le code, j'y ajoute à la main au fur et à mesure les infos. Et d'ici la saison prochaine, peut-être que j'ajouterai 3 formulaires de saisie :
  • liste des participants
  • résultat LoveMachine
  • résultat cérémonie


Merci pour votre attention et vos remarques à venir.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8"/>
<title><title>-- 10 couples parfaits --</title></title>
<style>
td {vertical-align: top;  text-align:center;}
table table {
 border-width:1px; 
 border-style:solid; 
 border-color:black;
 }
</style>
</head>
<body>
<br>
<?php
$explications = 1; // 27 // affichage 1 = texte, 2 = cérémonies, 4 = loveMachine, 8 compatibilité, 16 = légendes
// on peu les ajouter pour plusieurs affichages, par exemple 1 + 2 + 8 + 16 = 27 
$bgco = array(  // couleurs pour affichage
	0 => '#99ffff',  // cyan
	1 => '#dddddd',  // gris clair
	7 => '#00ff00',  // vert        | Match Parfait
	4 => '#FF1a00',  // rouge       | Mauvais Match
	5 => '#559d55',  // vert foncé  | déduit love machine
	3 => '#FFA500',  // orange      | déduit cérémonie
	6 => '#ffffff',  // blanc       | couple possible
	8 => '#ff00ff',  // magenta     | couple en test
	2 => '#fc9dfc',  // parme       | test impossible
);
$ceremonies = array(
	array( 308 , 314 , 323 , 337 , 340 , 359 , 366 , 372 , 381 , 395 , 2 ),
	array( 306 , 314 , 323 , 332 , 340 , 357 , 369 , 378 , 381 , 395 , 2 ),
	array( 303 , 310 , 324 , 337 , 346 , 352 , 369 , 371 , 388 , 395 , 3 ),
	array( 303 , 310 , 328 , 332 , 345 , 357 , 369 , 374 , 381 , 396 , 4 ),
	array( 303 , 310 , 324 , 337 , 345 , 352 , 369 , 378 , 381 , 396 , 4 ),
	array( 303 , 311 , 327 , 330 , 348 , 352 , 369 , 375 , 381 , 396 , 3 ),
	array( 303 , 310 , 328 , 337 , 345 , 352 , 369 , 374 , 381 , 396 , 5 ),
	array( 303 , 310 , 325 , 337 , 348 , 352 , 369 , 374 , 381 , 396 , 6 )
);
foreach($ceremonies as $km => $cerem)
{	$projecteur[$km] = array_pop($ceremonies[$km]);
}
$lovemachine = array(
	397 => array( 0, 1),
	387 => array( 0, 2),
	353 => array( 0, 3),
	301 => array( 0, 4),
	303 => array( 1, 5),
	351 => array( 0, 6),
	369 => array( 1, 7),
	340 => array( 0, 8),
	395 => array( 0, 9),
	378 => array( 0, 10),
	314 => array( 0, 11),
	381 => array( 1 ,12),
	345 => array( 0 ,13)
);
// peut-être que je le modifierai en  lovemachine = array(array( 0,	397),array( 0, 387), etc.);
 
$candidats_H = array(
	100 => array( 0 , 'Abou / Nordin'),
	110 => array( 0 , 'Amhed / Dany'),
	120 => array( 0 , 'Alex'),
	130 => array( 0 , 'Anthony'),
	140 => array( 0 , 'Jordan'),
	150 => array( 0 , 'Giovanni'),
	160 => array( 0 , 'Nicolo'),
	170 => array( 0 , 'Tom'),
	180 => array( 0 , 'Triilio'),
	190 => array( 0 , 'Yohan')
);
$candidats_F = array(
	200 => array( 0 , 'Anissa'),
	201 => array( 0 , 'Chainez / Lola'),
	202 => array( 0 , 'Charlotte'),
	203 => array( 0 , 'Dorsaf'),
	204 => array( 0 , 'Lila'),
	205 => array( 0 , 'Manon'),
	206 => array( 0 , 'Marie'),
	207 => array( 0 , 'Romane'),
	208 => array( 0 , 'Sarah'),
	209 => array( 0 , 'Virginie')
);
foreach(array_keys($candidats_H) as $kH)
{	foreach (array_keys($candidats_F) as $kF)
	{	
		$couples[$kH + $kF] = array( 0 , $kH ,$kF);
	}
}
$candidats = $candidats_H + $candidats_F;
unset($candidats_H,$candidats_F);
/****************************************/
foreach($lovemachine as $kl => $data)
{	if($data[0] == 1)
	{	foreach($couples as $kc => $coup)
		{	if(($couples[$kc][0] == 0) AND (($couples[$kl][1] == $couples[$kc][1]) OR ($couples[$kl][2] == $couples[$kc][2])))
			{	$couples[$kc][0] =  -1 ;
			}
		}
		$candidats[$couples[$kl][0]][0] = $candidats[$couples[$kl][1]][0] = $couples[$kl][0] = 1;
	}
	else
	{
		$couples[$kl][0] = -2;
	}
}
// couples incompatibles que j'ai déduis des cérémonies semaine 2 : 332 357
// couples incompatibles que j'ai déduis des cérémonies semaine 6 : 327 330 348 352 375 396
// déductions à faire automatiquement par ce programme
foreach(array(327,330,332,348,352,357,375,396) as $kc)
{	$couples[$kc][0] = -3 ;
}
/****************************************/
$bugde = $explications;
$explications = 30;
foreach($couples as $data)
{	$compatible[$data[1]][$data[2]] = $data;
}
echo '<!---',__line__,'--->';
affiche_tableaux($couples,$compatible);
$explications = $bugde;
/****************************************/
$deduc = deduction(0,$couples,'');
/****************************************/
echo '<hr><table border=1  BORDERCOLOR="'.$bgco[5].'" bgcolor="'.$bgco[1].'">';
foreach($deduc['proposition'] as $k=>$v)
{	echo '<tr><td>'.$v.'</td></tr>';
}
echo '</table>';
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function affiche_tableaux($couples,$compatible,$text='')
{
	echo '<!---',__line__,'  affiche tableaux ---> 
	<table ><tr><td>';
	affiche_ceremonie($couples,$text);
	echo '</td><td>';
	affiche_lovemachine();
	echo'
	</td></tr>
	<tr><td colspan = 3><br>
	';
	affiche_compatible($compatible,$text);
	echo'
	</td></tr>
	<tr><td colspan = 3><br>
	';
	affiche_legende();
	echo'
	</td></tr></table>
	<br><hr><br>
	<!---',__line__,'  affiche tableaux ---> ';
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function deduction($sem,$listcouple,$erbra)
{
	$echo = ''; // pour affiche plus d'infos
	# la fonction est bancale
	global $ceremonies,$suivi,$arbre,$cumul,$candidats,$couples;
	$esm = 1+ $sem;
	static $incre = 0;
	if($sem > 0)
	{	
		$arbre[$sem] = $erbra;
	}
	@$visui = $arbre[1].$arbre[2].$arbre[3].$arbre[4].$arbre[5].$arbre[6].$arbre[7].$arbre[8].$arbre[9].$arbre[10].$arbre[11].$arbre[12];
	if($esm < sizeof($ceremonies))
	{	
		$echo .= '
		<hr>('.__line__.') <b>deductions semaine '.$esm.'</b>';
	}
	if($sem < sizeof($ceremonies))
	{	
		foreach($ceremonies[$sem] as $elus)
		{
			$duos[$elus] = $candidats[$couples[$elus][1]][1].' - '.$candidats[$couples[$elus][2]][1];
			$text = $visui.' - '.$duos[$elus].'  ===>  ';
			$echo .=  '<br>('.__line__.') '.$text;
			$maximum[$sem][$elus] = 0;
			if($listcouple[$elus][0] == 0)
			{
				$echo .= '<b> candidat </b>';
				$candidats[$sem][$elus] = $listcouple;
				$candidats[$sem][$elus][$elus][0] = 2;
			}
			else
			{	
				if($listcouple[$elus][0] > 0)
				{	//teste que le nombre de sélectionnés est oui ou non < aux faisceaux
					// à faire
				}
				$echo .= ' impossible';
			}
		}
		if(isset($candidats[$sem]))
		{	
			$keycand = array_keys($candidats[$sem]);
			foreach($candidats[$sem] as $elus => $paires)
			{
				$text = ' ['.$elus.'] '.$duos[$elus];
				$eh = $couples[$elus][1];
				$ef = $couples[$elus][2];
				foreach($paires as $pai => $res)
				{	
					if($elus != $pai)
					{
						$kh = $couples[$pai][1];
						$kf = $couples[$pai][2];
						if($res[0] == 0 AND ($kh == $eh OR $kf == $ef OR in_array($pai,$keycand)))
						{	
							$candidats[$sem][$elus][$pai][0] = -4; //-3;
						}
						$entest[$kh][$kf] = $candidats[$sem][$elus][$pai];
					}
				}
				$entest[$eh][$ef] = $candidats[$sem][$elus][$elus];
				ksort($entest[$eh]);
				echo '
<!---'.__line__.'---><br>';
				affiche_tableaux($candidats[$sem][$elus] , $entest , ' avec '.$visui.$text);
				global $explications;
				if(($explications & 1) == 1)
				{	echo $echo;
				}
				$trans = $candidats[$sem][$elus];
				$arbre = deduction($esm, $trans," [$duos[$elus]] ");
			}
		}
		else
		{
			$echo .=  '<br><br>';// ! ! !  pas de couple disponible pour la semaine :'.$esm;
			global $explications;
			if(($explications & 1) == 1)
			{	
				echo $echo;
			}
			$arbre = deduction($esm,$listcouple,' [ ## ] ');
		}
	}
	else
	{
		ksort( $arbre);
		foreach($arbre as $brebre)
		{
			$brebre = str_replace(array('  ','[',']','#'),'',$brebre);
			@$cumul[$brebre] += 1 ;
		}
		@$suivi[$incre++] = $arbre[0].$arbre[1].$arbre[2].$arbre[3].$arbre[4].$arbre[5].$arbre[6].$arbre[7];
		$arbre[$sem] = '';
	}
	if($sem == 0)
	{
		arsort($cumul);
		array_shift($cumul);
		array_shift($cumul);
		return(array('proposition'=>$suivi,'cumul'=>$cumul));
	}
	else
	{
		return ($arbre);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function affiche_lovemachine()
{	
	global $lovemachine,$bgco,$candidats,$couples;
	$match = array( $bgco[4],$bgco[7]);
	$echo = '
<!--- lovemachine --- '.__line__.' --->
	<table><tr bgcolor="'.$bgco[1].'"><th colspan = 3>love machine</th></tr>';
	foreach($lovemachine as $kl => $data)
	{
		$echo .= '<tr><td bgcolor="'.$bgco[1].'">'.$data[1].'</td><td bgcolor="'.$match[$data[0]].'">'.
		$candidats[$couples[$kl][1]][1]
		.'</td><td bgcolor="'.$match[$data[0]].'">'.
		$candidats[$couples[$kl][2]][1]
			.'</td></tr>';
	}
	$echo .= '</table>
<!--- lovemachine --- '.__line__.' --->';
	global $explications;
	if(($explications & 4) == 4)
	{
		echo $echo;
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function affiche_ceremonie($couple,$text='')
{	
	global $ceremonies,$projecteur,$bgco,$candidats;
	$width = 100;
	foreach($ceremonies as  $sem => $paires)
	{
		$esm = 1 + $sem;
		@$l[' '] .= '<td bgcolor="'.$bgco[1].'">'. $esm .'</td>';
		foreach($paires as $les)
		{
			$lor = 6 + $couple[$les][0];
			@$l[ $candidats[$couple[$les][1]][1] ] .= '<td bgcolor="'.$bgco[$lor].'">'.$candidats[$couple[$les][2]][1]  .'</td>';
		}
		@$l['faisceau'] .= '<td  width='.$width.'  bgcolor="'.$bgco[0].'">'. $projecteur[$sem] .'</td>';
	}
	$echo = '
<!--- affiche_ceremonie --- '. __line__ .' --->
	<table><tr bgcolor="'.$bgco[1].'"><th colspan = 15>	cérémonies  '.$text.'</th></tr>';
	foreach($l as $k=>$v)
	{
		$echo .= '<tr><td width='.$width.'  bgcolor="'.$bgco[1].'">'.$k.'</td>'.$v.'</tr>';
	}
	$echo .= '</table>
<!--- affiche_ceremonie --- '. __line__ .' --->';
	global $explications;
	if(($explications & 2) == 2)
	{
		echo $echo;
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function affiche_compatible($compatible,$text='')
{	
	global $bgco,$candidats;
	$homme = array_keys($compatible);
	$emmef = array_keys($compatible[$homme[0]]);
	array_unshift($emmef,' ');
	$width = 100;
	$echo = '
<!--- affiche_compatible --- '. __line__ .' --->
	<table width=100%>
		<tr bgcolor="'.$bgco[1].'"><th colspan = 15>compatibilités  '.$text.'</th></tr><tr bgcolor="'.$bgco[1].'">';
	foreach($emmef as $kf)
	{
		$echo .= '<td width='.$width.' >'.@$candidats[$kf][1].'</td>';
	}
	foreach($compatible as $kh => $tible)
	{
		$echo .= '<tr><td bgcolor="'.$bgco[1].'">'.	$candidats[$kh][1].'</td>';
		foreach($tible as $kf => $data)
		{
			$lor = 6 + $data[0]; 
			$rol = $kh + $kf;
			$echo .= '<td bgcolor="'.$bgco[$lor].'">'.$rol.'</td>';
		}
		$echo .= '</tr>';
	}
	$echo .= '</table>
<!--- affiche_compatible --- '. __line__ .' --->';
	global $explications;
	if(($explications & 8) == 8)
	{
		echo $echo;
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function affiche_legende()
{	
	global $bgco;
	$tabco = $bgco;
	array_splice($tabco,0,2);
	$legende = array(
		'#FF1a00' => 'Mauvais Match',
		'#559d55' => 'déduit love machine',
		'#ffffff' => 'couple possible',
		'#FFA500' => 'déduit cérémonie',
		'#00ff00' => 'Match Parfait',
		'#ff00ff' => 'couple en test',
		'#fc9dfc' => 'test impossible',
	);
	$echo = '
<!--- affiche_legende --- '. __line__ .' ---><br>
	<table width=100%><tr bgcolor="'.$bgco[1].'"><th colspan='.sizeof($legende).'>légende</th></tr><tr bgcolor="'.$bgco[1].'">';
	$width = 100 / sizeof($legende);
	foreach($tabco as $leg)
	{	$echo .= '<td width='.$width.'% bgcolor="'.$leg.'">'.$legende[$leg].'</td>';
	}
	$echo .= '</tr></table>
<!--- affiche_legende --- '. __line__ .' --->';
	global $explications;
	if(($explications & 16) == 16)
	{
		echo $echo;
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////