J'ai un algorithme assez complexe qui effectue une recherche où j'utilise une variable $search
dans une certaine plage [0,25 à 1,75].Comment puis-je surmonter la nature discrète d'un algorithme numérique qui saute actuellement un certain nombre réel dans une boucle?
Sur la base de l'algorithme, il est une chose « intéressante » se produit lorsque le $search
est exactement 1, parce qu'elle touche une configuration de variables qui est parfois (mais pas toujours) le plus favorable. Une partie du code dépend de $search
étant exactement 1 pour produire le résultat le plus favorable. Plus spécifiquement, il y a généralement une certaine valeur spécifique dans la plage de recherche, qui produit le résultat le plus favorable, mais la façon dont mon algorithme est présenté, cette valeur spécifique est le plus souvent ignorée. Ici, je présente par exemple lorsque cette valeur spécifique (en fonction d'autres entrées et la configuration), se trouve être exactement 1 ..
Le problème
Mathématiquement si $search
était continue plutôt que discrète, je n » J'ai ce problème. Mon problème est d'essayer de converger sur la configuration variable la plus favorable en utilisant des mathématiques discrètes. Le problème ici est l'algorithme. Le problème secondaire à surveiller est aussi l'arithmétique en virgule flottante, mais je ne crois pas que ce soit le problème ici.
Basic Loop:
$maxPowerOut = 0 ;
for ($increment = 0; $increment <= 500; $increment ++)
{
//vars computed elsewhere, i.e:
//MIN = 0.24651533;
//STEP = 0.00196969
$search = MIN + STEP * $increment;
//compute several coefficients (returns an array)
$coeff = $this->coefficient($search);
//design is a complex library function
list($a, $b) = $this->design($coeff);
$powerOut = $a * $b;
//keep track of max power (and other params, not shown)
if ($powerOut > $maxPowerOut)
$maxPowerOut = $PowerOut;
}
//currently prints 899.993 instead of 900 as should be expected
print "Max Power is $maxPowerOut";
Naturellement, $search
est presque jamais 1 exactement. Il va comme ceci:
- 0,99569478115682
- 0,99866447159913
- 1,0016341620414
- 1,0046038524837
- 1,0075735429261
- ...
Notez comment 1 est sautée sur en boucle au-dessus. Pour le bien de l'argument disons que la position la plus favorable se produit à 1.003000. Cette valeur (1.003000) serait également ignorée.
Question
Comment puis-je améliorer, restructurer, repenser, réorganiser, réécrire ma boucle pour éviter ce type de problème?