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); }
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); }
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 }); }
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); }