图有向和加权

Posted

技术标签:

【中文标题】图有向和加权【英文标题】:Graph directed and weighted 【发布时间】:2017-12-03 00:18:02 【问题描述】:

我有一个带 10 个节点的加权有向图,它以节点 a 开始。并且节点之间是相互连接的(具体的连接在代码中显示),边显示它去下一个节点的可能性(概率)有多大。例如,如果节点 a 连接到节点 bc,并且两者都有相同的概率到达(0.5)第一个节点在列表中应该采取,所以这里b

并且用户输入遍历函数应该通过图形的次数。遍历函数的返回应该是节点e被访问的次数。

我已经做了一些,如果你能帮助我并告诉我应该如何访问每个节点并检查它是否是带有“e”的那个,那就太好了。

#include <iosrteam>
#include <cstdlib>
#include <vector>
using namespace std;

struct node 
        const char* label;
        vector<float> prob;
        vector<node*> succ;
;

// TODO: implement function traversal

void node_init(node* a, const char label[]) 
    a->label = label;


void edge_init(node* a, node* b, float probability) 
    a->succ.push_back(b);
    a->prob.push_back(probability);


void init_graph(node* nodes) 
    node_init(nodes, "a");
    node_init(nodes+1, "b ");
    node_init(nodes+2, "c ");
    node_init(nodes+3, "d ");
    node_init(nodes+4, "e ");
    node_init(nodes+5, "f ");
    node_init(nodes+6, "g ");
    node_init(nodes+7, "h ");
    node_init(nodes+8, "i ");
    node_init(nodes+9, "j ");

    edge_init(nodes, nodes+1, 0.5);
    edge_init(nodes, nodes+2, 0.5);
    edge_init(nodes+1, nodes+3, 0.3);
    edge_init(nodes+1, nodes+4, 0.3);
    edge_init(nodes+1, nodes+5, 0.4);
    edge_init(nodes+2, nodes+4, 0.5);
    edge_init(nodes+2, nodes+5, 0.5);
    edge_init(nodes+3, nodes, 1.0);
    edge_init(nodes+4, nodes+6, 0.5);
    edge_init(nodes+4, nodes+7, 0.5);
    edge_init(nodes+5, nodes+6, 0.25);
    edge_init(nodes+5, nodes+7, 0.25);
    edge_init(nodes+5, nodes+8, 0.25);
    edge_init(nodes+5, nodes+9, 0.25);
    edge_init(nodes+6, nodes, 1.0);
    edge_init(nodes+7, nodes, 1.0);
    edge_init(nodes+8, nodes, 1.0);
    edge_init(nodes+9, nodes, 1.0);


int main(int argc, char *argv[]) 
    if (argc > 1) 
        srand(time(0));
        node *nodes= new node[12];
        init_graph(nodes);
        int fische = traversal(nodes,atoi(argv[1]));
        cout << endl << "Number of e-access: " << e << endl;
        delete [] nodes;
     else 
        cout << "Call with number of steps for traversal.\n";
    
    return 0;

【问题讨论】:

"例如,如果节点 a 连接到节点 b 和 c,并且两者都有相同的概率到达 (0.5) 应该采用列表中的第一个节点,所以这里是 b。"这不是概率的工作原理。 我的意思是从 a 变为 0.5,从 a 变为 c 的概率为 0.5。更重要的是,在论文中它实际上只是说我必须生成一个随机数然后进行比较。那是。全部。它说这也是为什么我真的不知道我应该做什么。 你能给我们你的trasversal函数的原型吗? 我在这里发布了整个代码作为答案。 【参考方案1】:

这是我想出来的,它似乎有效(我们的导师告诉我们对概率求和并将其与随机生成的数字进行比较,不要问我为什么):

#include <iostream>
#include <cstdlib>
#include <vector>
#include <time.h>

using namespace std;

struct node 
    const char* label;
    vector<float> prob;
    vector<node*> succ;
;

// TODO: implement function traversal

int traversal(node* start, int argv )
    int e=0;
    int i=0;
    cout<<start->label<<endl;
    if(string(start->label).compare("e ") == 0)
        e++;
    
    if(argv>0) 
        float summe =0;
        double ran = (double)rand() / RAND_MAX;
        for(int i=0; i<start->prob.size();i++)
            summe = summe + start->prob[i];
            if(summe>ran)
                e =e + traversal(start->succ[i], argv-1);
                break;
            

        
    
    return e;



void node_init(node* a, const char label[]) 
    a->label = label;


void edge_init(node* a, node* b, float probability) 
    a->succ.push_back(b);
    a->prob.push_back(probability);


void init_graph(node* nodes) 
    node_init(nodes, "a ");
    node_init(nodes+1, "b ");
    node_init(nodes+2, "c ");
    node_init(nodes+3, "d ");
    node_init(nodes+4, "e ");
    node_init(nodes+5, "f ");
    node_init(nodes+6, "g ");
    node_init(nodes+7, "h ");
    node_init(nodes+8, "i ");
    node_init(nodes+9, "j ");

    edge_init(nodes, nodes+1, 0.5);
    edge_init(nodes, nodes+2, 0.5);
    edge_init(nodes+1, nodes+3, 0.3);
    edge_init(nodes+1, nodes+4, 0.3);
    edge_init(nodes+1, nodes+5, 0.4);
    edge_init(nodes+2, nodes+4, 0.5);
    edge_init(nodes+2, nodes+5, 0.5);
    edge_init(nodes+3, nodes, 1.0);
    edge_init(nodes+4, nodes+6, 0.5);
    edge_init(nodes+4, nodes+7, 0.5);
    edge_init(nodes+5, nodes+6, 0.25);
    edge_init(nodes+5, nodes+7, 0.25);
    edge_init(nodes+5, nodes+8, 0.25);
    edge_init(nodes+5, nodes+9, 0.25);
    edge_init(nodes+6, nodes, 1.0);
    edge_init(nodes+7, nodes, 1.0);
    edge_init(nodes+8, nodes, 1.0);
    edge_init(nodes+9, nodes, 1.0);


int main(int argc, char *argv[]) 
    if (argc > 1) 
        srand(time(0));
        node *nodes= new node[12];
        init_graph(nodes);
        int e = traversal(nodes,atoi(argv[1]));
        cout << endl << "Number of e-access: " << e << endl;
        delete [] nodes;
     else 
        cout << "Call with number of steps for traversal.\n";
    
    return 0;

【讨论】:

以上是关于图有向和加权的主要内容,如果未能解决你的问题,请参考以下文章

C++代码用数组链表存储无向加权图有向加权图,小白都能看懂

Graphviz Dot,混合有向和无向

图--06---加权有向图最短路径Dijstra算法

数据结构-图有向无环图的应用

有向加权图的复合模式

具有所需顶点的有向加权图