C#,数值计算——Dynpro的计算方法与源程序

给定向量nstate,其整数值是每个状态中的状态数阶段(第一和最后阶段为1),并给定函数成本(j,k,i)返回在阶段i的状态j和的状态k之间移动的成本阶段i+1,此例程返回与nstate长度相同的向量包含最低成本路径的状态号。状态数从0开始,并且返回向量的第一个和最后一个分量将因此总是0。

Given the vector nstate whose integer values are the number of states in each stage(1 for the first and last stages), and given a function cost(j, k, i)that returns the cost of moving between state j of stage i and state k ofstage i+1, this routine returns a vector of the same length as nstatecontaining the state numbers of the lowest cost path. States number from 0,and the first and last components of the returned vector will thus always be 0.

using System;

namespace Legalsoft.Truffer

{

/// <summary>

/// Given the vector nstate whose integer values are the number of states in each

/// stage(1 for the first and last stages), and given a function cost(j, k, i)

/// that returns the cost of moving between state j of stage i and state k of

/// stage i+1, this routine returns a vector of the same length as nstate

/// containing the state numbers of the lowest cost path. States number from 0,

/// and the first and last components of the returned vector will thus always be 0.

/// </summary>

public abstract class Dynpro

{

public Dynpro()

{

}

public abstract double cost(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[] answer = new int[nstage + 1];

if (nstate[0] != 1 || nstate[nstage] != 1)

{

throw new Exception("One state allowed in first and last stages.");

}

double[,] best = new double[nstage + 1, nstate[0]];

best[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;

}

}

best[i, k] = b;

}

}

answer[nstage] = answer[0] = 0;

for (int i = nstage - 1; i > 0; i--)

{

int k = answer[i + 1];

double b = best[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))

{

break;

}

}

answer[i] = j;

}

return answer;

}

}

}

相关推荐
Shinom1ya_19 小时前
算法 day 42
数据结构·算法·leetcode
earthzhang202119 小时前
【2051】【例3.1】偶数
开发语言·数据结构·算法·青少年编程·图论
专注VB编程开发20年19 小时前
.net c#音频放大,音量增益算法防止溢出
算法·c#·音频处理·录音·音量增益·增益控制
专注VB编程开发20年19 小时前
.NET Reflector反编绎,如何移除DLL中的一个公开属性
开发语言·c++·c#
唯道行19 小时前
计算机图形学·6 OpenGL编程3 谢尔宾斯基垫与三维编程
人工智能·算法·计算机视觉·计算机图形学·三维·谢尔宾斯基垫
高山上有一只小老虎19 小时前
求最大连续bit数
java·算法
vxiam14xxx19 小时前
【Java Swing 项目】java 聊天系统
java·开发语言·python
Dylan的码园19 小时前
以二叉树问题为基础的递归调试学习(上)
java·学习·算法·leetcode·r-tree
少许极端19 小时前
算法奇妙屋(九)-栈
java·数据结构·算法·
CoovallyAIHub20 小时前
未来已来:从 CVPR & ICCV 观察 2025→2026 年计算机视觉的七大走向
深度学习·算法·计算机视觉