这是社会网络管理与分析课程的作业。老师要求模拟随机网络的连接过程,画出小世界态变(大陆说的是质变?)的曲线。

在随机网络生成过程中,最大连通分支结点数占所有结点数的比例会随着所有结点平均连接边数而变化。最开始,这种变化非常不明显,但是当所有结点平均连接边数达到1时,最大连通分支结点数占所有结点数的比例会突然增大。效果如下图所示。横轴表示平均连接边数,纵轴表示最大连通分支结点数与总结点数的比例。该图使用Python的Matplotlib包绘制。

作业使用C++简单地模拟了一个随机网络的生成过程。网络使用邻接表存储。结点数为100。建立一个while循环,每次循环产生两个不重复且之前没有相连的两个伪随机数作为两个将要相连的顶点,直到整个图成为一个连通图为止。每次连接了两个结点都要遍历整个图判断是否形成了连通图,并计算所有结点的平均连接边数和最大连通分支结点占所有结点的比例两个指标。连通图通过深度优先遍历来判断。代码如下。急急忙忙写的程序,不知道会不会有问题,不过有问题老师也不会发现的。写的时候labmate问我为什么不用python?!我说python还不熟悉啊!deadline前一晚才开始写,懒得查python了……

// SocialHW_Graph.cpp : 定義主控台應用程式的進入點。
//#include "stdafx.h"
#include <iostream>
#include <fstream>
#include<time.h>
using namespace std;#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;#define Random(x) (rand() % x) //通过取余取得指定范围的随机数
int const MAXVEX = 100;
int const DIS = MAXVEX; // 用於產生0-DIS之間的隨機數
bool bVisited[MAXVEX]; // 遍歷標志數組
int nMaxConnectedVex = 0; // 連通子圖的最大頂點數
int nSumConnectedVex = 0;
int nConnectedVex = 0; // 連通子圖的頂點數
typedef int VertexType;
typedef int EdgeType;// 邊表
typedef struct EdgeNode
{int adjvex; // 鄰接點域,存儲該頂點對應的下標EdgeType weight;struct EdgeNode *next;
}EdgeNode;// 頂點表
typedef struct VertexNode
{VertexType data;EdgeNode *firstedge;bool visited;}VertexNode, AdjList[MAXVEX];typedef struct GraphList
{AdjList adjList;int numVertexes; // 圖中頂點數int numEdges; // 圖中邊數int numDegree; // 圖中總度數
}GraphList;int RandomNum(int const dis = DIS)
{return Random(dis);
}// 判斷兩個頂點之間是否相連
// v1和v2是頂點表中的序號
bool IsConnected(GraphList *g, int v1, int v2)
{bool bConnected = false;EdgeNode *p = NULL;if (g->adjList[v1].firstedge != NULL){p = g->adjList[v1].firstedge;while (p != NULL){if (p->adjvex != v2){p = p->next;}else{bConnected = true;break;}}}return bConnected;
}// 判斷該圖是否是完全圖
bool IsCompleteGraph(GraphList *g)
{bool bComplete = false;if (NULL == g){return bComplete;}if (g->numEdges == (MAXVEX * (MAXVEX - 1)) / 2){bComplete = true;}return bComplete;
}// 計算最大連通分支的頂點數量
int CalMaxConnectedVexNum(GraphList *g)
{int nVexNum = 0;int nTemp = 0;if (NULL == g){return nVexNum;}
}// 深度優先遍歷
// i是頂點序號
void DFS(GraphList g, int i)
{EdgeNode *p = NULL;bVisited[i] = true;nConnectedVex++;p = g.adjList[i].firstedge;while (p){if (!bVisited[p->adjvex]){DFS(g, p->adjvex);}p = p->next;}
}// 深度優先遍歷操作
// 返回連通分量個數
int DFSTraverse(GraphList g)
{int nCount = 0;for (size_t i = 0; i < MAXVEX; i++){if (!bVisited[i]){nConnectedVex = 0;DFS(g, i);nCount++;if (nConnectedVex > 1){nSumConnectedVex += nConnectedVex;}nSumConnectedVex += nConnectedVex;if (nConnectedVex > nMaxConnectedVex){nMaxConnectedVex = nConnectedVex;cout << "The max number of vertex of a connected component for now is: " << nMaxConnectedVex << endl;}}}return nCount;
}// 初始化遍歷標志
void InitVisted()
{for (size_t i = 0; i < MAXVEX; i++){bVisited[i] = false;}
}// 初始化一個空圖
GraphList* InitGraph(int nVex = MAXVEX)
{if (nVex > MAXVEX){return NULL;}GraphList *g = new GraphList();// 頂點表分配數據// 頂點的值和頂點表中的序號是一樣的for (int i = 0; i < MAXVEX; i++){g->adjList[i].data = i;g->adjList[i].firstedge = NULL;g->adjList[i].visited = false;bVisited[i] = false;}g->numEdges = 0;g->numVertexes = 0;g->numDegree = 0;return g;
}// 根據隨機數構造一個圖
bool GenGraphByRandNum(GraphList *g)
{//ios::trunc表示在打开文件前将文件清空,由于是写入,文件不存在则创建ofstream inFile;ofstream inVertexFile;inFile.open("inFile_edge.csv", ios::trunc);inVertexFile.open("VertexFile.csv", ios::trunc);if (NULL == g){return false;}g->numEdges = 0;g->numVertexes = 0;double dAvgEdge = 0; // 每個頂點的平均邊數double dConnctedVexRate = 0; // 最大連通分支的頂點比例int v1 = 0;int v2 = 0;int nCount = 0; // 從初始圖到完全圖循環的次數int nRandomCount = 0; // 選取兩個隨機數的總次數bool bCompleteGraph = false;// 當出現完連通圖時,停止構造while (dConnctedVexRate < 1.0){v1 = 0;v2 = 0;// 產生兩個不相等的隨機數// 且兩個頂點沒有邊鏈接// 且該圖不是一個完全圖//bCompleteGraph = IsCompleteGraph(g);if (dConnctedVexRate == 1) // 完全圖,停止{break;}while (v1 == v2 || IsConnected(g, v1, v2)) {srand((int)time(NULL));v1 = RandomNum();v2 = RandomNum();nRandomCount++;}nCount++;cout << "Vertex No.: " << v1 << "," << v2 << endl;inVertexFile << v1 << "," << v2 << endl;// 將頂點和邊加入圖中EdgeNode *e = new EdgeNode();e->adjvex = v2;e->next = g->adjList[v1].firstedge;g->adjList[v1].firstedge = e;EdgeNode *f = new EdgeNode();f->adjvex = v1;f->next = g->adjList[v2].firstedge;g->adjList[v2].firstedge = f;// 更新頂點數// 先判斷頂點是否已經在圖中if (!g->adjList[v1].visited){g->numVertexes++;}if (!g->adjList[v2].visited){g->numVertexes++;}g->adjList[v1].visited = true;g->adjList[v2].visited = true;g->numEdges++;g->numDegree += 2;int nComponentNum = DFSTraverse(*g);cout << "The number of connected component for now is: " << nComponentNum << endl;dAvgEdge = (double)g->numEdges / (double)MAXVEX;dConnctedVexRate = (double)nMaxConnectedVex / (double)MAXVEX;cout << "Average edge: " << dAvgEdge << endl;cout << "Connected vertex rate: " << dConnctedVexRate << endl;cout << "-------------------------------------------------" << endl;inFile << dAvgEdge << "," << dConnctedVexRate << endl;InitVisted();}inFile.close();inVertexFile.close();
}int _tmain(int argc, _TCHAR* argv[])
{/*ofstream inFile;inFile.open("randomFile.txt", ios::trunc);int x = 0;int y = 0;for (size_t i = 0; i < 100; i++){x = RandomNum(960)+1;y = RandomNum(500)+1;inFile << x << "," << y << endl;cout << x << "," << y << endl;}inFile.close();return 0;*/GraphList *g = InitGraph();GenGraphByRandNum(g);return 0;
}

C++生成一个随机网络相关推荐

  1. 生成一个随机100内小数,转换为保留两位小数的字符串,不考虑四舍五入的问题。

    生成一个随机100内小数,转换为保留两位小数的字符串,不考虑四舍五入的问题.`` public class Demo02 {public static void main(String[] args) ...

  2. java 生成一个随机整数,范围从 1 到 10;或 生成一个 0 或 1 的随机整数

    // 生成一个随机整数,范围从 1 到 10 int random = new Random().nextInt( 10 ) + 1; 测试一下: for(int i = 0; i < 10; ...

  3. delphi生成一个随机序列号

    var FGuid: TGUID; begin CreateGUID(FGuid); edit1.Text := GUIDToString(FGuid); edit1.Text := edit1.Te ...

  4. 【六一儿童节】用Java生成一个随机童话故事,哄bb睡觉

    文章目录 前言 代码样例 效果展示 总结 前言 六一儿童节到了,祝各位超龄儿童节日快乐.不知道大家有没有遇到女朋友或者自己的小孩睡觉之前都要讲故事哄睡觉?这个时候大家想到的解决方法是什么呢?是读格林童 ...

  5. python随机产生100个整数二进制_PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。...

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

  6. python生成一个含有20个随机数的列表_python随机模块22个函数详解(上)

    作者:小伍哥 来源: AI入门学习 今天给大家纤细介绍下python中的随机模块,随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性.平时数据分析各种分 ...

  7. python让用户输入一个整数_PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。...

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

  8. 网络模型 - 随机网络,无标度网络,分层网络

    转自: http://www.flickr.com/photos/caseorganic/4510691991/in/set-72157624621620243 小图 大图 Network Model ...

  9. 使用python来构造有向随机网络

    使用python来构造有向随机网络 # -*- coding: utf-8 -*- """@author: Administrator """ ...

最新文章

  1. 使用希捷DiscWizard格式化3TB硬盘并分区
  2. ExtJs_关于combobox的那些分页二三事
  3. Redis高可用方案-哨兵模式-SpringBoot整合
  4. 孩子,你今天有没有提出一个好的问题?
  5. php 脏数据,使用 PHP Masked Package 屏蔽敏感数据
  6. 58 MM配置-评估和科目设置-OBYC配置自动记账
  7. 安装WordPress图解
  8. 基于jquery类库的绘制二维码的插件jquery.qrcode.js
  9. 【纪中集训】2019.08.10【NOIP提高组】模拟 A 组TJ
  10. Django学习笔记---第一天
  11. 2019华为软件精英挑战赛 赛后总结
  12. 无线网络技术学习总结
  13. 美国计算机专业nlp大学排名,美国人工智能专业排名前7的一流学府 看看哪所院校最令你心动吧!...
  14. win7 开WiFi共享
  15. 电脑常见问题:能打开QQ但不能打开网页(DNS问题)
  16. linux上启动eureka集群服务,SpringCloud@Docker系列: 运行Eureka Server集群
  17. 执行款不足以清偿全部债务时应当如何抵充
  18. 扁平化ui设计界面的方式以及扁平化ui图标设计特点
  19. linux mount error(79): Can not access a needed shared library
  20. PHP实现MD5加密(16位加密和32位加密)

热门文章

  1. MHA+keepalived实现Mysql高可用及读写分离
  2. Ansible AdHoc playbook API + 动态生成Inventory +结果关注
  3. sqlserver2017 +SSMS+ VS2017+SSDT 安装要点及相关组件下载地址
  4. linux运维实战练习--用户和组管理各命令的使用
  5. 解决python中TypeError: not enough arguments for format stringj
  6. jQuery 方法 属性
  7. vs的form标签引起css走样问题
  8. CentOS上使用Docker安装Redis-Cluster (redis6.x)
  9. Serverless 实战 —— 利用OneIndex-Serverless无成本搭建属于你自己的网盘
  10. 面试精讲之面试考点及大厂真题 - 分布式专栏 14 全面了解Kafka的使用与特性