各ステージの状態の数 (最初と最後のステージでは 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; 答えを返します 。 }
}
}