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;

}

}

}

相关推荐
傻乐u兔9 分钟前
C语言进阶————指针4
c语言·开发语言
大模型玩家七七12 分钟前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
历程里程碑12 分钟前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
牛奔1 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
lly2024067 小时前
Bootstrap 警告框
开发语言
2601_949146537 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
你撅嘴真丑7 小时前
第九章-数字三角形
算法
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX8 小时前
服务异步通信
开发语言·后端·微服务·ruby