类似于背包Java代码的动态规划算法

类似于背包Java代码的动态规划算法,java,algorithm,iteration,dynamic-programming,knapsack-problem,Java,Algorithm,Iteration,Dynamic Programming,Knapsack Problem,一个任务关键型生产系统有n个必须顺序执行的阶段;第一阶段由机器M_i执行 每台机器M_i具有可靠运行的概率r_i和故障的概率1-r_i(且故障是独立的)。因此,如果我们用一台机器实现每个阶段,整个系统工作的概率是r_1,r_2,…,r_n。为了提高这种可能性,我们增加了冗余,通过拥有执行阶段i的机器m_i的m_i拷贝 所有m_i拷贝同时失败的概率仅为(1-r_i)^(m_i),因此阶段i正确完成的概率为1-(1-r_i)^(mi),整个系统工作的概率为prod(i=1,n){1-(1-r_i)^

一个任务关键型生产系统有n个必须顺序执行的阶段;第一阶段由机器M_i执行

每台机器M_i具有可靠运行的概率r_i和故障的概率1-r_i(且故障是独立的)。因此,如果我们用一台机器实现每个阶段,整个系统工作的概率是r_1,r_2,…,r_n。为了提高这种可能性,我们增加了冗余,通过拥有执行阶段i的机器m_i的m_i拷贝

所有m_i拷贝同时失败的概率仅为(1-r_i)^(m_i),因此阶段i正确完成的概率为1-(1-r_i)^(mi),整个系统工作的概率为prod(i=1,n){1-(1-r_i)^(m_i)}

每台机器M_i都有一个成本c_i,总预算B用于购买机器。(假设B和c_i是正整数。)用java代码编写算法,在给定概率r_1,…,r_n,成本c_1,…,c_n和预算B的情况下,查找可用预算内的冗余m_1,…,m_n,并使系统正常工作的概率最大化(确定可实现的最大可靠性)。此外,请说明每种类型的机器有多少台在预算范围内达到该可靠性范围

所以我读入了一个文件,它给出了允许的总预算,然后是机器的数量,然后我读入了每台机器的成本和可靠性。我将成本和可靠性存储在两个链表中(不确定这是否是最好的)

从那里我知道每台机器中的一台必须使用一次,所以我用每台机器的总成本(每台机器的总成本)减去预算,这给了我剩余预算或冗余预算,如果你愿意的话

bRedundent = (budget - totalCostOfOneEach);
现在我陷入了困境,我不知道该循环什么来找到解决方案。我已经研究并发现了这一点,但我不明白这一点

Pr(b,j)=max{Pr(b-c_j*k, j-1)*(1-(1-r_j)^k}
所以我知道的是,我已经创建了一个双数组,并将数组初始化为:

double[][] finalRel = new double[numberOfMachines][bRedundent]; 
for (int j = 0; j < numberOfMachines; j++)
{
    finalRel[0][j] = 0; 
}

for (int b = 1; b < budget; b++)
{
    finalRel[b][1] = reliability.get(0); 
}
double[]finalRel=新的double[numberOfMachines][bRedundent];
对于(int j=0;j
现在我陷入了困境,我相信我应该在机器的数量上循环,然后是成本,但这不起作用,我知道我需要以某种方式纳入预算。这就是我目前所拥有的根本不起作用的东西:

for (int i = 1; i < numberOfMachines; i++)
{
    for (int c = cost.get(i); c < budget; c++)
    {
        finalRel[i][c] = Math.min(finalRel[i-1][c], finalRel[i-1][c - cost.get(numberOfMachines)]*(l));
    }   
} 
for(int i=1;i
我知道子问题被表示为finalRel[I,b],机器1,2,…,的最可靠配置,i(每台机器至少一台)在预算b内可用。期望的答案将是finalRel[n,B]

如果我们在预算内,我们返回可靠性0(意味着不可能)。如果我们超出预算(b=0),但仍然需要购买机器(i>0),则返回0(假设所有ci>0)。如果i=0,我们就没有需要购买的机器,所以可靠性是1(如果是0,那么一切都会乘以0,这是不好的)。如果还有预算(b>0)和机器需要购买(i>0),我们会尝试购买所有可能的m台i型机器-我们必须至少购买m台≥ 1,最大为m≤ B≤ 楼层(b/c_i)≤ B≤ B、 是的。在每种情况下,剩余预算将为b− m·c_i。机器的最佳可靠性1,我− 1将是REL[i]− 1,b− m·ci],需要乘以m个拷贝对m_i的贡献,(1− (1 − ri)^m)或汇总


我知道这是很多信息,但我已经被困了一段时间,所以任何帮助都是感激的

您可以使用比这更简单的重复。对于
i=0,…,n
b=0,…,b
,我们让
R(i,b)
成为从阶段
1
到阶段
i
给定预算
b
的子管道的最大可靠性。基本情况如下:

For b = 0, ..., B,
  R(0, b) = 1,
因为空管道从不发生故障,也不需要任何费用。此后,我们有了关联的重复,为了清晰起见,我稍微重写了它:

For i = 1, ..., n,
  For b = 0, ..., B,
    R(i, b) = max {R(i-1, b - k*c_i) * (1 - (1-r_i)^k)
                   for k = 1, ..., floor(b/c_i)},

其中
k
是我们考虑购买的阶段
i
机器的数量(定义
0^0=1
,以防机器完全可靠;您应该自己计算功率,然后将强度减少为乘法,从而解决此问题并提高性能)。系数
(1-(1-r_i)^k)
是带有
k
机器的阶段
i
的可靠性。系数
R(i-1,b-k*c_i)
是给定剩余预算的前几个阶段的最大可靠性。限制
floor(b/c_i)
是总共最多花费
b
的stage
i
机器的最大数量。

我不明白这一行:
R(i,b)=max{R(i-1,b-k*c_i)*(1-(1-R_i)^k)对于k=0,…,floor(b/c_i)}
这是怎么回事,你在一个双数组和一个楼层循环之间取最大值,这定义了k,但我们试图在最大值函数中定义它之前使用它?如果假设for循环包含在max函数中,我不知道它将如何返回双数组?很抱歉,我正在努力解决这个逻辑问题。在java中实现这一点的方法是使用ImmutableSet.Builder吗@BillLogger否,用循环替换。我无法在注释中添加新行,因此格式很难看。这是我最初的想法,但仍然无法正常工作,或者我所期望的方式。不确定我做错了什么:
numberOfMachines=8;预算=1000;for(inti=1;iFor i = 1, ..., n,
  For b = 0, ..., B,
    R(i, b) = max {R(i-1, b - k*c_i) * (1 - (1-r_i)^k)
                   for k = 1, ..., floor(b/c_i)},