PuzzleSolver/Source/functions/AbstractionLayers/DestructionPower/DestructionPower.cpp

117 lines
4.4 KiB
C++
Raw Normal View History

#include "DestructionPower.h"
//TODO! Add more layers here!
//sets relations of speed for the different layers
map<int,float> DestructionPower_Properties::SpeedTable =
{
2018-01-19 21:36:31 +01:00
{0,0.99},
{1,0.7},
2018-01-25 22:14:00 +01:00
{2,0.7},
{3,0.5}
};
bool DestructionPower::PreProcessing(coor mySize,const vector<Part*>* partArray)
{
2018-01-07 20:08:50 +01:00
cout << "DestructionPower Preprocessing... ";
InitialiseConstraintMatrixSize(mySize.col,mySize.row);
2018-01-07 20:08:50 +01:00
cout << "Done!" << endl;
return true;
}
//it through qualityVector and removes all that do not trigger PlaceOfPartGood
bool DestructionPower::EvaluateQuality (const coor constraintCoordinate, qualityVector& qVector)
{
}
2017-12-22 23:09:23 +01:00
bool DestructionPower::SetConstraintOnPosition(const coor constraintCoordinate, const DestructionPower_Properties constraint)
{
}
bool DestructionPower::RemoveConstraintOnPosition(const coor constraintCoordinate)
{
}
//gets destruction power from left and from top if possible and normalizes
void DestructionPower::DestructionOfSurrounding(const coor constraintCoordinate) {
2018-01-20 09:40:03 +01:00
for(int i = 0; i < m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray.size(); ++i)
m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray.pop_back();
for (int i = 0; i < DESTRUCTION_COUNT; ++i) {
m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray.push_back(0);
int divisor=0;
if(constraintCoordinate.row > 0)
{
divisor++;
m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray[i] += m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row-1].DestructionArray[i];
}
if(constraintCoordinate.col > 0)
{
divisor++;
m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray[i] += m_constraintMatrix[constraintCoordinate.col-1][constraintCoordinate.row].DestructionArray[i];
}
if(divisor)
m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray[i] /=divisor;
else
//create default destructionPower //TODO find some better solution for default
2018-01-19 21:36:31 +01:00
m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray[i] = m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].SpeedTable[i];
//aging
if(m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray[i]<0.9)
m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray[i]=m_constraintMatrix[constraintCoordinate.col][constraintCoordinate.row].DestructionArray[i]*(float)1.001+(float)0.01;
}
}
float DestructionPower::defaultDestructionPower(int i)
{
}
2017-12-22 22:55:55 +01:00
//gets next highest valued abstraction layer down from current one (if first, get highest)
int DestructionPower::getNextAbstractionLayer(coor newCoordinate, int currentAbstractionLayer)
{
if(++currentAbstractionLayer>=DESTRUCTION_COUNT)
return -1;
else
return currentAbstractionLayer;
float currentPower = 1;
2017-12-22 22:55:55 +01:00
int nextLayer=-1;
float nextLayerPower=0;
if (currentAbstractionLayer>=0)
2018-01-07 20:08:50 +01:00
currentPower = m_constraintMatrix[newCoordinate.col][newCoordinate.row].DestructionArray[currentAbstractionLayer];
2017-12-22 22:55:55 +01:00
int i=0;
//giff next most valuable layer
2018-01-07 20:08:50 +01:00
for(auto it:m_constraintMatrix[newCoordinate.col][newCoordinate.row].DestructionArray)
2017-12-22 22:55:55 +01:00
{
if(it <= currentPower)
{//if equal, then has to be the next one (activated from left to right)
2018-01-07 20:08:50 +01:00
if(it == currentPower) {
if (i > currentAbstractionLayer)
2017-12-22 22:55:55 +01:00
return i;
}
2018-01-07 20:08:50 +01:00
//if this one is bigger than previous biggest one, save
else if(it>nextLayerPower)
{
nextLayerPower=it;
nextLayer=i;
}
2017-12-22 22:55:55 +01:00
}
i++;
2017-12-22 22:55:55 +01:00
}
return nextLayer;
}
DestructionPower_Properties::DestructionPower_Properties() {
float aging=1.001;
for(int i=0;i<DestructionArray.size();i++)
{
DestructionArray.emplace_back((DestructionPower_Properties::SpeedTable[i]*DESTRUCTION_INIT));
2018-01-19 21:36:31 +01:00
DestructionArray.back()<0.8 ? DestructionArray.back()=aging*DestructionArray.back()+(float)0.01:DestructionArray.back();
}
2017-12-22 22:55:55 +01:00
}