Esempio n. 1
0
/**
Mutation (exploitation) of some sort
*/ 
void CBasicEA::mutate(CNeuralNet & genotypeA)
{
	//TODO:: roll your own
	for (SNeuronLayer sl : genotypeA.vecLayers) {
		for (int i = 0; i < sl.numNeurons; i++) {
			std::transform ( sl.vecNeurons[i].vecWeights.begin () , sl.vecNeurons[i].vecWeights.end(), sl.vecNeurons[i].vecWeights.begin(), 
				[](double weight)->double { return (RandBool()) ? -1 + 2 * (RandInt(0, 100000) / 100000) : weight;  });
		}
	}
	
}
//---------------------------- AddFuzzyDeviationToAim -------------------------
//
//  adds a deviation to the firing angle using fuzzy logic
//-------------------------------------- ---------------------------------------
void Raven_WeaponSystem::AddFuzzyDeviationToAim(Vector2D& AimingPos)
{
	double distToTarget = Vec2DDistance(m_pOwner->Pos(), m_pOwner->GetTargetSys()->GetTarget()->Pos());
	double targetVelocity = m_pOwner->Speed();
	double targetVisiblePeriod = m_pOwner->GetTargetSys()->GetTimeTargetHasBeenVisible();

	/* Fuzzification */
	m_FuzzyModule.Fuzzify("DistToTarget", distToTarget);
	m_FuzzyModule.Fuzzify("TargetVelocity", targetVelocity);
	m_FuzzyModule.Fuzzify("TargetVisiblePeriod", targetVisiblePeriod);

	double derivation = m_FuzzyModule.DeFuzzify("Deviation", FuzzyModule::max_av);
	bool isDerivationPosition = RandBool();

	/* Deviation computing */
	Vector2D toPos = AimingPos - m_pOwner->Pos();

	if (isDerivationPosition)
		Vec2DRotateAroundOrigin(toPos, derivation*m_dAimAccuracy);
	else
		Vec2DRotateAroundOrigin(toPos, -1 * derivation*m_dAimAccuracy);

	AimingPos = toPos + m_pOwner->Pos();
}