用邻接矩阵计算概率

Calc of Probabilities with a adjacency matrix

本文关键字:概率 计算 邻接矩阵      更新时间:2023-10-16

这是一个编程竞赛问题。它的输入在这里,输出在这里。

一个醉汉想离开酒吧回家。但他不记得他的家在哪里。所以,他会敲开城市的每一扇门,等待他的家人来接他(总是有人等着接他)。

给定邻接矩阵 a 。其中每个值(i,j)表示醉汉从第i个位置出发到达第j个位置的概率。醉汉走最多m步找不到家的概率是多少?

直到现在我都不知道这是什么问题。搜索网络和书籍,我发现要计算离开节点i的概率,在m步中到达节点j的概率由 a 矩阵(a ^m)的m次幂的位置(i,j)给出。醉汉不回家的概率可以直接计算,也可以通过计算1 -醉汉到家的概率(P(A) = 1 - P(非A))来计算。

输入的第一行由一行四个整数组成n (0 <= n <= 100),t (0 <= 100),k (0 <= n), m (0 <= 100),分别表示房子的数量、酒吧的位置、醉汉的房子和尝试的次数。在这一行之后,给出n行n个整数来描述概率矩阵。0标记输入结束

每个测试用例的输出分为两行,格式必须为:

d

Instancia :
v
其中d表示实例的数量(从1开始),v是四舍五入到小数点后6位的概率。每个测试用例之间有一个空行。

输入示例:

2 1 2 1
0.5 - 0.5
0.5 - 0.5
3 1 2 2
0.25 0.25 0.5
0.25 0.5 0.25
0.5 0.25 0.25
0

输出示例:

Instancia 1
0.500000

Instancia 2
0.562500

任何有关算法、书籍、网站或提示的帮助都是值得赞赏的;

有了这些信息,我必须解决这个问题,直到现在,我只能做这个代码:

#include <stdio.h>
#include <string.h>
struct Matrix {
    double v[100][100];
    int row, col; // row x col
    Matrix(int n, int m) {
        memset(v, 0, sizeof(v));
        col = n;
        row = m;
    }
    Matrix operator*(const Matrix& x) const {
        Matrix ret(row, x.col);
        for(int i = 0; i < row; i++) {
            for(int k = 0; k < col; k++) {
                if (v[i][k])
                    for(int j = 0; j < x.col; j++)
                        ret.v[i][j] += v[i][k] * x.v[k][j];
            }
        }
        return ret;
    }
};

int main(){
    int n,t,k,m;
    int inst = 0;
    while(scanf("%d %d %d %d",&n,&t,&k,&m) == 4){
        Matrix mat(n,n);
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j)
                scanf("%lf",&mat.v[i][j]);
        //identity matrix
        Matrix aux(n,n);
        for (int i = 0; i < n; ++i)
            aux.v[i][i] = 1;

        //take the power of the matrix
        for (int i = 0; i < m; ++i) {
            aux = aux*mat;
            /* PRINT MATRIX
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < n; ++j) {
                    printf("%lf ",aux.v[i][j]);
                }
                printf("n");
            }
             */
        }
        printf("Instancia %dn%.6lfnn",++inst,aux.v[t-1][k-1]);
    }
}

正如stgatilov所说,你忘记了他一到家就不会离开家。

但是不需要动态规划。只要稍微改变一下概率矩阵,如果他家在i,那么将ii的概率改为1,对于任何不等于ij,将ij的概率改为0

那么它应该可以正常工作。

注意:还有一个可能的优化。您可以通过平方来使用Exponentiation,而不是将矩阵m乘以。

似乎你已经忘记了,男人可以在m步回家。现在你在计算他在m步后不在家的概率,假设他没有因为任何原因停下来。

我认为你最好实现一些动态规划。例如R[i, p] =该男子在i步中未到家的概率,并且在i-step之后他将在p处。重新计算有点类似于矩阵乘法,通过将表R的适当条目相加得到答案。