예제 #1
0
        public static System.Tuple <int, float>[][] CalculateAveragePrices(int[] counts, int[][] values, CheckList <int> exceptValues)
        {
            var valueArray = new System.Collections.Generic.SortedDictionary <int, int> [counts.Length];

            for (int i = 0; i < counts.Length; i++)
            {
                valueArray[i] = new System.Collections.Generic.SortedDictionary <int, int>();
            }

            int ncount = 0;

            for (int j = 0; j < values.Length; j++)
            {
                if (exceptValues.Contains(j))
                {
                    continue;
                }

                for (int i = 0; i < valueArray.Length; i++)
                {
                    int value = values[j][i];
                    int count = 0;

                    valueArray[i].TryGetValue(value, out count);

                    valueArray[i][value] = count + 1;
                }
                ncount++;
            }

            System.Tuple <int, float>[][] result = new System.Tuple <int, float> [counts.Length][];

            for (int i = 0; i < counts.Length; i++)
            {
                result[i] = new System.Tuple <int, float> [valueArray[i].Count];

                int count = 0;
                foreach (var pair in valueArray[i])
                {
                    result[i][count] = new System.Tuple <int, float>(pair.Key, pair.Value / (float)ncount);
                    count++;
                }
            }

            return(result);
        }
예제 #2
0
        private bool ValidOffer(OfferHolder offer, bool enemyOffers)
        {
            if (offer.MyIncome == 0 || offer.EnemyAverage <= 0 || offer.EnemyMedian <= 0)
            {
                return(false);
            }

            if (!enemyOffers)
            {
                if (offer.EnemyAverage < this.m_maxIncome * MinOfferThreshold)
                {
                    return(false);
                }

                if (m_rejectedOffers.Contains(offer.OfferCode))
                {
                    return(false);
                }
            }

            return(offer.MyIncome > 0);
        }
예제 #3
0
        public static OfferHolder TestOffer(int[] counts, int[][] values, CheckList <int> exceptValues, int myValues, int[] offer)
        {
            float enemyAvr     = 0;
            int   count        = 0;
            int   enemyMax     = 0;
            int   enemyMin     = int.MaxValue;
            int   nonZeroCount = 0;

            int[] valueArray = Utils.ArrayCreate(values.Length);

            for (int j = 0; j < values.Length; j++)
            {
                if (exceptValues.Contains(j))
                {
                    continue;
                }

                int value = CalculateIncomeForOffer(counts, values[j], offer, true);

                if (value > 0)
                {
                    nonZeroCount++;
                }

                enemyAvr           += value;
                valueArray[count++] = value;

                if (value > enemyMax)
                {
                    enemyMax = value;
                }

                if (value < enemyMin)
                {
                    enemyMin = value;
                }
            }

            if (enemyMin == int.MaxValue) // no valid offers at all
            {
                enemyMin = 0;
            }

            enemyAvr /= count;

            float enemyMedian = count % 2 == 1 ? valueArray[count >> 1] : (valueArray[count >> 1] + valueArray[(count >> 1) + 1]) * 0.5f;

            int myIncome = CalculateIncomeForOffer(counts, values[myValues], offer, false);

            float score = myIncome - enemyAvr;

            string offerCode = "";

            for (int i = 0; i < offer.Length; i++)
            {
                offerCode += offer[i];
            }

            return(new OfferHolder
            {
                MyIncome = myIncome,
                EnemyAverage = enemyAvr,
                EnemyMedian = enemyMedian,
                EnemyMin = enemyMin,
                EnemyMax = enemyMax,
                Offer = Utils.ArrayClone(offer),
                OfferCode = offerCode,
                Options = nonZeroCount,
                Score = score
            });
        }
예제 #4
0
        public OfferHolder MakeOffer(int turnsLeft)
        {
            OfferHolder selectedOffer = null;

            for (int i = 0; i < m_offers.Length; i++)
            {
                if (ValidOffer(m_offers[i], false))
                {
                    selectedOffer = m_offers[i];
                    break;
                }
            }

            if (m_greed)                   // greed guy does not want to make last offer
            {
                if (selectedOffer == null) // no offers left, stick with last one
                {
                    selectedOffer = m_lastOffer;
                }
            }
            else
            {
                if (turnsLeft <= 2)
                {
                    this.m_log("Making last offer!");

                    selectedOffer = null;

                    for (var i = 0; i < this.m_offers.Length; i++)
                    {
                        if (this.m_offers[i].EnemyMedian > 0 && this.m_offers[i].EnemyAverage >= this.m_maxIncome * LastOfferThreshold && this.m_offers[i].MyIncome > 0)
                        {
                            return(this.m_offers[i]);
                        }
                    }
                }

                if (selectedOffer == null) // no offers left, try relaxed list
                {
                    m_log("No meaninful offers left!");

                    for (int i = 0; i < m_offers.Length; i++)
                    {
                        if (this.m_offers[i].EnemyMedian > 0 && m_offers[i].EnemyAverage >= MinOfferThreshold * m_maxIncome && m_offers[i].MyIncome > 0 && !m_rejectedOffers.Contains(m_offers[i].OfferCode)) // relaxed check: not fairest option, but still good
                        {
                            selectedOffer = m_offers[i];
                            break;
                        }
                    }

                    if (selectedOffer == null) // no offers left, stick with last one
                    {
                        m_log("No offers left and no relaxed found!");
                        selectedOffer = m_lastOffer;
                    }
                }
            }
            m_rejectedOffers.Add(selectedOffer.OfferCode);

            m_lastOffer = selectedOffer;

            // if enemy rejected my offer, that means that his total for this offer never reached 9 or 10
            bool changed = false;

            for (int i = 0; i < m_allValues.Length; i++)
            {
                if (m_excludedValues.Contains(i))
                {
                    continue;
                }

                int income = AnalyzerEngine.CalculateIncomeForOffer(m_counts, m_allValues[i], m_lastOffer.Offer, true);

                if (income >= m_maxIncome * RejectThreshold)
                {
                    m_excludedValues.Add(i);
                    changed = true;
                }
            }

            if (changed)
            {
                m_offers = AnalyzerEngine.FindBestOffers(m_counts, m_allValues, m_excludedValues, m_myValuesIndex);

#if DEBUG_RIG
                PrintStats();
#endif
#if LOG_OFFERS
                m_log("Revised list of offers (for next move)");

                for (int i = 0; i < m_offers.Length; i++)
                {
                    m_log(Utils.Format("{0}: valid: {1}", m_offers[i], ValidOffer(m_offers[i], false)));
                }
#endif
            }

            return(selectedOffer);
        }