Ai Upgrade?? Possible

Hey i got a question aboute my ai script.
in my sene i have multiple enemys with this script on them. but my problem is
that tjay move to me same attack possition thay overlap eatch other or otherwize sayd
thay move in to each other can this be fixed by lets say adding a variable that says dont come closer than 20 to anny other ai And i think it can be done by rigidbody??

and second question would be all the AIs taggs the first enemy in the sene but can it be possible to make it more like this So when an ai has tagged a enemy that the other Ais tag the other Enemys in the sene. im sorry my english is not so good but i hope you know what im looking for thaks


Here is the Ai Script

var speed = 1.0;
var attackRange = 30.0;
var shootRange =150.0;
var shootAngleDistance = 10.0;
var dontComeCloserRange = 5.0;
var target : Transform;

function Start () {
	if (target == null && GameObject.FindWithTag("Enemy"))
		target = GameObject.FindWithTag("Enemy").transform;
		Patrol ();
}

function Update () {
	if (target == null && GameObject.FindWithTag("Enemy"))
		target = GameObject.FindWithTag("Enemy").transform;

	if (target == null)
		return;
	
	if (!CanSeeTarget ())
		return;
	
}

function CanSeeTarget () : boolean
{
	if (Vector3.Distance(transform.position, target.position) > attackRange)
		return false;
		
	var hit : RaycastHit;
	if (Physics.Linecast (transform.position, target.position, hit))
		return hit.transform == target;

	return false;
}
function Patrol () {
		if (CanSeeTarget ())
			yield StartCoroutine("AttackEnemy");
		
		yield;
}

function AttackEnemy () {
	var lastVisibleEnemyPosition = target.position;
	while (true) {
		if (CanSeeTarget ()) {
			// Target is dead - stop hunting
			if (target == null)
				return;

			// Target is too far away - give up	
			var distance = Vector3.Distance(transform.position, target.position);
			if (distance > attackRange * shootRange * 3)
				return;
			
			lastVisibleEnemyPosition = target.position;
			if (distance > dontComeCloserRange)
				MoveTowards (lastVisibleEnemyPosition);
			else
				RotateTowards(lastVisibleEnemyPosition);

			var forward = transform.TransformDirection(Vector3.forward);
			var targetDirection = lastVisibleEnemyPosition - transform.position;
			targetDirection.y = 0;

			var angle = Vector3.Angle(targetDirection, forward);
			
			// Start shooting if close and play is in sight
			if (distance <shootRange && attackRange && angle < shootAngleDistance)
				yield StartCoroutine("");
		} else {
			yield StartCoroutine("SearchEnemy", lastVisibleEnemyPosition);
			// Player not visible anymore - stop attacking
			if (!CanSeeTarget ())
				return;
		}

		yield;
	}
}

function SearchEnemy (position : Vector3) {
	// Run towards the player but after 3 seconds timeout and go back to Patroling
	var timeout = 3.0;
	while (timeout > 0.0) {
		MoveTowards(position);

		// We found the player
		if (CanSeeTarget ())
			return;

		timeout -= Time.deltaTime;
		yield;
	}
}

function RotateTowards (position : Vector3) {
	// Rotate towards target	
	var targetPoint = target.position;
	var targetRotation = Quaternion.LookRotation (targetPoint - transform.position, Vector3.up);
	transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 2.0);
}

function MoveTowards (position : Vector3) {
	transform.position = Vector3.MoveTowards(transform.position, target.position,speed);
	var targetPoint = target.position;
	var targetRotation = Quaternion.LookRotation (targetPoint - transform.position, Vector3.up);
	transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 2.0);
}
function PickNextWaypoint (currentWaypoint : AutoWayPoint) {
	// We want to find the waypoint where the character has to turn the least

	// The direction in which we are walking
	var forward = transform.TransformDirection(Vector3.forward);

	// The closer two vectors, the larger the dot product will be.
	var best = currentWaypoint;
	var bestDot = -10.0;
	for (var cur : AutoWayPoint in currentWaypoint.connected) {
		var direction = Vector3.Normalize(cur.transform.position - transform.position);
		var dot = Vector3.Dot(direction, forward);
		if (dot > bestDot && cur != currentWaypoint) {
			bestDot = dot;
			best = cur;
		}
	}
	
	return best;
}

I made a tutorial with a simpl Ai with path finding here.
http://forum.unity3d.com/threads/simple-ai-pathing-and-patrolling-set-of-scripts.253235/