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

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

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

同时,病毒的传播并非徒有信心和空有口号就可以抑制,当我们在抨击这张网络为病毒传播提供了温床的同时,其实我们已经享受了这张网络为我们提供的益处好多年了。当我们的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");
	}
}

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


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

发布了1561 篇原创文章 · 获赞 4917 · 访问量 1094万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览