-
Notifications
You must be signed in to change notification settings - Fork 0
/
nesting.cpp
122 lines (108 loc) · 3.43 KB
/
nesting.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//
// nesting.cpp
// VoterMLA
//
// Created by MD Shihabul Kabir on 12/5/16.
// Copyright © 2016 MD Shihabul Kabir. All rights reserved.
//
#include <stdio.h>
#include "county.h"
#include "nesting.h"
#include <cmath>
#include <iostream>
using namespace std;
using namespace CountyStruct;
//Algorethmic Nesting Clustering Namespace
namespace NestingClustering {
//constructor
Nesting::Nesting(std::vector<County>&counties){
for(County c : counties){
//make a node for each county
NestNode* node = new NestNode();
node->left = nullptr;
node->right = nullptr;
node->cluster.push_back(c);
clusters.push_back(node);
}
}
//method to get the mean of a set of countries
vector<float>Nesting::mean(std::vector<CountyStruct::County>&counties){
vector<float>totals;
for(int i =0; i < TOTAL_ATTR; ++i){
totals.push_back(0);
}
//go through and tally the total sum
for(County& c : counties){
for(int i =POPULATION; i < TOTAL_ATTR; ++i){
totals[i] += c.member(i);
}
}
//calculate the average sums
for(int i =POPULATION; i < TOTAL_ATTR; ++i){
totals[i] /= counties.size();
}
return totals;
}
//function to get difference between two nodes
float Nesting::difference(NestNode* aNode, NestNode* bNode){
float diff = 0;
vector<float>mean1 = mean(aNode->cluster);
vector<float>mean2 = mean(bNode->cluster);
for(int i = POPULATION; i < TOTAL_ATTR; ++i){
diff += powf(mean1[i]-mean2[i],2);
}
//return sum of distance
return sqrtf(diff);
}
//function to get the next closest Node
NestNode* Nesting::closestNode(NestNode* aNode){
//setup node to return
NestNode* b = clusters[0];
float diff = difference(aNode,b);
//go through and find closest
for(NestNode* n : clusters){
float local = difference(aNode, n);
if(local < diff){
diff = local;
b = n;
}
}
return b;
}
//method to cluster
void Nesting::cluster(){
//found the biggest cluster
bool found = false;
int index = 0;
while (!found) {
//get the first item of the vector
NestNode* l = clusters[index];
//get the next best node
NestNode* r = closestNode(l);
//make a bigger cluster
NestNode* bigger = new NestNode();
for(County c : l->cluster){
bigger->cluster.push_back(c);
}
for(County d : r->cluster){
//add if it isn't already in the bigger cluster
bool notFound = false;
for(County i : bigger->cluster){
if(i.compare(d)){
notFound = true;
}
}
if(!notFound) bigger->cluster.push_back(d);
}
//make the child nodes
bigger->right = r;
bigger->left = l;
clusters.push_back(bigger);
if(bigger->left->cluster.size() + bigger->right->cluster.size() >= 2334){
found = true;
break;
}
++index;
}
}
}