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;

}

}

}

相关推荐
kingwebo'sZone1 分钟前
C#使用Aspose.Words把 word转成图片
前端·c#·word
熊文豪6 分钟前
探索CANN ops-nn:高性能哈希算子技术解读
算法·哈希算法·cann
froginwe117 分钟前
Python3与MySQL的连接:使用mysql-connector
开发语言
熊猫_豆豆23 分钟前
YOLOP车道检测
人工智能·python·算法
杜子不疼.27 分钟前
PyPTO:面向NPU的高效并行张量编程范式
开发语言
lly20240627 分钟前
C# 结构体(Struct)
开发语言
艾莉丝努力练剑37 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
YMWM_38 分钟前
python3继承使用
开发语言·python
大空大地20261 小时前
表达式与运算符
c#