Esempio n. 1
0
QList<int> Kmeans::picUpRepresentatives(MicroArray* microArray){

    QList<int> representatives;
    double distance, bestDistance;
    int bestID = 0;

    for(int i = 0; i < this->_lastCentroids.size(); ++i){
        bestDistance = _distance->calculate(_lastCentroids[i], microArray->_matrix[0]);//!!! to moze nie dzialac

        for(int j = 0; j < this->_rowsClasses.size(); ++j){

            if(_rowsClasses[j] == i){

                distance = _distance->calculate(_lastCentroids[i], microArray->_matrix[j]);

                if(compareDistance(distance, bestDistance)){
                    bestID = j;
                    bestDistance = distance;
                }
            }
        }

        representatives.append(bestID);
    }
    return representatives;
}
Esempio n. 2
0
bool Bunny::collide(GameObject* object) {
    float thisRadius = dimensions.x + dimensions.y + dimensions.z;
    float objectRadius = object->dimensions.x + object->dimensions.y + 
        object->dimensions.z;

    if (compareDistance(position, object->position, thisRadius + objectRadius)) {
        if (intersect(position.x, object->position.x, dimensions.x, object->dimensions.x) &&
            intersect(position.y, object->position.y, dimensions.y, object->dimensions.y) &&
            intersect(position.z, object->position.z, dimensions.z, object->dimensions.z) &&
            dot(object->position - position, direction) > 0) {
            if (dynamic_cast<Player*>(object)) {
                alive = false;
                material = 0;
                dynamic_cast<Player*>(object)->score++;
            } 
            direction = -direction;
            return true;
        }
    }

    return false;
}
Esempio n. 3
0
//implementacja metody k-średnich
void Kmeans::run(MicroArray* microArray){

	//Centroidy to wiersze wokół których formują się grupy. Pierwsze centroidy pochodzą
    //z macierzy ale w kolejnych iteracjach ich wartości są wyliczane jako średnie grupy
	QList< QList<double> > centroids;
    _rowsClasses.resize(microArray->_matrix.size());
    qDebug() << "ilosc sierszy w rowsClasses: " << _rowsClasses.size();

	//Wylosowanie pierwszego zestawu centroidów z macierzy
	QList<int> tempIds;
	while(_lastCentroids.size() < _k){
		int id = floor(rand() % microArray->_matrix.size());
		if(!tempIds.contains(id)){
			tempIds.append(id);
            _lastCentroids.append(microArray->_matrix[id]);
		}
	}

	//pętla iteracji metody
	for(int i = 0; i < _iterations; ++i){

		//wyzerowanie liczebnosci klastrów i ustawienie nowych centroidów
        //_classIDs.clear();
		centroids.clear();
		centroids = _lastCentroids;
		_numberInCentr.clear();

		for(int i = 0; i < _k; ++i){
			_numberInCentr.append(0);
			for(int j = 0; j < centroids.first().size(); ++j){
				_lastCentroids[i][j] = 0.0;
			}
		}

		//pętla wierszy macierzy
		for(int j = 0; j < microArray->_matrix.size(); ++j){
            double bestDistance = _distance->calculate(centroids[0], microArray->_matrix[j]);
			double distance = bestDistance;
			int centrID = 0;//id centroidu dla którego dystans do aktualnego wiersza był najmniejszy
			//pętla centroidów
			for(int k = 1; k < _k; ++k){
                distance = _distance->calculate(centroids[k], microArray->_matrix[j]);

                if(compareDistance(distance, bestDistance)){
					centrID = k;
					bestDistance = distance;
                }
			}

            _numberInCentr[centrID] += 1;//inkrementacja liczebnosci grupy

            //_classIDs.append(centrID);
            _rowsClasses[j] = centrID; //przypisanie wiersza o ID=j do clasy centrID

			//dodanie wartości z nowego wiersza(przyda się przy liczeniu średniej)
			for(int k = 0; k < _lastCentroids.first().size(); ++k){
                _lastCentroids[centrID][k] += microArray->_matrix[j][k];
			}
		}

		//obliczenie nowych centroidów
		for(int j = 0; j < _k; ++j){
			if(_numberInCentr[j] != 0){
				for(int k = 0; k < _lastCentroids[j].size(); ++k){
					_lastCentroids[j][k] = _lastCentroids[j][k] / _numberInCentr[j];
				}
			}
		}
	}

}