Example #1
0
        public int[] CheckOffer(int[] o)
        {
            if (o != null)
            {
                m_rounds--;

                bool accept = CheckOffer(o, m_rounds);

                if (accept)
                {
                    m_log(Utils.Format("Accepting offer {0}", Utils.StringJoin(",", o)));

                    return(null);
                }
            }

            m_rounds--;

            if (m_rounds == 0)
            {
                return(m_counts);
            }

            OfferHolder offer = MakeOffer(m_rounds);

            m_log(Utils.Format("[{0}] Sending offer {1}", m_rounds, offer));

            // don't forget to clone at this point, otherwise local offer could be garbled!
            return(Utils.ArrayClone(offer.Offer));
        }
Example #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);
        }
Example #3
0
        public bool CheckOffer(int[] offer, int turnsLeft)
        {
            // enemy would not offer me the items that could give him 9+ score, so let's remove them from the offer table
            {
                bool changed = false;
                for (int i = 0; i < m_allValues.Length; i++)
                {
                    if (m_excludedValues.Contains(i))
                    {
                        continue;
                    }

                    // enemy income for his offer (inverted counts)
                    int income = AnalyzerEngine.CalculateIncomeForOffer(m_counts, m_allValues[i], offer, false);

                    if (income >= m_maxIncome * RejectThreshold) // items enemy offered me would cost him 9-10, that is very unlikely
                    {
                        m_excludedValues.Add(i);
                        changed = true;
                    }

                    // enemy income for items left to enemy
                    int invIncome = AnalyzerEngine.CalculateIncomeForOffer(m_counts, m_allValues[i], offer, true);

                    if (invIncome < m_maxIncome * MinEnemyIncomeThreshold) // items left to enemy would cost less then 2-3, that is definitelly not possible
                    {
                        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 (according to enemy 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
                }
            }

            OfferHolder holder = AnalyzerEngine.TestOffer(m_counts, m_allValues, m_excludedValues, m_myValuesIndex, offer);

            if (holder == null) // should never happen now
            {
                m_log("!!!!Empty offer!!!!");
                return(false);
            }

            m_log(Utils.Format("[{0}] Checking offer {1}", turnsLeft, holder));

            if (holder.MyIncome >= m_maxIncome * AcceptThreshold) // always accept if we're given good option
            {
                return(true);
            }

            if (turnsLeft <= 1 && holder.MyIncome > 0) // French move ;)
            {
                m_log("I surrender! Give me at least " + holder.MyIncome);
                return(true);
            }

            if (!ValidOffer(holder, true))
            {
                return(false);
            }

            if (m_lastOffer != null && holder.MyIncome >= m_lastOffer.MyIncome) // better than my current offer
            {
                return(true);
            }

            return(false);
        }
Example #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);
        }