您的位置:首页 > 编程语言 > C语言/C++

C语言解释一下BA无标度网络

2020-02-16 18:05 323 查看

我们见识一下胜者通吃的过程中的 胜者 是如何吞噬剩余的世界的,如果能重现这个过程,我们也就能解释为什么这么大个世界被那么几个很少的国家主宰着,同时我们也能理解为什么同为胜者的几个国家必须结盟的原因。

成王败寇,并非字面上那么简单,秦王扫六合看起来是必然的,因为秦军的打击力量突破了阈值,它连通了整张网络的大部分节点,从而让幂律开始起作用!

同时,病毒的传播并非徒有信心和空有口号就可以抑制,当我们在抨击这张网络为病毒传播提供了温床的同时,其实我们已经享受了这张网络为我们提供的益处好多年了。当我们的Y吹在鼓吹自己宇宙第一超越硅谷的时候,我们应该明白,背后是这张连通的网络在起作用,然而,这张网络是中性的,谁都可以利用。

昨晚看了CCTV-6的老版《马永贞》,最后马老板被砍死影片结束的镜头,让我思考了整个晚上。

BA无标度网络的概念,摘自Wiki:
https://zh.wikipedia.org/wiki/%E6%97%A0%E5%B0%BA%E5%BA%A6%E7%BD%91%E7%BB%9C

问题是,我们如何用最简单的方式重现这个网络构建的过程。

今天我值班,看样子大家都在抗击疫情也没啥事,不跟安德森先生玩的间隙,随手撸了一手C代码(python内部的实现太复杂了,我不懂编程,看不懂),可能并不严谨甚至并不正确,但意思就是那个意思:

  • “凡有的,还要加倍给他叫他多余;没有的,连他所有的也要夺过来” - 《新约·马太福音》

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_SIZE	200

struct map_node;

struct map_node {
unsigned int id;
struct map_node *links[MAX_SIZE];
unsigned int curr_links;
};

static unsigned int curr_map_nodes = 1;

static struct map_node map_nodes[MAX_SIZE];
static int init = 5;

static void add_one(struct map_node *map_node)
{
int pos = 0;
int i = 0;
unsigned int percent = 0;

srand((unsigned)time(NULL));
percent = rand()%curr_map_nodes;

for (i = 0; i < curr_map_nodes; i ++) {
if (percent >= pos && percent < pos + map_nodes[i].curr_links) {
map_nodes[i].links[map_nodes[i].curr_links] = map_node;
map_nodes[i].curr_links ++;
map_node->curr_links = 1;
map_node->links[0] = &map_nodes[i];
curr_map_nodes ++;
#if 0
printf("percent:%d  pos:%d   total:%d\n", percent, pos, curr_map_nodes);
#endif
break;
}
pos += map_nodes[i].curr_links;
}
}

int main(int argc, char **argv)
{
int i, j;

for (i = 0; i < MAX_SIZE; i ++) {
memset(&map_nodes[i], 0, sizeof(struct map_node));
map_nodes[i].id = i + 1;
}

for (i = 0; i < init; i ++) {
map_nodes[i].links[0] = &map_nodes[(i + 1)%init];
map_nodes[i].curr_links = 1;
curr_map_nodes ++;
}

for (i = init - 1; i < MAX_SIZE; i ++) {
add_one(&map_nodes[i]);
}
for (i = 0; i < MAX_SIZE; i ++) {
printf("##### ID:%d links:%d  edges: ", map_nodes[i].id, map_nodes[i].curr_links);
for (j = 0; j < map_nodes[i].curr_links; j ++) {
printf("%d ", map_nodes[i].links[j]->id);
}
printf("\n");
}
}

概率归一化这部分我感觉是有问题的,随机数概率计算那部分并不严谨,但定性表达是足够了。

浙江温州皮鞋湿,下雨进水不会胖!

  • 点赞
  • 收藏
  • 分享
  • 文章举报
dog250 博客专家 发布了1559 篇原创文章 · 获赞 4865 · 访问量 1088万+ 他的留言板 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: