private Resource GetHighestPurchaseableUtilityPerCost(Self simSelf, Other simOther, Resource[] bannedResources)
        {
            var resourceObject = tradeableResources
                                 .Where(resource => !bannedResources.Contains(resource))
                                 .Where(resource => exchange.CanPurchase(resource, simSelf, simOther))
                                 .Select(resource => new
            {
                resource,
                utility  = utilityFunctions.GetIncrementalUtility(resource, simSelf, increment),
                purchase = exchange.Purchase(resource, increment, simSelf, simOther).info
            })
                                 // The purchase could have been restricted in size based on available funds
                                 .Where(resource => resource.purchase.amount == increment)
                                 .Where(resource => resource.purchase.cost <= simSelf.GetCurrentFunds())
                                 .OrderBy(resource => resource.utility / resource.purchase.cost)
                                 .LastOrDefault();

            if (resourceObject == default)
            {
                return(default(Resource));
            }
            return(resourceObject.resource);
        }