private static double GetUnitPositionBonus( Field field, Unit unit, ExecutionOptions options) { int minX = unit.GetMinX(); int maxX = unit.GetMaxX(); int minY = unit.GetMinY(); int maxY = unit.GetMaxY(); int depth = field.Height - minY; int width = maxX - maxY; int marginBottom = field.Height - maxY; int center = (maxX + minX) / 2; var attractor = GetBottomOpenPosition(field); double attractorDistance = Math.Abs(attractor.X - unit.Pivot.X); // attractor.DistanceTo(unit.Pivot); double depthPenalty = 0; foreach (var member in unit.Members) { depthPenalty += field.Height - 1 - member.Y; } int edgeBonus = 0; foreach (var position in unit.Members) { if (position.X == 0 || position.X == field.Width - 1) edgeBonus += 1; } double adjacencyBonus = GetAdjacencyBonus(field, unit, options); return edgeBonus * options.EdgeRatio + adjacencyBonus - depthPenalty * options.DepthPenaltyRatio - attractorDistance * options.AttractorRatio; }