Комментарии 207
-Пятачок, там нам пчелы меду прислали. 10 горшков. По 8 каждому получается
-Но Винни, 10 на двоих — это же по 5
-Не знаю, может и по 5, но свои 8 я уже съел
Полагаю, в описание следует добавить уточнение про конец игры при достижении лимита раундов.
Позже мы запустим «живую» таблицу лучших результатов, где будут приведены средние исходы сделок и хэши идентификаторов.
MD5?
Если решение поддерживает только параметры по умолчанию, и падает на любых других комбинациях параметров, оно будет зачтено?
Критерий победы — сумма очков, набранная по результатам переговоров против всех/большинства остальных присланных решений? Будут ли какие-либо туры с выбыванием, или все финальное тестирование проводится в один этап?
Будут ли откровенно "плохие" решения сниматься с участия в финальном тестировании?
Если все работает так, как я думаю, что помешает мне отправить "решения" от имени выдуманных людей (попросить друзей, хм), против алгоритмов которых мое решение умеет торговаться оптимальным образом, а другие игроки, разумеется, с ними не знакомы, и таким образом увеличить собственный результат на финальном тестировании?
Другие игроки могут "спалить" необычное поведение, пообщавшись по api через haggle.js. Это теория игр в чистом виде:)
2. «Мы надеемся, что сможем провести не менее двух сеансов для каждой возможной пары, однако, если решений окажется слишком много, то нам, возможно, придётся выбрать другую систему проведения чемпионата. О конкретной системе будет объявлено позже».
3. Только если мы обнаружим попытку взлома тестовой системы или какое-то другое жульничество.
4. Вам придётся ещё и как-то распознавать «своих» партнёров. Ну и если мы поймём (статистическим анализом), что вы вытворяете что-то такое, а потом почитаем исходники, и подозрения подтвердятся, то дисквалифицируем все решения, участвовавшие в схеме.
Их задача не выиграть, а улучшить очки «своего игрока», которого они должны суметь отличить по первым 4м раундам торговли и отдать ему все предметы, а со всеми чужими ботами сыграть в отказ, чтобы ухудшить их стату.
Также, чтобы избежать анализа «алгоритма определения свой-чужой» со стороны конкурентов, своих подсадных ботов надо заливать в последний момент, и сразу кучу, но тут всплывет нюанс, что и сервак может лечь как под ддосом.
Чтобы сделать эту стратегию не эффективной нужно сделать цену 1го бота ненулевой, например просить к заданию прилагать 1$.
Или просить уникальный скан паспорта или еще какую идентефикацию.
Примерная схема такая — мой бот играет честно, по достаточно средненькой стратегии, но угадываемой по патернам. Мои подставные боты имеют ту же самую стратегию чтобы уметь востанавливать патерн и играют «почти» по ней (почти чтобы они не спутали друг-друга с главным ботом), но угадав главного бота в последнем раунде сливают ему «почти» всё (почти чтобы хуже детектится статистикой).
В этом случае против чужих ботов наши боты (и сливщики, и главный бот) будут играть вполне средненько, а в отношении друг-друга так как нужно нам.
В итоге проигравшие боты играли чуть ниже среднего — они никому не интересны и их много для анализа. Выигравший бот играл абсолютно честно. Он даже не знал что ему поддавались — там нечего анализировать.
Бороться с этим можно как мне кажется только одним способом — проводить по несколько круговых турниров и по их результатам отсеевать половину худших, а половину лучших брать в следующую серию круговых турниров, и учитывать внутри серий только результаты достигнутые внутри них.
В таком случае мне придется написать несолько ботов, которые должны будут не просто сливать все главному, но при этом еще и играть лучше остальных чтобы постоянно оставаться в строю и не быть отсеяными.
В идеальном варианте в последней серии турниров должны остаться только мои боты. Но тогда тот из них который играет наихудшим образом может победить даже без участия остальных моих ботов. Следовательно мне уже не надо писать никаких ботов, кроме одного самого простого.
Как-то так.
В игре есть всего три варианта действий противника:
— Рандом (слишком сложный для анализа алгоритм, обучение нейросети, неверно работающий алгоритм, ГСЧ и т.д.)
— Расчет (калькуляция по какому-то алгоритму)
— Блеф (заранее невыгодный вариант, чтобы сбить с толку анализатор)
Подавляющее большинство «адекватных» программ будет делать расчет. Некоторое количество программ будет делать рандом, несколько уникальных будет делать блеф. Для удобства скажем, что это соотношение 80/15/5. Предположим, что какой-то супер-алгоритм дает шансы 75/50/30, что делает его лучшим среди расчетных, равным с рандомными вариантами и слабее не-анализируемого по своей сути блефа. Достаточно полусотни блефующих и рандомных программ, чтобы все честные алгоритмы потеряли баллы и стали «середнячками», просто потому, что мы сместили фокус соревнования с битвы алгоритмов. Да что говорить, одним этим сообщением я уже смещаю фокус игры, потому что читающие спросят себя «а что такое блеф и как от него защититься?»
Откуда мне знать, чего вы добиваетесь этим конкурсом и какие скилы вам интересно выявить у претендентов на работу.
Ваше новое дополнение к правилам потенциально дает атакующему (тому кто старательно ищет как любыми путями обеспечить себе победу строго следуя букве правил), дискредитировать конкурентов своими ботами накрутив им «карму».
Ессно под каждого конкурента — свой билд.
А самому просто выкатить тупой алгоритм, типа:
— просим ценные нужные предметы
(отказываемся от любых встречных предложений)
— просим мешьше на 1 самый менее ценный
(отказываемся от любых встречных предложений)
— просим еще меньше на 1 самый менее ценный
(отказываемся от любых встречных предложений)
…
соглашаемся на любое предпоследнее предложение
— Вообще, в вашей задаче — нет идеального решения.
Тк под каждое поле алгоритмов — будет своя наилучшая (эксплутационная) стратегия.
Значит победит тот, кто лучше сможет оценить поле (угадать?), какие стратегии доминируют в момент перед закрытием приема заявок.
Или вы ищите тех кто просто равновесие по нэшу сможет найти? (к этой мысли подталкивает то что вы позволяете улучшать разработчикам алгоритмы но в тесте финальном участвует только самый последний).
Ну так в подобных играх нэш является лучшей стратегией только если все поле играет по нэшу и некого эксплотировать.
Если думать так глубоко, то надо собирать пул алгоритмов вкинутых в поле и писать анализатор этих алгоритмов, задача которого сгененировать оптимальный под текущее поле эксплутационный алгоритм и вкинуть его прямо перед закрытием приема заявок.
Такое решение мне правда видится слишком сложным, чтоб кто то стал заморачиваться ради 5к$.
Как это? Ваша программа не знает, с кем играет. Одна и та же версия скрипта встретится со всеми возможными партнёрами.
Отправка решения и запуск его в онлайн-режиме — два независимых действия. Можно отправлять и ни разу не запускать онлайн. Можно и наоборот (но тогда шансов на приз не будет). Можно отправлять одну программу, а онлайн запускать другую, или запускать онлайн несколько версий. Весь этот онлайн-сервер — just for fun.
Необязательно плодить ботов (за это вроде как будут банить, правда, не совсем понятно, как).
Достаточно «всего лишь» постоянно мониторить «рынок» решений 24/7, выделить основные стратегии других игроков и подстраиваться уже под них. Если участников будет достаточно много, то многие из стратегий будут наивными — играть нужно именно на этом.
Поскольку игроки играют друг против друга, плюс стратегии наиболее рьяных участников конкурса постоянно эволюционируют — не существует «оптимальной стратегии в вакууме». Конкурс выиграет тот, кто максимально оптимизирует стратегию под текущую ситуацию на рынке решений.
Оптимальный вариант участия в конкурсе (на втором месте после отказа от оного) — выставить на всеобщее обозрение наивную стратегию и ручками или в полуавтоматическом режиме мониторить чужие стратегии, собрать статистику и уже на ее основании выстраивать решение, которое запостить прямо перед дедлайном.
Сплошные mind games в общем, а не конкурс.
Давайте представим, что в вашем конкурсе решили поучаствовать Вася, Коля и 98 тестировщиков.
Тестировщики просто скопировали и запостили example.js.
Если я правильно понял условия конкурса (все играют со всеми, в учет идет общаяя сумма выигрыша по каждому из торгов), то
Вася, собравший статистику и знающий про example.js в выигрыше: он знает, что его выигрыш по 98 сделкам из 99 может быть сколь угодно большим, если он предложит хотя бы пять монет оппоненту (ему даже не нужно соревноваться с Колей, ему просто нужно знать эту статистику).
Коля, пишущий суперумный алгоритм по оптимизации «сделок», обязательно выиграет у Коли 1х1, но, скорее всего проиграет в конкурсе, т.к. не собирал статистики и не знает, что (в силу ситуации на рынке) нужно не искать компромисс, а давить на «тебе 5, мне сколько выйдет, но побольше».
Я прекрасно понимаю, что ситуация на конкурсе будет сильно сложнее описанного мной, однако очевидная выгода от постоянного мониторинга очевидна.
А как Вася поймет, где какой бот? Допустим, кроме Коли и Васи есть 48 ботов example.js, 48 all-in.js, который согласен менять только "все за все" и 2 evil.js, которые. За 4 хода Васе надо понять, кто против него, и не отдать слишком много.
Как Вася узнает, какие у оппонента цены? Он может предложить предметы, которые ему стоили пятерку, но бот-то за них получит десятку! И получит Вася не "сколь угодно большой выигрыш", а случайную цену. И бот с ботом тоже случайно сыграют. Получается рулетка, а не стратегия.
Написать стратегию, которая будет гарантированно превосходить 98 ботов даже примитивного example.js — нетривиально, если вообще возможно.
Update: Example.js — это "случайный игрок" из https://ncase.me/trust/. Его победить можно в серии игр, но при определенных условиях
Example js — случайный игрок" из ncase.me/trust
Что он делает в контексте текущей задачи? Выбирает случайную стратегию и следует ей? Случайно соглашается/отказывается от предложений? Выставляет случайные предложения?
который согласен менять только «все за все»
Что подразумевается под «все за все»? Он согласен только менять 10 на 10 или не согласен давать выгоду оппоненту? Или согласен на любой равный исход?
Как Вася узнает, какие у оппонента цены?
Он может прикинуть это по первому же предложению от оппонента. Блефовать в текущем конкурсе скорее всего не стоит по следующим причинам:
а) Вы будете получать невыгодные вам обоим предложения от компромиссных стратегий
б) Это может быть выгодно только против жадной стратегии (которая не согласится, если предполагает, что ваш выигрыш больше чем ее)
в) Блефуя (запрашивая дешевые предметы) вы имеете неплохой шанс попасть так, что оппоненту достанется сумма, на которую он безоговорочно согласится (8+), при этом вы останетесь в пролете, т.к. предлагали забрать дешевую хрень, чтобы сбить с толку оппонента.
В таком случае блефовать можно/нужно только если рынок переполнен жадными стратегиями.
на счет блефа — не так он и бесполезен. ведь чтобы победить нужно не конкретную игру выиграть а набрать общую сумму.
хотя надо признать что скорее всего победители наберут основную сумму своего суммарного счета с тупыми ботами, тк их большинство.
… с сумомй для него 5+ ...
Вы так и не пояснили, как играет алл-ин.js и принципиальное отличие предложенной вами ситуации от предложенной мной ранее.
… не так он и бесполезен...
Блеф как раз вреден в долгосрочной перспективе.
Для того, чтобы блеф сработал вам необходимо иметь определенную уверенность, что блеф необходим/полезен в данной конкретной ситуации, что мне представляется невозможным выяснить на пяти раундах торгов без сохранения истории/статистики.
В этом и дело: использовать блеф, как основную стратегию — убыточно практически в любом случае (имеется в виду текущий конкурс).
Мне кажется, что за счет случайного распределения цен, его действия близки к стратегии «сделать случайный ход», именно поэтому написал
Example js — случайный игрок из ncase.me/trust
2. all-in.js, или «все за все» соглашается только на обмен «все мои вещи на все твои». Предлагает только такой обмен, отвергает любые другие предложения
Я утверждаю, что при определенных раскладах example.js будет также предлагать все вещи, но может согласиться и на одну «шляпу». И различить двух ботов, за сессию из всего 5 offer, надежно нельзя.
3.
Как Вася узнает, какие у оппонента цены?
Этот вопрос в в полном виде должен быть сформулирован так: «Допустим, мы знаем что оппонент — бот example.js из статьи. Как Вася узнает, какие у оппонента цены и что он оценит в 5 монет?».
Вчера писал поздно ночью, поэтому вышло немного сумбурно.
Всё таки сделать случайный ход, без оглядки на ценность предметов для себя и действия соперника, и согласиться или нет на чужое предложение подбросив монетку это другое.
И про олл-ин вариант в вашем представлении понятней вообще ни разу не стало. Кмк, опять же, олл-ин стратегия это сверхжадная, ультимативно предлагать вариант который даёт тебе всю сумму (10), оставляя второй стороне только вещи с ценностью для себя 0 (а для него как у него там получится, без разницы).
Сложно уловить вашу нить рассуждений, когда не очень понятны предлагаемые стратегии.
Вторую стратегию я тоже описал достаточно конкретно. Если в вашем понимании all-in должен означать что-то другое, это спор о названиях. Назовите стратегию хоть aaa.js, вопрос не в этом. Изначально haldagan утверждал
Вася, собравший статистику и знающий про example.js в выигрыше: он знает, что его выигрыш по 98 сделкам из 99 может быть сколь угодно большим,
Проблему, которую я поднял, и вопрос, на который хочу получить ответ:
Как Вася поймет, с какой из двух стратегий он торгует? Обе стратегии описаны, одна example.js из статьи, другая
соглашается только на обмен «все мои вещи на все твои». Предлагает только такой обмен, отвергает любые другие предложения
Подчеркну, я не хочу обсуждать насколько хороши обе стратегии. Вопрос, как Васе различить их? Для чего их различать и почему это зачастую затруднительно, я описал в п.2 в предыдущем комментарии
все мои вещи на все твои
Что это значит в реалиях текущего конкурса? В данном конкретном конкурсе интересы могут пересекаться, так что тут нет понятия «твой на мой».
Как Вася поймет, с какой из двух стратегий он торгует?
как Васе различить их
Если Вася знает, что 99% игроков на рынке это поровну — аллин и example — ему не нужно различать их. Ему просто нужно поочередно предлагать выгодные ему сделки, на которые однозначно согласятся вышеупомянутые стратегии. Ну условно:
— Даю тебе 5, мне 10
— «отказ»
… Значит это НЕ екзампле…
— Даю тебе 6, мне 6
— «отказ»
… Значит это НЕ аллин и не екзампле — падаем в отказ, если соперник не предложит мне 10…
Таким образом Вася соберет максимум с екзампле и алл-ин и зарежет все сделки с реальными игроками. Если известные массовые стратегии могут быть эксплуатированы в пользу Васи — нет смысла торговать с единичными, но умными игроками.
Даю тебе 5, мне 10
Есть проблема: вы не знаете ценность предметов для оппонента.
Хотел было опять возразить, что в большинстве случаев можно грубо, но прикинуть, но потом прочитал ваше
всех предметов вместе максимум 6, а не каждого типа в отдельности максимум 5
Вот теперь строить догадки стало существенно сложнее, чем при прежних условиях.
В данном конкретном конкурсе интересы могут пересекаться, так что тут нет понятия «твой на мой».
Как это нет понятия «твой на мой»? Вы почему-то рассуждаете в терминах монет, но обмен идет предметами. После торгов будет ясно, кто выиграл больше.
Вы до сих пор не пояснили, что делает all-in.js
Стратегия «ал-ин» меняет предметы по описанному, дважды, алгоритму. Он намеренно неоптимален, ведь цель моего примера — обсудить стратегию Васи.
— Даю тебе 5, мне 10Вася предложил 5 предметов и просит 10. Это может быть example.js, у которого предложенные 3 фантика стоят 3 монеты, а 2 шляпы — ноль. Вывод Васи неверен.
— «отказ»
… Значит это НЕ екзампле…
Даю тебе 6, мне 6
И тут example.js соглашается. На этапе подсчета все узнают, что он получил, как и Вася, теоретический максимум — 10 монет. А мог бы 5, если бы его распознали.
Пока «Вася» не смог различить две простых стратегии, говорить о том чтобы превзойти их… несколько преждевременно
Я немного исправил описание: всех предметов вместе максимум 6, а не каждого типа в отдельности максимум 5.
Алексей, а это случайно прокравшаяся мысль-идея, на строке 145 в haggle.js
, что max_obj>100
параметр макс числа объектов поднять с 10 до 100, и будет поправлено обратно на макс 10 предметов, или таки грядёт лимит 100?
Ну и тогда уж может определить лимит на $ total заодно? :)
На total при задании с командной строки верхней границы нет. Мы всё равно будем использовать значение по умолчанию (10).
Стратегия «ал-ин» меняет предметы по описанному, дважды, алгоритму. Он намеренно неоптимален, ведь цель моего примера — обсудить стратегию Васи.
То ли я плохо читаю, то ли Вы плохо пишите.
— Алл-ин запрашивает все предметы с ненулевой для него ценностью
— На любое другое предложение следует отказ
Так?
В общем наш спор уже не имеет смысла: поскольку организатор поменял условия с «от 1 до 5 каждый предмет» на «6 предметов в сумме максимум», точно предсказать стоимость предмета для оппонента теперь практически невозможно за 5 раундов.
Непонятно, почему именно это изменение делает такую большую разницу.
Непонятно
Все достаточно просто: с предметами от 1 до 5 было около 120 раскладов по вариантам количества предметов.
Из них чуть больше половины раскладов имела 6 и менее валидных раскладов по стоимости предметов.
То есть в 50% случаев мы могли гарантированно заключить наивыгоднейшую сделку против example.js, просто предложив 5 сделок.
Это, правда, с учетом того, что игроки не могут иметь абсолютно одинаковые ценности предметов. Если это не так — ситуация лишь чуть-чуть ухудшится.
Для остальных 50% случаев пришлось бы более-менее наугад выбирать, это да. Основной подсказкой было бы то, что example.js никогда не запрашивает предметы с нулевой стоимостью.
С нынешними «максимум 6 в сумме», у нас всего 20 вариантов раскладов по количеству, у каждого из которых не менее 14 возможных вариантов раскладов по ценам (около 24 в среднем).
То есть, играя против example.js мы почти(?) никогда не сможем узнать наверняка ценность предметов для него, однако это не значит, что в текущих условиях невозможно создать стратегию, гарантированно побеждающую examle.js
— Алл-ин запрашивает все предметы с ненулевой для него ценностьюНет, не так.
Запрашивает все предметы. Точка. Предлагает все предметы. Точка.
Сразу соглашусь что это глупо. Я намеренно привел неоптимальный, но простой алгоритм действий — только для того, чтобы мы могли обсудить как Вася может отличать ее от example.js. Ошибившись, мы рискуем отдать example.js больше желаемого или не получить от all-in 10 монет.
На любое другое предложение следует отказ.. Да, это верно
значение будут иметь не «победы» и «поражения», а сумма вознаграждений, полученных каждым скриптом во всех сеансах
Есть соблазн последним ходом делать предложение, которое all-in примет, но… Тогда для выигрыша у example.js у нас остается четыре хода вместо пяти.
Запрашивает все предметы. Точка. Предлагает все предметы. Точка.
Вроде понял. В других постах о стратегии «все в признательность за все» не фигурировало название «all-in», посему я не смог сопоставить эти два понятия.
В таком случае в предложенном Вами примере (49 аллин, 49 экзампле, два игрока) вообще не имеет смысла равняться на аллин, поскольку выигрышная тактика против аллин будет сильно проигрывать во всех остальных торгах (и против екзампле и против игрока, поскольку все они сразу же согласятся на вашу сделку на десяточку).
UPD: Уже понял, что ошибся (если Ваш алл-ин может предложить все и на последнем ходу, а не только на первом). Беру время на подумать.
Интересно, а что будут делать организаторы, если быстро придет куча решений, против которых легко победить тупой программой? Например, что если 90% залитых решений будут всё время предлагать противнику 1 самый дешевый предмет и в конце принимать такое предложение, если оно приходило всё время? Тогда они друг против друга будут получать по 5$ в среднем. Против них, когда их ход последний, будет приходить так и так 0-1$, а вот когда ваш ход последний, можно будет либо получить 0, если умничать, либо 9-10$, если реализовать такую же тупую тактику. И конкурс выродится.
Отправка решения и запуск его в онлайн-режиме — два независимых действия. Можно отправлять и ни разу не запускать онлайн. Можно и наоборот (но тогда шансов на приз не будет). Можно отправлять одну программу, а онлайн запускать другую, или запускать онлайн несколько версий. Весь этот онлайн-сервер — just for fun.
А на PHP можно?
Иными словами — получить копейки нет смысла.
Хехехе, хорошо, что вы так думаете )
Если существенная доля ботов будет от одного хозяина — то, сговорившись, они могут использовать это для победы своего кандидата, оставив всех остальных ни с чем.
В любом случае, значение будут иметь не «победы» и «поражения», а сумма вознаграждений, полученных каждым скриптом во всех сеансах.
Ура, новый конкурс! Хм… О_о… В предыдущем конкурсе было явное соревнование алгоритмов, действующих в мире детерминированных правил.
Тут же… хм… я конечно понимаю, что все вспомнили, ну или сейчас узнали, про весёлых человечков с шапочками, но они-то хотя бы статистику по каждому сопернику ведут.
А тут каждая торговля — торговля в масках, маски шоу блин…
Можно было бы в функцию торга offer(o)
ввести второй параметр traderId
(с кем вы гости торг ведёте, и куда теперь плывёте..), но если, как сказано, торговать с одним и тем же товарищем в конкурсном забеге доведётся всего может пару раз, то смысл его анализировать и запоминать?..
Пока выглядят условия так, что самая главная переменная — методика тестирования, неизвестна и соответственно подходящие черты стратегии которые надо закодить, тоже.
Алексей, а логически предсказуемое решение существует вообще?
В JSDash хотя бы понятно было, что да.
Да, как насчёт варианта конкурсного тестирования стратегий — исключительно против одного или нескольких ботов организатора с заранее опубликованными хэшами сурцов этих ботов (чтоб не было и теоретических обвинений мол вы подстроили тест-ботов чтоб не я победил).
А соревнования участников между собой чисто за второстепенные призы. Тогда идея хитрых ботов "ассистентов" сильно меркнет.
… исключительно против одного или нескольких ботов организатора...
Если организатор предоставит возможность поторговать с этими ботами в тестовом режиме — задача сводится все к тому же: собрать статистику и попробовать отреверсить ботов организатора, если нет — задача сведется к «натыкать пальцем в небо».
Задача в текущем виде не имеет однозначного решения, т.к. каждое изменение стратегии любого игрока в большей или меньшей степени сказывается на общем результате каждого из игроков. Чем меньше игроков — тем больше влияние.
Организатор устраивает некий «свободный рынок», при этом, когда особо хитрые товарищи спрашивают насчет ботов, организатор заявляет «нет, ну не настолько свободный, такое мы будем отсеивать».
Я не планирую участвовать в конкурсе, но уже подумываю «попросить друзей» засабмитить 100-500 относительно непредсказуемых стратегий. Четверть — однозначно играющих себе в убыток, четверть — соглашающихся на любой второй-третий-четвертый оффер(случайно), четверть постоянно отказывающих и еще четверть рандомно раздающих офферы (независимо от выгоды).
В этом случае победителя выберет исключительно рандом, ибо построить оптимальную стратегию на псевдослучайных данных (с шумом в виде реальных соперников) невозможно.
Мне вот интересно — «моих» игроков орги тоже побанят в таком случае? Они же никому не подыгрывают, хоть и играют не на победу.
З.Ы.: Подобный саботаж можно устроить и со стратегиями, играющими «на победу». Просто наводнить рынок «средненькими трейдерами», чтобы среди топовых было невозможно выделить однозначно выдающихся.
100 таких решений, естественно, потонут, но они помогут выплыть тем, кто при каких-то условиях способен регулярно предлагать оппоненту 10 монет выгоды.
И, опять же, если вкинуть эти 100 решений заранее, то игроки, ясное дело, приспособятся к наличию такого количества сверхжадных стратегий, но, если сделать это перед самым стартом — результат такого вброса сложно предсказать, т.к. (ИМХО) большинство стратегий будут нацелены именно на компромисс, то есть искать вариант с максимизацией одновременно и своей выгоды и выгоды оппонента.
Чой-то? Есть даже строгое доказательство, что можно, даже для более жесткого случая.
Сложно будет адекватно оценить лучшую стратегию, если все стратегии готовились честно/компромиссно торговать и, внезапно, непосредственно перед стартом «официального турнира» кто-то закинет рандомные стратегии в большом количестве (в разы превышающем честных игроков).
Единственный вариант — поудалять стратегии, закинутые перед стартом.
Вообще, учитывая малое количество раундов и рандом в ценах, уметь торговать с рандомом должны все.
Если же удалить «закинутые перед стартом» и объявить об это заранее (а и наче это нечестно), то злоумышленник закинет их чуть раньше старта. Вобщем выйдет классическая задача с неказнимым преступником.
много ботов которые при предложении им всего — отказываются и в ответ сами отдают все. (признательность за признательность). всем остальным они всегда отказывают (сделка срывается 0-0).
тот кто знает что таких ботов будет большинство — победит. т.к. он с ними получает по 10, остальные с ними получают 0. т.к. их большинство — остальное не важно.
поэтому возможны ситуации когда при большом количестве неадекватов «лучшая» стратегия станет худшей.
и это самый банальный пример, естественно можно и хитрее придумать.
Попробую как смогу в последний раз:
— Игроки пытаются обучить свои «нейронки» торгам с другими игроками
— Ни один из игроков не может обучить свою нейронку в автоматическом режиме на реальных данных (это я понял после очередного поста орга) — история НЕ хранится, плюс, как сказал организатор, «в онлайне играют только те стратегии, авторы которых пустили их в онлайн»
То есть вы будете обучать свою нейронку торгам на ВЫДУМАННЫХ ВАМИ тестовых данных.
Далее:
Предположим, что каждый из игроков угадал, как будут в среднем действовать другие игроки. То есть каждый из них адекватно натренировал свою нейронку на торги с в целом адекватными другими игроками.
Моя мысль:
Как только кто-нибудь вбрасывает значительное количество неадекватных стратегий на последнем этапе, внезапно все игроки перестают быть эффективными: у всех «адекватных» нейронок получается оверфит на адекватных торгах, против реальных торгов, где превалируют стратегии, отличные от тех, на которые были натасканы «адекватные» нейронки.
Как результат — из всех «адекватных» нейронок победит одна самая лояльная к массово вкинутым стратегиям. Это может быть как умышленная так и неумышленная бага поведения.
Если до сих пор непонятно — я сдаюсь. Если кто-нибудь умнее меня почитает мои посты и сможет сформулировать эту мысль как-то более человекопонятно — мои ему благодарности.
Во-вторых, что это за форум такой со школьниками? пикабу? )
В-третьих, как-то палевно 100 раз присылать идентичный файл с разных аккаунтов.
2) форум со школьниками — условное название каких то групп ВК например или где они там сидят (и ориентироваться лучше на студентов, но подойдет любая ЦА которая сумеет скачать и загрузить файл).
3) правилами это не запрещено. один чел не может присылать с разных ящиков, но тут присылают разные реальные люди, пусть алгоритм один, но это тоже не запрещено. Ну и все верят в то что победить должна именно сильная стратегия, поэтому не видят в этом проблемы.
но все принимают допущение что все участники СТРЕМЯТСЯ ВЫИГРАТЬ. если будет много неадекватных алгоритмов одного типа, то это может быть решающим в том чей алгоритм победит.
правилами это не запрещено.Запрещено другое: «Отправка множества решений, находящихся в «сговоре», с разных адресов запрещена; все решения, участвующие в такой схеме, будут дисквалифицированы.».
Но даже если все можно, вопрос в том — какой адекватный человек будет заниматься всей этой ерундой (искать школьников на форумах и т.д.)?
Я уже выражал желание «попросить друзей» по ветке выше.
>и сумеет
Вы пытаетесь «на слабо» взять? Тогда я пас.
Вы можете сказать на каком основании вы сможете отклонить, например, триста заявок с разной (легитимной) почтой, с разными IP, разным кодом, но примерно одинаковым поведением?
300 скриптов с разной структурой и одинаковым поведениемобфускация?
Ну там
var m = '123';
var x = Math.random();
return x>0.5;
...
var k = '321';
var xy = Math.random();
return xy>0.5;
...
var y='231';
var pz = Math.random();
return pz>0.5;
пожалуйста, приложите архив с исходниками, а также, желательно, описанием подхода
Эти стратегии НЕ выйдут в топ — они просто сместят распределение очков в непредсказуемую сторону. Вы/участники всех проверять будете?
А после проверок удалите «залетных» и заново турнир проведете?
Особенно если заранее опубликовать сурс решения, который будет дан «школьникам». А лучше трёх с разными стратегиями, и все их дать «школьникам». Значит все участники будут в курсе и ни на какое конкретно решение из участников «масс-приглашённые» не могут быть объявлены работающими — ведь все были в курсе.
Да, придумаем, как такое отсеять.
суть в том что нет лучшей стратегии в этой игре. можно говорить лишь о лучшей стратегии против конкретной другой.
я уже приводил пример, когда большое количество неадекватов сделает лучшую стратегию худшей, а худшую — лучшей (отдай все первым ходом и ты победишь) habr.com/company/hola/blog/414723/?reply_to=18806589#comment_18806445
поэтому невозможно сделать лучшую стратегию в вакууме. победит тот кто подстроится под большинство. если же никто не сделает специальный вброс своих ботов с одной стратегией, то самая популярная стратегия будет example.js
Это в наше-то время, когда зачатки Матрицы под собирательным названием "Биг дата" знают в каком кафе вчера вы были, с кем встречались в городке который и не помните три года назад, куда и когда собираетесь в отпуск, что у вас болит, знают какого цвета бельё у жены и помнит все ваши реплики в соцсетях и мессенджерах и далее далее?
И тем более, в случае сколь нибудь значимой сделки разве не рассматривается деловая репутация, ваши прошлые сделки, биография и иные параметры прежде чем её совершить? Сложно представить реальную ситуацию, при которой с только что подвернувшимся неизвестным надо тут же заключить сделку с серьёзными лицами, не заглянув и банально в гугл, без юр. проверки документов, безникто.
О котором (почти*, см.гугл, по городу фио телефону почте отзывы) ничего неизвестно бывает, при встречах из рук в руки по типу авито, но боюсь представить себе экономическую реальность только на таких сделках. :)
Конкурсная условность понятна, ок.
Предпочитаю супермаркеты у которых под продуктом чёткий ценник, кассовый аппарат всё такое. А даже если пользуясь рынком, заранее знать что сколько должно стоить и как свежесть проверить, и торговаться более 20 секунд не люблю. Ох, не восточный похоже я человек… )
Смотрим на человека, как он выглядит, во что одет, как пахнет, двигается, его национальность итп.
Для себя оценочно выводим его социальный статус и вычисляем априорную вероятность насколько стоит доверять человеку «такого типа».
Тут же скриптам есть смысл торговаться и за совершенно ненужный им хлам даже если им уже предложили товаров на все $10.
— можно и в пролете остаться, предложили на 10 надо забирать сразу
— нету смысла пытаться еще опустить по рейтингу скрипт который отдает на 10$, в топ он и так не выйдет с такими предложениями
Если вам сделали весьма щедрое предложение, а вы отказались, возможно что такого щедрого предложения больше вам чужой скрипт не предложит.
возможно что такого щедрого предложения больше вам чужой скрипт не предложит
После небольших опытов с ареной скажу даже больше: некоторые стратегии не соглашаются на свои же сделки. Ну то есть оппонент предлагает сделки на «4, 6, 6, 6» в твою пользу, ты ему на последнем ходу «ладно, предложу тебе твою же последнюю сделку за 6» а он тебе «не хочу», и, как итог 0:0 вместо условных 6:7.
> node haggle.js -m 10 -M 10 -V 2000000 ...
haggle.js
падает по нехватке памяти. В условии задачи нет лимита на общую цену товаров: $2 000 000 скрипт принимает как валидное значение, но не тянет. Пропустили лимит или так и задумано?
«Для окончательного тестирования мы будем использовать параметры тестовой системы по умолчанию: 3 типа объектов, от 1 до 5 объектов каждого типа, суммарная ценность всех объектов для каждого из партнёров $10, лимит в 5 раундов».
А в той которая "попарная система тестирования чемпионата", что до "окончательного тестирования", там как-либо V определено? Тоже $10 или что-то иное и до какого лимита, если он есть?
Мы будем устраивать попарные переговоры между скриптами, присланными участниками конкурса. Мы надеемся, что сможем провести не менее двух сеансов для каждой возможной пары, однако, если решений окажется слишком много, то нам, возможно, придётся выбрать другую систему проведения чемпионата. О конкретной системе будет объявлено позже. В любом случае, значение будут иметь не «победы» и «поражения», а сумма вознаграждений, полученных каждым скриптом во всех сеансах.
Из этого абзаца — это система проведения чемпионата. Того самого который места определяет, надо понимать. Суммы, полученные на этом этапе каждым будут составлять сколько-то.
Попарные переговоры, о которых речь идёт в этом абзаце — с какими параметрами? Не понятно.
А далее, как излагает отдельный следующий абзац, будет проведён прогон "окончательного тестирования с параметрами по умолчанию" (скриптов каждого участника с — какими скриптами? ).
Что тут ещё подумать, кроме как что итоговый результат будет равен сумме прогона с "попарных переговоров" (с неизвестными параметрами) и "окончательного тестирования (кого с кем?) с параметрами по умолчанию".
Может у меня одного нейроны не в порядке и не вижу чёткого условия. :) Как-то ясности не хватает в методике проведения чемпионата в общем.
Означает ли это, что она может быть и отрицательной?
По-идее, это лучше, чем предметы с нулевой ценностью, так как даёт стимул отдать хоть что-то.
generate.js
. let max = this.max_obj-total_count-this.types+i+1;
Дает max не больше 3 с такими параметрами.
Я исправил текст поста. Параметры
--min-objects
и --max-objects
ограничивают не число объектов каждого типа, а суммарное число всех объектов. Значение по умолчанию (которое мы будем использовать при тестировании решений) для --max-objects
увеличилось до 6.Прошу прощения! Хорошо, что это заметили всего лишь на второй день.
Я арену, кстати, ещё не успел «пощупать». Если арена возвращает в конце торгов ценность объектов аппонента, то можно будет набрать данные для тестирования и проверки алгоритма обучения, а если не возвращает, то всё становится намного сложнее в плане реализации самообучаемого алгоритма…
Возвращает.
Но все равно, сколько я не думаю — не могу придумать как там адекватно что-то, чему-то обучить. Пока ваяю наивную стратегию и надеюсь на появление обещенной статистики арены.
А: Привет, а хочешь один мяч? (заведомо невыгодный вариант)
E: Нет. И я тебе дам «ничего»
A: О_О как «ничего», разве так можно? Ну бери два мяча.
E: Нет. И я тебе дам «ничего»
А: Черт. Окей, вот два мяча и шляпа. Статистика говорит, что мы получим примерно поровну.
E: Нет. И я тебе дам «ничего»
А: Ты совсем упоротый? Ладно, вот тебе книга и две шляпы. Это точно не меньше 4 монет, а медианное возможное значение твоего выигрыша — 6!
E: Нет. И я тебе дам «ничего»
А: Ну и придурок! Возьми хоть две шляпы и два мяча. Я уже точно в минусе, но хоть что-то получим!
E: Нет. И я тебе дам «ничего»
Ничья 0:0.
Через сто раундов:
А: 374 очков
E: 478 очков
Все события и числа вымышлены, на самом деле E говорит «ничего» только если все предметы ценны для него, а в этом случае торговля не затягивается. Вопрос к организаторам лишь один: [0,0,0] — это точно разрешенное предложение?
Конечно, разрешённое. Только ваш пример ничего не добавил к счетам участников, так что осталось загадкой, как они набрали 374 и 478 соответственно.
это в браузере писать или где?
есть представить что все тестовые партии (все со всеми) запустить на одном seed — то выиграет одна тройка скриптов. если запустить на других данных — то будут уже другие.
по-нормальному каждый с каждым должен играть много раз чтобы сгладить влияние входных данных.
P.S. Такой разброс говорит о большом количестве ничейных партий. Они не меняют число win/(win+lose), но меняют среднее значение.
Поэтому полезно отдельно считать ещё среднее среди сеансов, в которых было достигнуто соглашение.
Думаю, это в основном сумма сетевых лагов. Мы это никак специально не замедляем.
А нельзя организовать чатик в телеграме?
Хорошая идея.
https://t.me/hola_challenge_haggling
В моем случае средний результат упал с 7 до 4.5 баллов, это очень много и наводит на мысль, что произошел один из следующих вариантов:
1. На сервере было 2 игрока — мой и example.js (или другой скрипт от авторов), а появление 3го игрока дало такое большое изменение. В таком случае мой результат составил бы 3.5 баллов если алгоритм говорит «всегда нет» или больше, если он хоть иногда соглашается.
2. На сервере было больше игроков, но зашло больше новых скриптов. В таком случае, мой алгоритм оказался уязвим для 1/2-1/3 этих новых и почти все партии с ними заканчивались ничьей или соглашением с минимальным доходом.
3. Кривая побед/поражений упала без внешнего влияния, просто рандом.
К сожалению, графики я прикрутил очень поздно, но все-равно можно увидеть, как в определенное время падает значение Win/(Win+Lose). Напомню, оно должно быть больше 0.5 для побеждающего алгоритма и меньше 0.5, если противники получают больше тебя. Я считаю, что такое падение возможно только при наличии внешних факторов (= новых игроков).
Весьма хотелось бы увидеть схожую информацию от авторов конкурса, чтобы оценивать картину не просто по своим каким-то параметрам.
w/(w+l) — показатель для двух сторон, т.е. «я» vs «те, кто против меня играл». Полезен для понимания, «кто получил больше, я или мои противники».
У нас нет статистики для третьей стороны, т.е. нет вообще понимания, сколько получили «те, кто играли между собой». Для этого и нужен лидерборд, без него мы как ёжики в тумане.
Из пожеланий:
Если ваш скрипт работает, мы рекомендуем, чтобы он постоянно участвовал в онлайн-сеансах, например, с помощью такой команды UNIX shell:
Было бы неплохо, если бы у haggle.js была встроенная опция для многократного запуска/подключения. "--runs=5000", например.
Спаситель! :)
Ну тысяча то вряд ли, наверное с 50, может 100 участников будет, кмк. Ну и в рандом 3 из 100 попасть небольшой шанс есть.
Про параметр для многократного запуска — нужен, поддерживаю всецело. Можно ещё --runs=unlim
и брякать по обычному Ctrl+C.
Тогда пришлось бы придумывать, как формировать имена файлов для логов. Но я приму грамотно написанный PR.
Тогда пришлось бы придумывать...
Тут Вы слегка лукавите: при запуске предложенного Вами баш-скрипта логи вообще не пишутся, а если бы и писались, то, при запуске со статичным параметром, перезаписывали один и тот же файл, либо по усмотрению запускающего, сохраняли бы вывод куда-нибудь.
… как формировать имена файлов для логов...
Не надо формировать — дозаписывайте в тот же при наличии параметра на многократный запуск.
Может быть когда-то люди поймут ценность открытости и смогут сказать:
«Для меня книга имеет ценность $4, каждый мяч — $2, а шляпы ценности не имеют. Что ценно для тебя? Давай поделимся...»
Можно свои/друзей разные версии понаблюдать в динамике междусобойчиковой. Можно и друг с другом мериться у кого хэш круче. :)
Конкурс по программированию: Торговля