François Bergeret a écrit:
Quatrième chemin vers le boulier
Salut Lee,
JMP a une fonctionnalité très intéressante, les fonctions de désirabilité, qui peut également être utilisée pour résoudre le problème du boulanger.
- Création d'un jeu de données avec 4 nouvelles colonnes, une par couleur, avec des données aléatoires provenant d'une distribution normale: Random Normal () * 3
- Création de 5 nouvelles variables y, une par ligne, de y1 à y5, avec une formule pour lier les couleurs au total des lignes (par exemple, y1 = 5 noir + 5 bleu ...)
- Création de 100 000 lignes avec des données aléatoires pour les couleurs et les résultats y1 à y5
- Ajuster un modèle pour y1 à y5, avec les couleurs comme variables explicatives
- La plate-forme du modèle Emphasis in Fit est le filtrage d'effet, puis définissez l'opportunité à une cible de 12 pour chaque y (souhaitable = 1 lorsque y = 12, allant à 0 lorsque y est loin de 12)
- La tolérance de convergence dans les options de maximisation est définie sur 1E-12 pour obtenir des résultats numériques exacts pour le problème boulanger (quelques ms de plus).
- Maximiser l'opportunité donne: noir = 5, bleu = 1, brun = 3, rouge = 1,5
Jeu de données disponible sur demande
François Bergeret (de la France)
Ce blog a été écrit par un blogueur qui n'est plus chez SAS
Mes amis et collègues me connaissent comme un petit francophone. Je voyage en France aussi souvent que possible. Je travaille actuellement sur une maîtrise sur le sujet à la North Carolina State University. Et je garde tous les journaux et magazines français sur lesquels je mets la main.
Le Figaro est un journal quotidien qui ajoute un supplément, Le Figaro Magazine à son édition du samedi. Vous y trouverez des nouvelles sur l'art, des chroniqueurs et mon préféré: les jeux.
Je suis toujours étonné de voir à quel point les Français font des jeux simplement à partir de choses que nous considérons comme incroyablement amusantes. Par exemple, l'un des jeux du magazine concerne une lettre de Blaise Pascal à son frère, dans laquelle vous devez (a) compléter la lettre avec 16 mots donnés; (b) corriger 16 erreurs d'orthographe ou de langue; et (c) trouvez 15 anomalies, anachronismes ou impossibilités historiques.
L'un des jeux de chiffres m'a sauté dessus (jeu de mots). Voici le jeu que je vais résoudre en utilisant JMP, dans sa forme originale.
[ Trouve la valeur d'une balle de chaque couleur, sachant que le total des balles sur une ligne est toujours égal à 12]
Il y a au moins trois façons de résoudre ce problème - probablement plus, si je réfléchis à ces choses plus longtemps qu'il ne m'a fallu pour manger un Happy Meal ™ chez Chez McDo.
Méthode 1: force brute
Une approche très brutale consiste à parcourir toutes les couleurs possibles ( rouge = x , marron = y , noir = z. bleu = w ) reconnaissant qu'ils ne peuvent être inférieurs à zéro ni supérieurs à 12. Voici un script JMP qui fait cela: Quatre boucles For qui font défiler chaque valeur de 0 à 12 par incréments de 0,5. Quand il frappe un résultat, il écrit le résultat dans le journal.
For( x = 1, x <= 12, x += 0.5,
For( y = 1, y <= 12, y += 0.5,
For( z = 1, z <= 12, z += 0.5,
For( w = 1, w <= 12, w += 0.5,
If( 2 * z + 2 * w == 12,
If( z + 2 * y + w == 12,
If( 3 * y + 2 * x == 12,
If( z + y + 4 * w == 12,
If( z + w + 4 * x == 12,
Show( x, y, z, w );
)
)
)
)
)
)
)
)
)
Les resultats? rouge = 1,5 , marron = 3 , noir = 5. bleu = 1
Méthode 2: moindres carrés
La manière suivante consiste à reconnaître qu'il s'agit d'un problème de moindres carrés. Les valeurs attachées aux billes sont les coefficients d'un modèle linéaire, les billes elles-mêmes servant de données. Je peux donc créer un tableau de données JMP qui contient les cinq lignes et des informations sur les quatre billes colorées. En être témoin:
Et en utilisant la fenêtre Fit Model de JMP, je peux obtenir des estimations des moindres carrés sur les billes. J'utilise un modèle sans interception parce que je sais que le modèle linéaire doit passer par l'origine.
Comme ça ("Bam !," me dis-je), je reçois les résultats et la réponse au puzzle.
Méthode 3 Utiliser les maths
Si vous avez pris Algèbre II au cours des 40 dernières années, vous avez étudié ces choses appelées matrices. Il s'avère qu'ils sont réellement utiles. Et si vous ne reconnaissez pas le puzzle au sens des moindres carrés, il y a toujours cette façon mathématique de le regarder. Ne le dites à personne, mais c'est en fait la même approche: le calcul que vous voyez ci-dessous correspond à ce qui se passe dans les coulisses de JMP.
Si vous exprimez la configuration du puzzle en utilisant des matrices (cinq lignes représentant les cinq lignes du puzzle), vous pouvez faire en sorte que la table elle-même soit représentée ainsi (appelez-la UNE ).
A = [0 0 2 2
0 2 1 1
2 3 0 0
0 1 1 4
4 0 1 1]
et le fait que ces cinq conditions totalisent toutes 12, représentées par
C = [12
12
12
12
12]
avec une matrice finale b représentant les inconnues: la valeur des boules.
b = [x
y
z
w]
Pour résoudre ce problème, nous devons simplement commencer par
Un B = C
et obtenir b seul sur le côté gauche de l'équation. Typiquement, nous ferions la chose simple de multiplier les deux côtés par UNE -1 , comme ça:
UNE -1 Un B = UNE -1 C
Mais tu ne sais pas qu'il y a un problème. Comme le puzzle a quatre variables et cinq lignes, sa représentation matricielle n'est pas carrée. Donc, nous ne pouvons pas simplement utiliser un inverse ordinaire. On peut multiplier A par sa transposition pour obtenir une matrice carrée, bien que celle-ci ne soit toujours pas inversible. Heureusement, JMP a le Inverse généralisé de Moore-Penrose fonction (qui sonne mieux en italique, vous ne pensez pas?). En l’utilisant, je peux écrire un simple script JMP pour assigner les matrices et résoudre le problème:
A = [ 0 0 2 2, 0 2 1 1, 2 3 0 0, 0 1 1 4, 4 0 1 1];
C = [12, 12, 12, 12, 12];
ginverse(A`*A)*A`*C;
donnant le résultat (avec erreur d'arrondi, je suppose dans le processus d'inversion délicat)
[1.5, 3, 5.00000000000001, 0.999999999999994]
La même réponse. Et si les erreurs d'arrondi vous font perdre votre confiance, vous pouvez utiliser la fonction de résolution de JMP à la place.
A = [ 0 0 2 2, 0 2 1 1, 2 3 0 0, 0 1 1 4, 4 0 1 1];
C = [12, 12, 12, 12, 12];
solve((A`*A),A`*C);