関数 f(x,y) (x と y は整数) を最小化するための提案があるかどうか疑問に思っていました。私は、BFGS やその他の GSL の手法、数値レシピの手法など、多くの最小化および最適化手法を研究してきました。これまでのところ、いくつかの異なるスキームを実装しようとしました。最初の作業は、最大の降下 f(x+1,y),f(x-1,y),f(x,y+1),f(x,y-1) の方向を選択し、その方向に従います。行の最小化で。また、ダウンヒル シンプレックス (Nelder-Mead) メソッドを使用してみました。どちらの方法も、最小値から遠く離れて行き詰まります。どちらも、放物面の最小値を見つけるなど、より単純な関数で機能するように見えますが、両方、特に前者は、x と y が実数値 (double) である関数用に設計されていると思います。もう 1 つの問題は、f(x,y) をできるだけ少ない回数呼び出す必要があることです。外部ハードウェアと通信し、呼び出しごとに数秒かかります。これについてのアイデアは大歓迎です。
エラー関数の例を次に示します。申し訳ありませんが、私は前にこれを投稿しませんでした. この関数の評価には数秒かかります。また、デバイスからクエリした情報は、目的の値を下回っている場合はエラーに追加されず、上にある場合にのみ追加されます
double Error(x,y)
{
SetDeviceParams(x,y);
double a = QueryParamA();
double b = QueryParamB();
double c = QueryParamC();
double _fReturnable = 0;
if(a>=A_desired)
{
_fReturnable+=(A_desired-a)*(A_desired-a);
}
if(b>=B_desired)
{
_fReturnable+=(B_desired-b)*(B_desired-b);
}
if(c>=C_desired)
{
_fReturnable+=(C_desired-c)*(C_desired-c);
}
return Math.sqrt(_fReturnable)
}