C#、数値計算 - Dynproの計算方法とソースプログラム

 

各ステージの状態の数 (最初と最後のステージでは 1) を整数値とするベクトル nstate が与えられ、与えられた関数cost(j,k,i) はステージ i の状態 j と状態 k を返します。ステージ i+1 の場合、このルーチンは、最低コスト パスの状態番号を含む nstate と同じ長さのベクトルを返します。状態の数は 0 から始まるため、返されるベクトルの最初と最後のコンポーネントは常に 0 になります。

各ステージの状態の数 (最初と最後のステージでは 1) を整数値とするベクトル nstate が与えられ、ステージ i の状態 j とステージ i の状態 j の間の移動コストを返す関数cost(j, k, i)が与えられるとします。ステージ i+1 の状態 k の場合、このルーチンは、最低コスト パスの状態番号を含む nstate と同じ長さのベクトルを返します。状態番号は 0 から始まるため、返されるベクトルの最初と最後のコンポーネントは常に 0 になります。

システムを使用する;

namespace Legalsoft.Truffer
{     /// <summary>     /// 整数値が各ステージの状態の数である     /// ベクトル nstate (最初と最後のステージでは 1) が与えられ、関数cost(j, k, i)     /// ステージ i の状態 j と /// ステージ i+1 の状態 k の間の移動コストを返します。このルーチンは、     /// の状態番号を含む     nstate と同じ長さのベクトルを返します。最も低コストのパス。状態番号は 0 から始まり、     /// したがって、返されるベクトルの最初と最後のコンポーネントは常に 0 になります。     /// </summary>     public abstract class Dynpro     {         public Dynpro()         {         }












        パブリック抽象二重コスト(int jj, int kk, int ii);

        public int[] dynpro(int[] nstate)
        {             const double BIG = 1.0e99;             const double EPS = float.Epsilon; //numeric_limits<double>.epsilon();             int nstage = nstate.Length - 1;             int[] 答え = 新しい int[nstage + 1];             if (nstate[0] != 1 || nstate[nstage] != 1)             {                 throw new Exception("最初と最後のステージで許可される状態は 1 つです。");             }







            double[,] best = new double[nstage + 1, nstate[0]];
            ベスト[0, 0] = 0.0;
            for (int i = 1; i <= nstage; i++)
            {                 for (int k = 0; k < nstate[i]; k++)                 {                     double b = BIG;                     for (int j = 0; j < nstate[i - 1]; j++)                     {                         double a = best[i - 1, j] +cost(j, k, i - 1);                         if ((a) < b)                         {                             b = a;                         ベスト[i, k]                     =                     b;                 }













            答え
            [nstage] = 答え[0] = 0;
            for (int i = nstage - 1; i > 0; i--)
            {                 int k = Answer[i + 1];                 double b = ベスト[i + 1, k];                 int j = 0;                 for (; j < nstate[i]; j++)                 {                     double temp = best[i, j] +cost(j, k, i);                     if (Math.Abs​​(b - temp) <= EPS * Math.Abs​​(temp))                     {                         ブレーク;                     答え[i                 ]                 = j;             答えを返します             。         }















    }
}
 

おすすめ

転載: blog.csdn.net/beijinghorn/article/details/132218897