分布式作业 gossip模式

来源:互联网 发布:ubuntu开启samba服务 编辑:程序博客网 时间:2024/05/17 07:27

emm这是一个作业,作业大致要求是随机生成n个数,这n个数的平均数为sum/n
我们要做的是选定一个人作为母体(传染者)通过传染使得每个个体的值无限接近
于这个平均值,且有一个兴趣值和参数k,初始感染者兴趣值为1,每当传染一个人
且该个体和传染者值相同,则传染者兴趣值/k。当兴趣值低于一定值时,该传染者
失去传染性(此作业中我预设的这个限度值为0.0000001)

#include <iostream>#include <vector>#include <string>#include <stdlib.h> #include <time.h>  using namespace std;struct node {    double num;    double interest;    int flag;};int main() {    srand((unsigned)time(NULL));    double k = 2;    int cnt = 0;    int n = 10 + rand() % 20;    cout << "n=" << n << endl;    vector<node> v(n);    cout << "初始值:" << endl;    double sum = 0;    for (int i = 0; i < n; i++) {        int temp = 1 + rand() % 99;        v[i].num = temp;        v[i].interest = 1;        v[i].flag = -1;        sum += temp;        cout << temp << " ";    }    cout << endl;    int t = 10 + rand() % 20;    int inject = 1 + rand() % n-1;    cout << "此时我们假定第"<<inject<<"个数为传播者,并传播" << t << "个循环" << endl;    v[inject].flag = 0;    for (int i = 0; i <t; i++) {        for (int j = 0; j < n; j++) {            if (v[j].flag ==i) {                cout << "***************" << endl;                cout << "找到母体" << j << endl;                    int tt;                while (true) {                    tt= 1 + rand() %n-1;                    if (tt != j)                        break;                }                cout << "改变" << tt<<endl;                if (v[tt].num != v[j].num) {                    v[tt].num = (v[j].num+v[tt].num)/2.0;                    v[j].num = v[tt].num;                    v[tt].flag = i+1;                }                else {                    cout << tt << "已被改变,";                    v[j].interest = v[j].interest / k;                    cout << "兴趣为";                    printf("%.5f\n", v[j].interest);                    if (v[j].interest <0.0000001) {                        v[j].flag =-999;                        cout << j << "号感染者失去感染性" << endl;                        cnt++;                    }                }                cout << "***************" << endl;                v[j].flag++;            }        }        cout << "第" << i + 1 << "次循环后:" << endl;        for (int j = 0; j < n; j++) {            cout << v[j].num << " ";        }        cout << endl;    }    cout << "预设平均值为" << sum / n<<endl;    cout << "失去感染性的个数:" << cnt << endl;    cout << "总个数:" << n << endl;    system("pause");    return 0;}
原创粉丝点击