public MigrationPlan MigrateFromOverloaded(IEnumerable <Server> targets, IEnumerable <Server> recievers)
        {
            var migrationPlan = new MigrationPlan();
            var targetsCopies = recievers.Select(s => s.Copy())
                                .OrderBy(s => s.ResourcesCapacity.GetValue())
                                .ThenBy(s => s.RunningVMs.Count)
                                .ThenBy(s => s.UsedResources.GetValue() / s.RunningVMs.Count)
                                .ToList();

            var priorityRecievers = targetsCopies.Where(server => server.TurnedOn);
            var reserve           = targetsCopies.Where(server => !server.TurnedOn);

            foreach (var server in targets)
            {
                var resultNode = _searchEngine.Run(
                    new MigrationRootNode(
                        server,
                        priorityRecievers.ToList(),
                        reserve.ToList(),
                        GetInitialValue(priorityRecievers, EvaluateForOverloading),
                        OverloadedMigrationNode.FromRootNode)
                    ) as MigrationNode;
                if (resultNode == null)
                {
                    break;
                }
                migrationPlan.Add(resultNode, server);
                // TODO: reconsider
                foreach (var change in resultNode.Changes)
                {
                    var srv = targetsCopies.Find(s => s.Id == change.Reciever.Id);
                    srv.AsignVM(change.Target);
                    srv.UsedResources += server.GetMigrationResourceRequirments(srv);
                }
            }
            return(migrationPlan);
        }
 public MigrationPlan Merge(MigrationPlan other)
 {
     _planData.AddRange(other._planData);
     return(this);
 }