Методика определения любимых стилей игроков

Модератор: Модераторы форума

Сообщение Maximus 18 авг 2011, 19:19
Хорошо, что я успел, до обновления, познакомиться с первоисточником. Было это где-то пару лет назад. За представленный ныне вариант не взялся бы, всё равно не осилить. Уравнения, ёшкин кот. Прогресс, мать его.

Прошу понять меня правильно. Не все разбираются в уравнениях. А во взаимопонимании разобраться хочется многим.

Для тех, кто не силён в высшей супер-пупер-математике, сообщаю: есть старинный метод Killer-а. Метод №2. Теперь он содержится в спойлере "Устаревшие методики". Метод - шикарный; можно ни черта не понимать в математике, но разобраться во взаимопонимании. И ошибок там, кстати, нет. Если не прав - автор поправит. Автору - респект и уважуха. Не знаю ничего более полезного во ВСОЛе, чем методики определения стилей от Killer-а.
Maximus
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение Killer74 18 авг 2011, 21:04
Спасибо за теплые слова, но новый метод, даже не метод, а принцип определения по эффективности на порядок лучше любых старых. Математика там на самом деле самая элементарная - уровня начальной школы. Можно было бы обойтись без нее, просто это самый короткий и удобный способ записать алгоритм расчета.
В старых методах присутствуют не ошибки, а скорее совершенно лишние, паразитные действия. В первом методе совсем не обязательно играть всеми стилями одним составом - это просто лишнее действие. Во втором методе можно обойтись без пары, более того, можно совершенно спокойно варьировать состав, образуя десятки простых систем уравнений, каждая из которых будет давать информацию.
Ну и главное преимущество нового метода - скорость определения существенно выше любого другого метода. В Сент-Жиле у меня ушло на полное определение команды меньше сезона при том, что не пришлось ставить игроков не на свои позиции и играть неподходящими стилями. Просто отправлял составы подходящие для конкретной ситуации и играл подходящим стилем. Каждая(!) игра давала какую-то информацию.
Killer74
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение True_Zaratustra 19 авг 2011, 08:34
Killer74, спасибо, очень хороший материал.
Некоторое замечание: при достаточно большом количестве уравнений в системе (а это потребуется, если в команде нет игроков известного стиля или же их мало), решать систему уравнений вручную будет слишком долго и высока вероятность ошибки. Поэтому этот процесс лучше автоматизировать. А для этого функции f1, f2 нужно формализовать.

Формализация для функции f2 - очевидная:
В терминах логики:
f2(x,s)=0, если x != s
f2(x,s) = 2, если x=s
Логического выражения будет достаточно, если мы будем писать программку, которая будет нам решать системы уравнений на С++. Если не хочется заморачиваться и использовать что-то типа маткада, нужно математическое выражение.
Мат.выражением выразить несколько сложнее. Возьмем для себя условие, что (s и x=1 при норме, 2 при спартаке, 3 при кате, 4 при комбе, 5 при британи, 6 при бб). Тогда:
f2(x,s) = 2 * |sgn(F)| , где F = |sgn(x-s)|-1
таким образом
если x=s, F= |0|-1 = -1 и тогда f2=2*|sgn(-1)|=2
если x!=s, F=|+-1|-1=0 и тогда f2=2*|sgn(0)|=0

Формализовать аналогичным образом f1 будет сложнее. Но я не думаю, что мой способ подбора фунции(по сути это реально был подбор) - оптимальный, а знаний по работе с дискретными функциями из области институтской программы осталось мало.
Killer74, возможно ты подскажешь более удачный способ формализации этих функций.
Так говорил Заратустра...
True_Zaratustra
Эксперт
 
Сообщений: 6475
Благодарностей: 313
Зарегистрирован: 09 апр 2009, 10:37
Откуда: Аликанте, Испания
Рейтинг: 495
 
(без команды)
 

Re: Методика определения любимых стилей игроков
Сообщение Limp 19 авг 2011, 08:52
формулы - это хорошо и здорово, но для кого-то они действительно являются слишком сложными.)

я когда определял свою барбадосскую команду (не скрою, что удалось мне это сделать без единого игрока известного стиля за 22 матча - 22 игрока, не без доли везения, конечно) менял игроков местами, перед этим набросав табличку возможных вариантов изменения взаимки, все это делалось без ущерба игры, то есть если поменять двух центральных защитников/полузащитников/нападающих местами ничего ведь страшного не случиться? Так вот, играешь с 4-4-2 один матч, потом меняешь местами двух центральных защитников, получаешь либо такую же взаимку, либо другую и смотришь в табличку - разница во взаимке 32 (-32), стало быть две пары по краям и между ними коллизия превращается в три коллизии (или наоборот, в случае с -32). Конечно, если взаимка остается прежней - это самый худший вариант, так как предполагается 22 возможных варианта событий, тогда переходим к центральным полузащитникам. К нападающими проще, так как разбитие происходит не между четырьмя игроками, а между тремя, соответственно, вариантов разницы взаимки в разы меньше)

а вообще, конечно, надо включать голову.)...я вот нескольким ребятам определял стили всей команды сразу по уже сыгранным матчам - не просто, трудо- и времязатрано, но интересно же). самый кайф, когда игроки определяются и словно паззл собираются, обретая свои стили)...
Limp
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение Killer74 19 авг 2011, 09:28
True_Zaratustra писал(а):Killer74, спасибо, очень хороший материал.
Некоторое замечание: при достаточно большом количестве уравнений в системе (а это потребуется, если в команде нет игроков известного стиля или же их мало), решать систему уравнений вручную будет слишком долго и высока вероятность ошибки. Поэтому этот процесс лучше автоматизировать. А для этого функции f1, f2 нужно формализовать.
Автоматизация конечно подразумевается, куда без неее :). Очень давно вручную ничего не считаю. Согласен, главная проблема ручных методик - необходимость быть очень аккуратным и многократно себя перепроверять. В Бако при ручном определении из-за единственной ошибки неправильно определил около десятка игроков. Очень долго потом пришлось искать эту ошибку.

True_Zaratustra писал(а):Формализация для функции f2 - очевидная:
В терминах логики:
f2(x,s)=0, если x != s
f2(x,s) = 2, если x=s
Логического выражения будет достаточно, если мы будем писать программку, которая будет нам решать системы уравнений на С++. Если не хочется заморачиваться и использовать что-то типа маткада, нужно математическое выражение.
Мат.выражением выразить несколько сложнее. Возьмем для себя условие, что (s и x=1 при норме, 2 при спартаке, 3 при кате, 4 при комбе, 5 при британи, 6 при бб). Тогда:
f2(x,s) = 2 * |sgn(F)| , где F = |sgn(x-s)|-1
таким образом
если x=s, F= |0|-1 = -1 и тогда f2=2*|sgn(-1)|=2
если x!=s, F=|+-1|-1=0 и тогда f2=2*|sgn(0)|=0
ну да все верно

True_Zaratustra писал(а):Формализовать аналогичным образом f1 будет сложнее. Но я не думаю, что мой способ подбора фунции(по сути это реально был подбор) - оптимальный, а знаний по работе с дискретными функциями из области институтской программы осталось мало.
Killer74, возможно ты подскажешь более удачный способ формализации этих функций.
На самом деле программно я эту функцию не реализовывал. Просто программа писалась раньше, чем появилась окончательная теория (как это к сожалению часто бывает). Вместо этого использовал несколько функций, которые совместно выполняли эту задачу. На cache эта функция выглядела бы примерно так:
F4(x1,x2,x3,st)
{
s iRet=$G(^col(x1,x2))+$G(^col(x2,x3))+(x2=st)
q iRet
}
где ^col(x1,x2) - глобал, содержащий все возможные значения соседей
^col(1,1)=6 - норма с нормой
^col(1,2)=0 - норма с бей-беги
^col(1,3)=0 - норма с комбой
^col(1,4)=0 - норма с британью
^col(1,5)=0 - норма с катеначчо
^col(1,6)=0 - норма со спартаком
^col(2,1)=0 - бей-беги с нормой
^col(2,2)=6 - бей-беги с бей-беги
^col(2,3)=-2 - бей-беги с комбой
...
номера стилей взял свои, просто давно уже к ним привык. На самом деле нулевые значение в cache хранить не имеет смысла. В реальности у меня хранятся только значимые, т.е. ненулевые комбинации стилей. На том же С++ можно вместо глобала хранить двумерный массив с индексами стилей и значениями их соседства, но в данном случае необходимо хранить все возможные варианты.

Для программного расчета годятся любые системы, которые понижают общее количество вариантов системы, по сравнению с произведением количества вариантов отдельных уравнений. Т.е. имеется корреляция, чем она выше, тем легче произвести расчет. Конечно полные дубли (игры асболютно одинаковыми составми) никакой информации не несут и системы из одинаковых игр строить бессмысленно.

Limp писал(а):формулы - это хорошо и здорово, но для кого-то они действительно являются слишком сложными.)
На самом деле нет никакой разницы. Фраза сказанная по-русски кажется простой, то же самое сказанное по-китайски покажется невероятно сложным, но это лишь сложность восприятия, но не сложность содержания.

Limp писал(а):я когда определял свою барбадосскую команду (не скрою, что удалось мне это сделать без единого игрока известного стиля за 22 матча - 22 игрока, не без доли везения, конечно) менял игроков местами, перед этим набросав табличку возможных вариантов изменения взаимки, все это делалось без ущерба игры, то есть если поменять двух центральных защитников/полузащитников/нападающих местами ничего ведь страшного не случиться? Так вот, играешь с 4-4-2 один матч, потом меняешь местами двух центральных защитников, получаешь либо такую же взаимку, либо другую и смотришь в табличку - разница во взаимке 32 (-32), стало быть две пары по краям и между ними коллизия превращается в три коллизии (или наоборот, в случае с -32). Конечно, если взаимка остается прежней - это самый худший вариант, так как предполагается 22 возможных варианта событий, тогда переходим к центральным полузащитникам. К нападающими проще, так как разбитие происходит не между четырьмя игроками, а между тремя, соответственно, вариантов разницы взаимки в разы меньше)
Ты описал частный случай применения предлагаемого принципа. Суть можно сформулировать так - делаем небольшие изменения в составе (для ручного расчета лучше делать одно изменение) для того, чтобы сохранить высокую корреляцию и производим расчет, например, методом перебора вариантов. Из-за снижения порядка получившегося уравнения или системы уравнений перебор вариантов происходит практически мгновенно. Главное преимущество в том, что можно определить любого(!) игрока достаточно много сыгравшего. Довольно часто игрок определяется за одну игру. Вся прелесть в том, что изменение можно делать любое, не подстраиваясь ни под какую схему. Ну и при достаточном количестве игр можно определить любую чужую команду.

Limp писал(а):а вообще, конечно, надо включать голову.)...я вот нескольким ребятам определял стили всей команды сразу по уже сыгранным матчам - не просто, трудо- и времязатрано, но интересно же). самый кайф, когда игроки определяются и словно паззл собираются, обретая свои стили)...
Я так вручную определял Дэйреллс Роуд - это была последняя команда определенная вручную, после чего понял, что процесс нужно автоматизировать иначе будет уходить слишком много времени
Killer74
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение Колян07 19 авг 2011, 18:42
Есть вопрос а почему используется в функции 2 пары а не одна. и при этом при суммирование будет сумма значительно привышающая сумму взаимопонимания. Так почему бы не использывать функцию с з аргументами f1(x1.1,x2.1,s1)+...+f1(x10.1,x11.1,s1) ну и + запасных.
А на счет массива он наверно всёже должен быть 3-х мерный видь стиль игры у команд будет разный ну и бонус за совпадение стиля в массиве учесть необходимо будет.
Колян07
Опытный менеджер
 
Сообщений: 439
Зарегистрирован: 09 мар 2007, 20:14
Откуда: Пятигорск, Россия
Рейтинг: 540
 
Хард (Хард, Австрия)
Айви Роверс (Айви, Барбадос)
Аль-Талия (Маскат, Оман)
 

Re: Методика определения любимых стилей игроков
Сообщение Killer74 19 авг 2011, 22:40
Nikolai писал(а):Есть вопрос а почему используется в функции 2 пары а не одна. и при этом при суммирование будет сумма значительно привышающая сумму взаимопонимания. Так почему бы не использывать функцию с з аргументами f1(x1.1,x2.1,s1)+...+f1(x10.1,x11.1,s1) ну и + запасных.
А на счет массива он наверно всёже должен быть 3-х мерный видь стиль игры у команд будет разный ну и бонус за совпадение стиля в массиве учесть необходимо будет.
Сначала последний вопрос. 2-хмерный массив используется просто чтобы лишние ресурсы не тратить. 3-хмерный массив - это 6х6х6=216 элементов. Их ведь заполнять надо. Конечно, вполне можно и трехмерный использовать, кому как нравится. Мне просто лень было рассчитывать и заполнять такой объем, гораздо проще считать пары.
Теперь что касается первого вопроса. В принципе вполне можно использовать функцию именно пары игроков и стиля игры, а не трех игроков. Самое смешное, что именно так я и делаю. Я уже упоминал об этом. Функция от трех игроков у меня не используется. Запись функции двух игроков имеет одно несомненное преимущество, а именно позволяет учесть корреляцию, которая в функции трех игроков будет проигнорирована. Простой пример комбинация игроков Иванов, Петров, Сидоров и комбинация Иванов, Сидоров, Петров не покажет никакой связи в случае функции от трех игроков, хотя связь несомненно присутствует. Пару Сидоров-Петров можно спокойно выносить за скобки в обеих комбинациях. Абсолютно верное замечание. В шапке поправлю. Спасибо. Пытался сделать максимально "красивую" теорию, а в результате вместо подтвержденной практикой теории нарисовал какого-то монстра, применение которого явно уступает более простой и эффективной методике.
Killer74
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение Mann 23 авг 2011, 02:26
Привет, Killer74!

Если не секрет, скажи плз сколько времени твоя программа определяет стили всех игроков команды с нуля?
И ещё, на чем написана прога?

Спасибо :-)
Mann
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение Killer74 23 авг 2011, 10:25
Mann писал(а):Привет, Killer74!

Если не секрет, скажи плз сколько времени твоя программа определяет стили всех игроков команды с нуля?
И ещё, на чем написана прога?

Спасибо :-)

Время определения уже загруженной команды варьируется от нескольких секунд до нескольких часов. Правда не все команды удается определить. У некоторых приходилось большую часть игр просто отбрасывать.
Программа на cache, вернее на COS, а платформа cache.
Killer74
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение maccof 23 авг 2011, 14:19
Killer74 писал(а):
Mann писал(а):Привет, Killer74!

Если не секрет, скажи плз сколько времени твоя программа определяет стили всех игроков команды с нуля?
И ещё, на чем написана прога?

Спасибо :-)

Время определения уже загруженной команды варьируется от нескольких секунд до нескольких часов. Правда не все команды удается определить. У некоторых приходилось большую часть игр просто отбрасывать.
Программа на cache, вернее на COS, а платформа cache.

Господа - так вопрос - есть всё таки эта прога в доступе где-то??
maccof
Менеджер
 
Сообщений: 177
Зарегистрирован: 20 дек 2006, 19:05
Откуда: Донецк
Рейтинг: 517
 
Македония (Скопье, Северная Македония)
Калтенг Путра (Паланкарая, Индонезия)
Тудор Бридж Бомберс (Бриджтаун, Барбадос)
 

Re: Методика определения любимых стилей игроков
Сообщение Killer74 23 авг 2011, 14:53
maccof писал(а):Господа - так вопрос - есть всё таки эта прога в доступе где-то??
:D
Программа на самом деле примитивная, могу выложить исходник, кто захочет разбирайтесь. Тем более что, алгоритм простой и вполне очевидный. Мне лично было бы проще написать свое, чем разбираться в чужом исходнике.
Killer74
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение Колян07 24 авг 2011, 05:49
а принцеп перебора или какой то другой.
Колян07
Опытный менеджер
 
Сообщений: 439
Зарегистрирован: 09 мар 2007, 20:14
Откуда: Пятигорск, Россия
Рейтинг: 540
 
Хард (Хард, Австрия)
Айви Роверс (Айви, Барбадос)
Аль-Талия (Маскат, Оман)
 

Re: Методика определения любимых стилей игроков
Сообщение Killer74 24 авг 2011, 07:52
Nikolai писал(а):а принцеп перебора или какой то другой.
окончательный расчет по принципу перебора, предварительный - за счет упрощения систем уравнений.

Программы как таковой нет, есть набор скриптов, каждый выполняет какую-то задачу. Без понимания принципов воспользоваться им будет крайне затруднительно. Сразу предупреждаю консультаций по исходному коду давать не буду, поскольку чтобы рассказать все потребуется много времени, а ответ на пару вопросов ничего не даст.

 Скрипты для определения стилей
DefPl() PUBLIC
{
//k ^dPlT
//k ^dTPl
s %="^"

s t=$O(^dGBUF(""))
while t'=""
{
s d=$O(^dGBUF(t,""))
while d'=""
{
s sTemp=^dGBUF(t,d)
if ($P(sTemp,"^",18)'="")&&($P(sTemp,"^",19)="")
{
if ('$D(^dGam(t,d)))&&('$D(^dBadGam(t,d)))&&('$D(^dGoodGam(t,d)))&&('$D(^dGam3(t,d)))
{
s ^dGam(t,d)=sTemp
}

f i=1:1:16
{
s PlID=$P(sTemp,"^",i)
if PlID>0
{
if '$D(^sPl(PlID)) {s ^sPl(PlID)=""}
if $D(^dPlT(PlID,t,"F"))
{
s td=$G(^dPlT(PlID,t,"F"))
if td>d
{
s tt=$O(^dPlT(PlID,""))
while tt'=""
{
if $G(^dPlT(PlID,tt,"F"))=td
{
s ^dPlT(PlID,tt,"F")=d
s ^dTPl(tt,PlID,"F")=d
}
s tt=$O(^dPlT(PlID,tt))
}
if $D(^dPlStD(PlID,td))
{
s st=$O(^dPlStD(PlID,td,""))
while st'=""
{
s ^dPlStD(PlID,d,st)=$G(^dPlStD(PlID,td,st))
s st=$O(^dPlStD(PlID,td,st))
}
k ^dPlStD(PlID,td)
}
}
}
else
{
s ^dPlT(PlID,t,"F")=d
s ^dTPl(t,PlID,"F")=d
}

if $D(^dPlT(PlID,t,"L"))
{
s td=$G(^dPlT(PlID,t,"L"))
if td {
s tt=$O(^dPlT(PlID,""))
while tt'=""
{
if $G(^dPlT(PlID,tt,"L"))=td
{
s ^dPlT(PlID,tt,"L")=d
s ^dTPl(tt,PlID,"L")=d
}
s tt=$O(^dPlT(PlID,tt))
}
if $D(^dPlStD(PlID,td))
{
s st=$O(^dPlStD(PlID,td,""))
while st'=""
{
s ^dPlStD(PlID,d,st)=$G(^dPlStD(PlID,td,st))
s st=$O(^dPlStD(PlID,td,st))
}
k ^dPlStD(PlID,td)
}
}
}
else
{
s ^dPlT(PlID,t,"L")=d
s ^dTPl(t,PlID,"L")=d
}
} //if PlID>0
} //f i=1:1:16

s ^dG(t,d)=^dGBUF(t,d)
k ^dGBUF(t,d)
} //if ($P(sTemp,"^",18)'="")&&($P(sTemp,"^",19)="")
else
{
w "Неверный формат: t=",t,"d=",d,!
} //else if ($P(sTemp,"^",18)'="")&&($P(sTemp,"^",19)="")
s d=$O(^dGBUF(t,d))
} //while d'=""
s t=$O(^dGBUF(t))
} //while t'=""
}


AllPr(tPar) PUBLIC
{
// пурга умеет обрабатывать весь активный пул
s t=$O(^dGam(tPar))
while (t'="")&&(t>0)
{
w "Начали: "_t,!
s GAm=$$IndexTeam(t,3)
s flOk=1
if GAm<100
{
s VarAm=$O(^dGam1(""))
if VarAm>1000
{
s GAm=$$IndexTeam(t,1000)
s flOk=0
}
}

if flOk
{
while flOk>0
{
s flOk=$$Analise(t)
if flOk=0
{
do KillTeam2(t)
s GAm=$$IndexTeam(t,1000)
}
s flOk=flOk-1
}

// $$Analise4(t) - возвращает
// 0 - успешное завершение (обработаны все возможные уравнения)
// >0 - возврат по таймауту с указанием количества исключенных стилей+1
// -1 - отсутствие решений
s Ret=1
s iCount=0
while (Ret>0)&&(iCount<10)
{
do Analise2(t)
s Ret=$$Analise4(t)
w "Analise4: "_Ret,!
if Ret=-1 {s iCount=100}
elseif Ret>1 {s iCount=iCount+1}
elseif Ret=1 {s Ret=0}
}
if Ret=-1
{
do KillTeam2(t)
s GAm=$$IndexTeam(t,1000)
}
elseif Ret=0
{
s GAm=$$IndexTeam(t,1)
s GAm=$$IndexTeam2(t)
if GAm=0
{
f iMyVar=30:-1:3
{
s GAm=$$IndexTeam(t,iMyVar)
if GAm>0
{
s VarCount=$$CountVarTeam(t)
if VarCount<1000000
{
do MainProg(t,t)
s GAm=$$IndexTeam(t,1)
s GAm=$$IndexTeam2(t)
if GAm>0
{
do KillTeam2(t)
s GAm=$$IndexTeam(t,1000)
s iMyVar=0
}
}
else {s iMyVar=0}
}
}
if iMyVar=3
{
s GAm=$$IndexTeam(t,1000)
}

}
else
{
do KillTeam2(t)
s GAm=$$IndexTeam(t,1000)
}
}
}
s t=$O(^dGam(t))
}
q "Ok"
}



GetPlStByD(Pl,Day) PUBLIC
{
s sRet=""
if Pl>0
{
s Fl=0
if $D(^dPlStD(Pl))
{
s iC=0
if $D(^dPlStD(Pl,Day))
{
s St=$O(^dPlStD(Pl,Day,""))
while St'=""
{
s iC=iC+1
s sRet=sRet_"^"_St
s St=$O(^dPlStD(Pl,Day,St))
}
s sRet=iC_sRet
s Fl=1
}
else
{
s d=$O(^dPlStD(Pl,Day),-1)
if d'=""
{
s St=$O(^dPlStD(Pl,d,""))
if $G(^dPlStD(Pl,d,St))
{
s St=$O(^dPlStD(Pl,d,""))
while St'=""
{
s iC=iC+1
s sRet=sRet_"^"_St
s St=$O(^dPlStD(Pl,d,St))
}
s sRet=iC_sRet
s Fl=1
} //if $G(^dPlStD(Pl,d,St))
}
}
}
if 'Fl
{
s sRet="6"
s St=$O(^sFavStyle(""))
while St'=""
{
s sRet=sRet_"^"_St
s St=$O(^sFavStyle(St))
}
}
} //if Pl>0
else
{
s sRet="1^0"
}
q sRet
}

GetPlStByT(Pl,t) PUBLIC
{
s sRet=""
if Pl>0
{
s d=$G(^dPlT(Pl,t,"F"))
s sRet=$$GetPlStByD(Pl,d)
} //if Pl>0
else
{
s sRet="1^0"
}
q sRet
}

DelPlStByT(Pl,t,StID) PUBLIC
{
if Pl>0
{
s Form=^dTPl(t,Pl,"F")
s Latt=^dTPl(t,Pl,"L")

if $D(^dPlStD(Pl,Form))
{
k ^dPlStD(Pl,Form,StID)
k ^dPlStD(Pl,Latt,StID)
} //if $D(^dPlStD(Pl))
else
{
s St=$O(^sFavStyle(""))
while St'=""
{
if St'=StID
{
s ^dPlStD(Pl,Form,St)=1
s ^dPlStD(Pl,Latt,St)=0
}
s St=$O(^sFavStyle(St))
}
} //else if $D(^dPlStD(Pl))
} //if Pl>0
do CorrectPlSt(Pl)
}

CorrectPlSt(Pl) PUBLIC
{
s d3=$C(3)
s t=$O(^dPlT(Pl,""))
while t'=""
{
s d1=$G(^dPlT(Pl,t,"F"))
s d2=$G(^dPlT(Pl,t,"L"))
if '$D(arT(d1,1)) {s arT(d1,1)=t}
else {s arT(d1,1)=arT(d1,1)_d3_t}
if '$D(arT(d2,2)) {s arT(d2,2)=t}
else {s arT(d2,2)=arT(d2,2)_d3_t}
s t=$O(^dPlT(Pl,t))
}
// Объединяем пересекающиеся множества
s iOM=0
s iMax=0
s d=$O(arT(""))
while d'=""
{
s sTs=$O(arT(d,""))
while sTs'=""
{
if sTs=1 {s sT=1}
elseif sTs=2 {s sT=-1}
s CurSts=sT
s iOM=iOM+CurSts
if CurSts=1
{
s i=1
s sct=$G(arT(d,sTs))
s ct=$P(sct,d3,i)
while ct'=""
{
s arM(ct)=d
s i=i+1
s ct=$P(sct,d3,i)
}
}

if iOM=0
{
if iMax>1
{
// Объединяем
k arSTS
s ct=$O(arM(""))
while ct'=""
{
s td1=$G(^dPlT(Pl,ct,"F"))
s td2=$G(^dPlT(Pl,ct,"L"))
if td1>dBeg
{
s ^dPlT(Pl,ct,"F")=dBeg
s ^dTPl(ct,Pl,"F")=dBeg
}
if td2 {
s ^dPlT(Pl,ct,"L")=d
s ^dTPl(ct,Pl,"L")=d
}
s st=$O(^dPlStD(Pl,td1,""))
while st'=""
{
s arSTS(st)=$G(arSTS(st))+1
s st=$O(^dPlStD(Pl,td1,st))
}
k ^dPlStD(Pl,td1)
k ^dPlStD(Pl,td2)
s ct=$O(arM(ct))
}
s st=$O(arSTS(""))
while st'=""
{
if $G(arSTS(st))=iMax
{
s ^dPlStD(Pl,dBeg,st)=1
s ^dPlStD(Pl,d,st)=0
}
s st=$O(arSTS(st))
}
}
s iMax=0
k arM
}
if iMax
if (iOM=1)&&(CurSts=1) {s dBeg=d}

s sTs=$O(arT(d,sTs))
}
s d=$O(arT(d))
}
q
}

LoadPlayer(ID,sName) PUBLIC
{
if ID'=""
{
if $D(^sPl(ID))
{
s ^sPl(ID)=sName
}
}
}


GetPlVar(PlID,Day) PUBLIC
{
//// Пурга умеет возвращать количество вариантов и список стилей
//s d=Day+1
//s d=$O(^dPlayerStyles(PlID,d),-1)
//s iCount=0
//s sRet=""
//if d'=""
//{
// s st=$O(^dPlayerStyles(PlID,d,""))
// while st'=""
// {
// if sRet="" {s sRet=st}
// else {s sRet=sRet_"^"_st}
// s st=$O(^dPlayerStyles(PlID,d,st))
// }
//}
//if iCount=0
//{
// s iCount=6
// s sRet=iCount_$C(2)_"1^2^3^4^5^6"
//}
//else
//{
// s sRet=iCount_$C(2)_sRet
//}
//q sRet
}

IndexTeam(TeamID,MaxG) PUBLIC
{
// Пурга умеет индексировать команду, исключая игры с 0, и игроками
k ^dGam(0)
k ^dGam1
k ^dGam2

// из пассивного пула
s d=$O(^dGam3(TeamID,""))
while d'=""
{
s arG(d)=$G(^dGam3(TeamID,d))
s d=$O(^dGam3(TeamID,d))
}

// из хорошего архива
s d=$O(^dGoodGam(TeamID,""))
while d'=""
{
s arG(d)=$G(^dGoodGam(TeamID,d))
s d=$O(^dGoodGam(TeamID,d))
}

// из активного пула
s d=$O(^dGam(TeamID,""))
while d'=""
{
s arG(d)=$G(^dGam(TeamID,d))
s d=$O(^dGam(TeamID,d))
}

s d=$O(arG(""))
while d'=""
{
s sTemp=arG(d)
f i=1:1:16
{
s Pl=$P(sTemp,"^",i)
if Pl>0
{
s arPl(Pl)=1+$G(arPl(Pl))
}
}
s d=$O(arG(d))
}

s d=$O(arG(""))
while d'=""
{
s sTemp=arG(d)
s MinG=MaxG
f i=1:1:16
{
s Pl=$P(sTemp,"^",i)
if Pl>0
{
if arPl(Pl) }
}
if (MinG {
// в пассивный пул, если еще не попали в хороший архив
s ^dGam3(TeamID,d)=^dGam(TeamID,d)
k ^dGam(TeamID,d)
}
if (MinG>=MaxG)&&($D(^dGam3(TeamID,d)))
{
// в активный пул из пассивного
s ^dGam(TeamID,d)=^dGam3(TeamID,d)
k ^dGam3(TeamID,d)
}
s d=$O(arG(d))
}

s iCount=0
s d=$O(^dGam(TeamID,""))
while d'=""
{
s Amount=$$CountVar(TeamID,d)
s ^dGam1(Amount,TeamID,d)=^dGam(TeamID,d)
s iCount=iCount+1
s d=$O(^dGam(TeamID,d))
}
q iCount
}

CountVar(TeamID,Day) PUBLIC
{
//Пурга умеет считать количество вариантов
s sTemp=^dGam(TeamID,Day)
s iSum=1
f i=1:1:16
{
s PlID=$P(sTemp,"^",i)
s plVar=$P($$GetPlStByD(PlID,Day),"^",1)
s iSum=iSum*plVar
}
q iSum
}


IndexMovs() PUBLIC
{
//// Пурга умеет строить карту перемещений
//s t=$O(^dGames(""))
//while t'=""
//{
// s d=$O(^dGames(t,""))
// while d'=""
// {
// s sG=$G(^dGames(t,d))
// f i=1:1:16
// {
// s PlID=$P(sG,"^",i)
// if PlID>0
// {
// s dm=$G(^dPlMov(PlID,t))
// if dm="" {s ^dPlMov(PlID,t)=d}
// elseif dm>d {s ^dPlMov(PlID,t)=d}
// }
// }
// s d=$O(^dGames(t,d))
// }
// s t=$O(^dGames(t))
//}

//s t=$O(^dGoodGames(""))
//while t'=""
//{
// s d=$O(^dGoodGames(t,""))
// while d'=""
// {
// s sG=$G(^dGoodGames(t,d))
// f i=1:1:16
// {
// s PlID=$P(sG,"^",i)
// if PlID>0
// {
// s dm=$G(^dPlMov(PlID,t))
// if dm="" {s ^dPlMov(PlID,t)=d}
// elseif dm>d {s ^dPlMov(PlID,t)=d}
// }
// }
// s d=$O(^dGoodGames(t,d))
// }
// s t=$O(^dGoodGames(t))
//}

//s t=$O(^dBadGames(""))
//while t'=""
//{
// s d=$O(^dBadGames(t,""))
// while d'=""
// {
// s sG=$G(^dBadGames(t,d))
// f i=1:1:16
// {
// s PlID=$P(sG,"^",i)
// if PlID>0
// {
// s dm=$G(^dPlMov(PlID,t))
// if dm="" {s ^dPlMov(PlID,t)=d}
// elseif dm>d {s ^dPlMov(PlID,t)=d}
// }
// }
// s d=$O(^dBadGames(t,d))
// }
// s t=$O(^dBadGames(t))
//}
//
//s t=$O(^dGames3(""))
//while t'=""
//{
// s d=$O(^dGames3(t,""))
// while d'=""
// {
// s sG=$G(^dGames3(t,d))
// f i=1:1:16
// {
// s PlID=$P(sG,"^",i)
// if PlID>0
// {
// s dm=$G(^dPlMov(PlID,t))
// if dm="" {s ^dPlMov(PlID,t)=d}
// elseif dm>d {s ^dPlMov(PlID,t)=d}
// }
// }
// s d=$O(^dGames3(t,d))
// }
// s t=$O(^dGames3(t))
//}

// теперь проиндексируем в стилях
//s PlID=$O(^dPlMov(""))
//while PlID'=""
//{
// s t=$O(^dPlMov(PlID,""))
// while t'=""
// {
// s d=$G(^dPlMov(PlID,t))
//
// // проверим есть ли записи по этой команде
// s flOk=0
// s ds=$O(^dPlayerStyle(PlID,""))
// while ds'=""
// {
// s ts=$O(^dPlayerStyle(PlID,ds,""))
// while ts'=""
// {
// if (ts=t)&&(ds=d) {s flOk=1}
// elseif (ts=t)&&(ds'=d) {s flOk=2}
//
// s ts=$O(^dPlayerStyle(PlID,ds,ts))
// }
// s ds=$O(^dPlayerStyle(PlID,ds))
// }
//
// if flOk=0
// {
// //s ^dPlayerStyle
// }
//
// s t=$O(^dPlMov(PlID,t))
// }
// s PlID=$O(^dPlMov(PlID))
//}
}


Analise(t) PUBLIC
{
// Пурга умеет анализировать
// Индексируем
k ^arG
s d2=$C(2)
s d=$O(^dGam(t,""))
s CurInd=0
while d'=""
{
s sTemp=""
f i=1:1:10
{
s sTemp=sTemp_$P(^dGam(t,d),"^",i)_"^"
}
s sTemp=sTemp_$P(^dGam(t,d),"^",11)

if $D(arInd(sTemp)) {s sInd=arInd(sTemp)}
else
{
s CurInd=CurInd+1
s arInd(sTemp)=CurInd
s sInd=CurInd
}

k arPl
f i=12:1:16
{
s PlID=$P(^dGam(t,d),"^",i)
s arPl(PlID)=""
}
s sT2=""
s PlID=$O(arPl(""))
while PlID'=""
{
if sT2'="" {s sT2=sT2_"^"_PlID}
else {s sT2=PlID}
s PlID=$O(arPl(PlID))
}
s Style=$P(^dGam(t,d),"^",18)
s Vz=$P(^dGam(t,d),"^",17)

s ^arG(sInd,Style,Vz,d)=sT2
s d=$O(^dGam(t,d))
}

// Удалим лишних
s ind1=$O(^arG(""))
while ind1'=""
{
s ind2=$O(^arG(ind1,""))
while ind2'=""
{
s iCount=0
s ind3=$O(^arG(ind1,ind2,""))
while ind3'=""
{
s ind4=$O(^arG(ind1,ind2,ind3,""))
while ind4'=""
{
s iCount=iCount+1
s ind4=$O(^arG(ind1,ind2,ind3,ind4))
}
s ind3=$O(^arG(ind1,ind2,ind3))
}
if iCount<2
{
k ^arG(ind1,ind2)
}
s ind2=$O(^arG(ind1,ind2))
}
s ind1=$O(^arG(ind1))
}

k arInd
k d
k sTemp
k i
k CurInd
k sInd
k arPl
k PlID
k sT2
k Style
k Vz
k ind1
k ind2
k ind3
k ind4
k iCount

// Считаем
s flAllOk=1
s ind1=$O(^arG(""))
while (ind1'="")&&flAllOk
{
s ind2=$O(^arG(ind1,""))
while (ind2'="")&&flAllOk
{
k arPl
k arGame
k arPlNum
k MyRez
s iPlCount=0

s ind3=$O(^arG(ind1,ind2,""))
while ind3'=""
{
s ind4=$O(^arG(ind1,ind2,ind3,""))
while ind4'=""
{
s arGame(ind4)=ind3
f i=1:1:5
{
s Pl=$P(^arG(ind1,ind2,ind3,ind4),"^",i)
if (Pl'="")&&(Pl'=0)
{
if '$D(arPl(Pl))
{
s iPlCount=iPlCount+1
s arPlNum(iPlCount)=Pl
}

s sPlSt=$$GetPlStByD(Pl,ind4)
s iAmount=$P(sPlSt,"^",1)
f j=1:1:iAmount
{
s PlSt=$P(sPlSt,"^",j+1)
if PlSt=ind2
{
s arPl(Pl,2)=""
}
else
{
s arPl(Pl,0)=""
}
}
if $D(arPl(Pl,0)) {s arGame(ind4,Pl)=0}
elseif $D(arPl(Pl,2)) {s arGame(ind4,Pl)=2}
}
}

s ind4=$O(^arG(ind1,ind2,ind3,ind4))
}
s ind3=$O(^arG(ind1,ind2,ind3))
}

s Pl=$O(arPl(""))
while Pl'=""
{
s arPl(Pl)=$O(arPl(Pl,""))

s St=$O(arPl(Pl,""))
while St'=""
{
s MyRez(Pl,St)=0
s St=$O(arPl(Pl,St))
}
s Pl=$O(arPl(Pl))
}

s iSucCount=0
s i=iPlCount
s indSt=$O(arPl(arPlNum(iPlCount),""))
while i>0
{
// Делаем расчет варианта
s flOk=1
s Dif=1
s Day=$O(arGame(""))
while (Day'="")&&(flOk=1)
{
s iSum=0
s Pl=$O(arGame(Day,""))
while Pl'=""
{
s iSum=iSum+arGame(Day,Pl)
s Pl=$O(arGame(Day,Pl))
}
if Dif=1
{
s Dif=arGame(Day)-iSum
}
else
{
if Dif'=(arGame(Day)-iSum) {s flOk=0}
}

s Day=$O(arGame(Day))
}
if flOk
{
s iSucCount=iSucCount+1
s CurPl=$O(arPl(""))
while CurPl'=""
{
s MyRez(CurPl,arPl(CurPl))=MyRez(CurPl,arPl(CurPl))+1
s CurPl=$O(arPl(CurPl))
}
}

// Затем меняем состояние i-го элемента
s indSt=arPl(arPlNum(i))
s NewInd=$O(arPl(arPlNum(i),indSt))
if NewInd=""
{
// Перенос в более старший разряд
while (i>0)&&(NewInd="")
{
// пока у i-го игрока стилей больше нет
s NewInd=$O(arPl(arPlNum(i),NewInd))
if NewInd'=indSt
{
s indSt=NewInd
s arPl(arPlNum(i))=indSt

s DayID=$O(arGame(""))
while DayID'=""
{
if $D(arGame(DayID,arPlNum(i))) {s arGame(DayID,arPlNum(i))=indSt}
s DayID=$O(arGame(DayID))
}
} //if NewInd'=indSt
s i=i-1
if i>0
{
s indSt=arPl(arPlNum(i))
s NewInd=$O(arPl(arPlNum(i),indSt))
} //if i>0
} //while (i>0)&&(NewInd="")
if (i>0)&&(NewInd'=indSt)
{
s indSt=NewInd
s arPl(arPlNum(i))=indSt
s DayID=$O(arGame(""))
while DayID'=""
{
if $D(arGame(DayID,arPlNum(i))) {s arGame(DayID,arPlNum(i))=indSt}
s DayID=$O(arGame(DayID))
}
} //if (i>0)&&(NewInd'=indSt)
if i>0 {s i=iPlCount}
} //if NewInd=""
else
{
// меняем состояние в текущем разряде
s indSt=NewInd
s arPl(arPlNum(i))=indSt
s DayID=$O(arGame(""))
while DayID'=""
{
if $D(arGame(DayID,arPlNum(i))) {s arGame(DayID,arPlNum(i))=indSt}
s DayID=$O(arGame(DayID))
}
} //elseif NewInd'=indSt
}

if iSucCount
{
s sTemp=$H
s sTemp1=$P(sTemp,",",1)
s sTemp2=$P(sTemp,",",1)
while $L(sTemp2)<5
{
s sTemp2="0"_sTemp2
}
s TrID=sTemp1_sTemp2
s TrID=+TrID

s Pl=$O(MyRez(""))
while Pl'=""
{
s St=$O(MyRez(Pl,""))
while St'=""
{
if MyRez(Pl,St)=0
{
if St=2
{
do DelPlStByT(Pl,t,ind2)
s flAllOk=flAllOk+1
}
elseif St=0
{
s sSt=$$GetPlStByT(Pl,t)
s iMax=$P(sSt,"^",1)
f j=1:1:iMax
{
s s1=$P(sSt,"^",j+1)
if s1'=ind2
{
do DelPlStByT(Pl,t,s1)
s flAllOk=flAllOk+1
}
}
}
}
s St=$O(MyRez(Pl,St))
}
s Pl=$O(MyRez(Pl))
}
}
else
{
s flAllOk=0
}

s ind2=$O(^arG(ind1,ind2))
}
s ind1=$O(^arG(ind1))
}
q flAllOk
}

CountVarF1(pl1,pl2,TeamID) PUBLIC
{
s s1=$$GetPlStByT(pl1,TeamID)
s s2=$$GetPlStByT(pl2,TeamID)
s iRet=s1*s2
q iRet
}

F1(st1,st2)
{
s iRet=0
if st1=st2
{
s iRet=12
}
elseif $D(^Col(st1,st2))
{
s iRet=-4
}
q iRet
}


F4(x1,x2,x3,st)
{
// экспериментальная функция
s iRet=$G(^col(x1,x2))+$G(^col(x2,x3))+(x2=st)
q iRet
}


Analise2(t) PUBLIC
{
// Пурга умеет анализировать путем упрощения системы уравнений
// нормализуем
s d=$O(^dGam(t,""))
s CurInd=0
while d'=""
{
s iVarCount=1
s sTemp=$G(^dGam(t,d))
s VZ=$P(sTemp,"^",17)
s ST=$P(sTemp,"^",18)
f i=1:1:16
{
if i<11
{
s pl1=$P(sTemp,"^",i)
s pl2=$P(sTemp,"^",(i+1))
s iVar=$$CountVarF1(pl1,pl2,t)
if iVar=1
{
s st1=$$GetPlStByT(pl1,t)
s st1=$P(st1,"^",2)
s st2=$$GetPlStByT(pl2,t)
s st2=$P(st2,"^",2)
s VZ=VZ-$$F1(st1,st2)
}
elseif iVar>1
{
if pl1>pl2 {s ind=pl2_"^"_pl1}
else {s ind=pl1_"^"_pl2}

s arG(d,1,ind)=iVar
s iVarCount=iVarCount*iVar
}
else
{
w "нет вариантов",!
break
}
}
s pl=$P(sTemp,"^",i)
s flDif=0
s flEqu=0
s sPlSt=$$GetPlStByT(pl,t)
s iCount=$P(sPlSt,"^",1)
f j=2:1:iCount+1
{
s PlSt=$P(sPlSt,"^",j)
if PlSt=ST {s flEqu=1}
else {s flDif=1}
}

if flEqu*flDif=0
{
if flEqu {s VZ=VZ-2}
}
else
{
s iVar=iCount
s arG(d,2,pl_"^"_ST)=iVar
s iVarCount=iVarCount*iVar
}
} //f i=1:1:16
if iVarCount>1
{
s arG(d,3)=VZ
s arG(d,4)=iVarCount
}
s d=$O(^dGam(t,d))
} //while d'=""


// теперь пробуем всех со всеми
k ^AnaliseVar
s d1=$O(arG(""))
while d1'=""
{
s d2=$O(arG(d1))
while d2'=""
{
if d1'=d2
{
s iVarCount=1
s ft=$O(arG(d1,""))
while ft<3
{
s ind=$O(arG(d1,ft,""))
while ind'=""
{
if '$D(arG(d2,ft,ind)) {s iVarCount=iVarCount*$G(arG(d1,ft,ind))}
s ind=$O(arG(d1,ft,ind))
}
s ft=$O(arG(d1,ft))
}
s ft=$O(arG(d2,""))
while ft<3
{
s ind=$O(arG(d2,ft,""))
while ind'=""
{
if '$D(arG(d1,ft,ind)) {s iVarCount=iVarCount*$G(arG(d2,ft,ind))}
s ind=$O(arG(d2,ft,ind))
}
s ft=$O(arG(d2,ft))
}
if (iVarCount>1)&&(iVarCount<$G(arG(d1,4)))&&(iVarCount<$G(arG(d2,4)))
{
s ^AnaliseVar(iVarCount,t,d1_"^"_d2)=$G(arG(d1,4))_" + "_$G(arG(d2,4))
}
}
s d2=$O(arG(d2))
}
s d1=$O(arG(d1))
}
}

GetNextSt(Pl,t,st) PUBLIC
{
s NextSt=""
s sPlSt=$$GetPlStByT(Pl,t)
if st=""
{
s NextSt=$P(sPlSt,"^",2)
}
else
{
s iCount=$P(sPlSt,"^",1)
s fl=0
f j=2:1:iCount+1
{
s CurSt=$P(sPlSt,"^",j)
if (fl=1)
{
s NextSt=CurSt
q
}
if (fl=0)&&(CurSt=st)
{
s fl=1
}
}
}
q NextSt
}

Analise3(iMaxVars,TeamID) PUBLIC
k ^MyRez
k arPl
k arG

s MyRet=0

s flEx=0
s iVars=1
s iCount=0
s var=$O(^AnaliseVar(""))
while (var'="")&&('flEx)&&(MyRet>=0)
{
s tLoc=$O(^AnaliseVar(var,""))
while (tLoc'="")&&('flEx)&&(MyRet>=0)
{
s dd=$O(^AnaliseVar(var,tLoc,""))
while (dd'="")&&('flEx)&&(MyRet>=0)
{
s iCount=iCount+1
s d1=$P(dd,"^",1)
s d2=$P(dd,"^",2)

s sTemp=$G(^dGam(tLoc,d1))
s VZ=$P(sTemp,"^",17)
s ST=$P(sTemp,"^",18)
f i=1:1:16
{
if i<11
{
s pl1=$P(sTemp,"^",i)
s pl2=$P(sTemp,"^",(i+1))
s iVar=$$CountVarF1(pl1,pl2,TeamID)
if iVar=1
{
s st1=$$GetPlStByT(pl1,TeamID)
s st1=$P(st1,"^",2)
s st2=$$GetPlStByT(pl2,TeamID)
s st2=$P(st2,"^",2)
s VZ=VZ-$$F1(st1,st2)
}
elseif iVar>1
{
if pl1>pl2 {s ind=pl2_"^"_pl1}
else {s ind=pl1_"^"_pl2}
s arG(iCount,1,ind)=1
}
else
{
s MyRet=-1
}
} //if i<11
s pl=$P(sTemp,"^",i)
s flDif=0
s flEqu=0

s sPlSt=$$GetPlStByT(pl,TeamID)
s iAmount=$P(sPlSt,"^",1)
f j=1:1:iAmount
{
s PlSt=$P(sPlSt,"^",j+1)
if PlSt=ST {s flEqu=1}
else {s flDif=1}
}

// s PlSt=$O(^dPlayerStyle(pl,""))
// while PlSt'=""
// {
// if PlSt=ST {s flEqu=1}
// else {s flDif=1}
// s PlSt=$O(^dPlayerStyle(pl,PlSt))
// }
if (flEqu*flDif)=0
{
if flEqu {s VZ=VZ-2}
}
else
{
s ind=pl_"^"_ST
s arG(iCount,2,ind)=1
}
} //f i=1:1:16


s sTemp=$G(^dGam(tLoc,d2))
s VZ=VZ-$P(sTemp,"^",17)
s ST=$P(sTemp,"^",18)
f i=1:1:16
{
if i<11
{
s pl1=$P(sTemp,"^",i)
s pl2=$P(sTemp,"^",(i+1))
s iVar=$$CountVarF1(pl1,pl2,TeamID)
if iVar=1
{
s st1=$$GetPlStByT(pl1,TeamID)
s st1=$P(st1,"^",2)
s st2=$$GetPlStByT(pl2,TeamID)
s st2=$P(st2,"^",2)
s VZ=VZ+$$F1(st1,st2)
}
elseif iVar>1
{
if pl1>pl2 {s ind=pl2_"^"_pl1}
else {s ind=pl1_"^"_pl2}

if $D(arG(iCount,1,ind)) {k arG(iCount,1,ind)}
else {s arG(iCount,1,ind)=-1}
}
else
{
s MyRet=-1
}
} //if i<11
s pl=$P(sTemp,"^",i)
s flDif=0
s flEqu=0
s sPlSt=$$GetPlStByT(pl,TeamID)
s iAmount=$P(sPlSt,"^",1)
f j=1:1:iAmount
{
s PlSt=$P(sPlSt,"^",j+1)
if PlSt=ST {s flEqu=1}
else {s flDif=1}
}
// s PlSt=$O(^dPlayerStyle(pl,""))
// while PlSt'=""
// {
// if PlSt=ST {s flEqu=1}
// else {s flDif=1}
// s PlSt=$O(^dPlayerStyle(pl,PlSt))
// }
if flEqu*flDif=0
{
if flEqu {s VZ=VZ+2}
}
else
{
s ind=pl_"^"_ST
if $D(arG(iCount,2,ind)) {k arG(iCount,2,ind)}
else {s arG(iCount,2,ind)=-1}
}

} //f i=1:1:16

s iVars=iVars*var
s flEx=(iMaxVars
s arG(iCount)=VZ

k ^AnaliseVar(var,tLoc,dd)

s dd=$O(^AnaliseVar(var,tLoc,dd))
} //while (dd'="")&&('flEx)
s tLoc=$O(^AnaliseVar(var,tLoc))
} //while (t'="")&&('flEx)
s var=$O(^AnaliseVar(var))
} //while (var'="")&&('flEx)

if MyRet<0 {q "0^"_MyRet}

// заполним участников
s g=$O(arG(""))
while g'=""
{
s tg=$O(arG(g,""))
while tg'=""
{
s ind=$O(arG(g,tg,""))
while ind'=""
{
s pl=$P(ind,"^",1)
if '$D(arPl(pl))
{
s sPlSt=$$GetPlStByT(pl,TeamID)
s arPl(pl)=$P(sPlSt,"^",2)
s iAmount=$P(sPlSt,"^",1)
f j=1:1:iAmount
{
s PlSt=$P(sPlSt,"^",j+1)
s ^MyRez(pl,PlSt)=0
}
// s st=$O(^dPlayerStyle(pl,""))
// s arPl(pl)=st
// while st'=""
// {
// s ^MyRez(pl,st)=0
// s st=$O(^dPlayerStyle(pl,st))
// }
}
if tg=1
{
s pl=$P(ind,"^",2)
if '$D(arPl(pl))
{
s sPlSt=$$GetPlStByT(pl,TeamID)
s arPl(pl)=$P(sPlSt,"^",2)
s iAmount=$P(sPlSt,"^",1)
f j=1:1:iAmount
{
s PlSt=$P(sPlSt,"^",j+1)
s ^MyRez(pl,PlSt)=0
}

// s st=$O(^dPlayerStyle(pl,""))
// s arPl(pl)=st
// while st'=""
// {
// s ^MyRez(pl,st)=0
// s st=$O(^dPlayerStyle(pl,st))
// }
}
}
s ind=$O(arG(g,tg,ind))
}
s tg=$O(arG(g,tg))
}
s g=$O(arG(g))
}

// считаем!
s iCountRez=0
do CountGame()

s pl=$O(arPl(""))
while pl'=""
{
s st=$G(arPl(pl))
s st=$$GetNextSt(pl,TeamID,st)
// s sPlSt=$$GetPlStByT(pl,TeamID)
// s iCount=$P(sPlSt,"^",1)
// s fl=0
// f j=2:1:iCount+1
// {
// s CurSt=$P(sPlSt,"^",j)
// if (fl=0)&&(CurSt=st)
// {
// s st=CurSt
// s fl=1
// }
// }
// if 'fl {s st=""}

//s st=$O(^dPlayerStyle(pl,st))
if st=""
{
while (st="")&&(pl'="")
{
s pl=$O(arPl(pl))
if pl'=""
{
s st=$G(arPl(pl))
s st=$$GetNextSt(pl,TeamID,st)
//s st=$O(^dPlayerStyle(pl,st))
}
}
if pl'=""
{
s arPl(pl)=st
s pl=$O(arPl(pl),-1)
while pl'=""
{
s arPl(pl)=$$GetNextSt(pl,TeamID,"") //$O(^dPlayerStyle(pl,""))
s pl=$O(arPl(pl),-1)
}
s pl=$O(arPl(""))
}
}
else
{
s arPl(pl)=st
}
if pl'="" {do CountGame()}
} //while pl'=""

// Теперь результат
if iCountRez
{
s sTemp=$H
s sTemp1=$P(sTemp,",",1)
s sTemp2=$P(sTemp,",",2)
while $L(sTemp2)<5
{
s sTemp2="0"_sTemp2
}
s TrID=sTemp1_sTemp2
s TrID=+TrID

s PlID=$O(^MyRez(""))
while PlID'=""
{
s st=$O(^MyRez(PlID,""))
while st'=""
{
if ^MyRez(PlID,st)=0
{
do DelPlStByT(PlID,TeamID,st)
// if '$D(^dPlayerStyle(PlID))
// {
// s ^dPlayerStyle(PlID,1)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,2)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,3)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,4)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,5)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,6)=^sPlayers(PlID)
// }
//
// s ^TRANSACTIONS(TrID,TeamID,PlID,st)="k"
// s TrID=TrID+1
// k ^dPlayerStyle(PlID,st)
s MyRet=MyRet+1
}
s st=$O(^MyRez(PlID,st))
}
s PlID=$O(^MyRez(PlID))
}
}
q iCountRez_"^"_MyRet


Analise4(TeamID2) PUBLIC
s AllIskl=0
s RetIskl=0
s ntall=$H
s nd=$P(ntall,",",1)
s nt=$P(ntall,",",2)
s TempAmount=$O(^AnaliseVar(""))
while TempAmount'=""
{
s AnRet=$$Analise3(1,TeamID2)
s TempAmount=$P(AnRet,"^",1)
s IsclCount=$P(AnRet,"^",2)
if IsclCount<0
{
s TempAmount=""
s RetIskl=-1
}
elseif TempAmount>0
{
//w TempAmount,!
s AllIskl=AllIskl+IsclCount
//w IsclCount,!
s ntall2=$H
s nd2=$P(ntall2,",",1)
s nt2=$P(ntall2,",",2)
if (((nd2-nd)*86400)+(nt2-nt))>10
{
s TempAmount=""
s RetIskl=AllIskl+1
}
else {s TempAmount=$O(^AnaliseVar(""))}
}
else
{
s TempAmount=""
s RetIskl=-1
}
}
q RetIskl


CountGame()
s lflOk=2
s ld=$O(arG(""))
while (ld'="")&&lflOk
{
s liSum=0
s ltg=$O(arG(ld,""))
while ltg'=""
{
s lind=$O(arG(ld,ltg,""))
while lind'=""
{
if ltg=1
{
s lpl1=$P(lind,"^",1)
s lpl2=$P(lind,"^",2)
s liSum=liSum+($$F1($G(arPl(lpl1)),$G(arPl(lpl2)))*$G(arG(ld,ltg,lind)))
}
elseif ltg=2
{
s lpl=$P(lind,"^",1)
s lst=$P(lind,"^",2)
if $G(arPl(lpl))=lst
{
s liSum=liSum+(2*$G(arG(ld,ltg,lind)))
}
}
s lind=$O(arG(ld,ltg,lind))
}
s ltg=$O(arG(ld,ltg))
}
s lflOk=($G(arG(ld))=liSum)
s ld=$O(arG(ld))
}

if lflOk=1
{
s iCountRez=iCountRez+1
s lpl=$O(arPl(""))
while lpl'=""
{
s lst=$G(arPl(lpl))
s ^MyRez(lpl,lst)=$G(^MyRez(lpl,lst))+1
s lpl=$O(arPl(lpl))
}
}
q


IndexTeam2(TeamID) PUBLIC
{
//Пурга формирует индекс первого уровня
k ^dGam(0)
k ^dGam1
k ^dGam2

s ErCount=0

// заполним массив коллизий
s arCol(0,1)=""
s arCol(0,2)=""
s arCol(1,1)=""
s arCol(1,2)=""
s arCol(2,1)="3"
s arCol(2,2)="6"
s arCol(3,1)="2"
s arCol(3,2)="4"
s arCol(4,1)="3"
s arCol(4,2)="5"
s arCol(5,1)="4"
s arCol(5,2)="6"
s arCol(6,1)="5"
s arCol(6,2)="2"

s Day=$O(^dGam(TeamID,""))
while Day'=""
{
s Amount=$$CountVar(TeamID,Day)
if Amount>1
{
s ^dGam1(Amount,TeamID,Day)=^dGam(TeamID,Day)
}
else
{
s sTemp=^dGam(TeamID,Day)
s iSum=0
s VZ=$P(sTemp,"^",17)
s ST=$P(sTemp,"^",18)
s PrevSt=0
f i=1:1:11
{
s adLoc=0
s Pl=$P(sTemp,"^",i)
s sCurSt=$$GetPlStByT(Pl,TeamID)
s CurSt=$P(sCurSt,"^",2)
//s CurSt=$O(^dPlayerStyle(Pl,""))
if CurSt=ST {s adLoc=2}

if PrevSt=CurSt {s adLoc=adLoc+12}
elseif (PrevSt=arCol(CurSt,1))||(PrevSt=arCol(CurSt,2))
{
s adLoc=adLoc-4
}
s iSum=iSum+adLoc
s PrevSt=CurSt
}
f i=12:1:16
{
s Pl=$P(sTemp,"^",i)
s sCurSt=$$GetPlStByT(Pl,TeamID)
s CurSt=$P(sCurSt,"^",2)
//s CurSt=$O(^dPlayerStyle(Pl,""))
if CurSt=ST {s iSum=iSum+2}
}

if iSum=VZ
{
s ^dGoodGam(TeamID,Day)=^dGam(TeamID,Day)
k ^dGam(TeamID,Day)
}
else
{
w Day," ",iSum," ",VZ,!
s ErCount=ErCount+1
//w TeamID_","_Day_" д.б.:"_VZ_" есть:"_iSum,!
}
}
s Day=$O(^dGam(TeamID,Day))
}
q ErCount
}


MainProg(TaskID,TeamID)
//Пурга осуществляет полный расчет для одной команды
k ^MyRez
k arPl
k arGame
k arPlInd
k arPlInd2
k arPlNum
//k ^Otladka
//s OtlCount=0

s VariantInd=0
s iPlCount=0
// заполним массив коллизий
s arCol(1,1)=""
s arCol(1,2)=""
s arCol(2,1)="3"
s arCol(2,2)="6"
s arCol(3,1)="2"
s arCol(3,2)="4"
s arCol(4,1)="3"
s arCol(4,2)="5"
s arCol(5,1)="4"
s arCol(5,2)="6"
s arCol(6,1)="5"
s arCol(6,2)="2"

// Сначала сформируем массив возможных значений стиля игроков для игры
s DayID=$O(^dGam(TaskID,""))
while DayID'=""
{
s sTemp=^dGam(TaskID,DayID)
f i=1:1:16
{
s plID=$P(sTemp,"^",i)
if $D(arPl(plID))\10=0
{
s iPlCount=iPlCount+1
s arPlInd(DayID,plID)=i
s arPlInd2(DayID,i)=plID
s arPlNum(iPlCount)=plID
// Добавляем в оперативный массив

s sPlSt=$$GetPlStByT(plID,TeamID)
s iCount=$P(sPlSt,"^",1)
f j=2:1:iCount+1
{
s ind2=$P(sPlSt,"^",j)
if $D(arGame(DayID,i))=0
{
s arGame(DayID,i)=ind2
s arPl(plID)=ind2
}
s arPl(plID,ind2)=arGame(DayID,i)
s ^MyRez(plID,ind2)=0
}


// if $D(^dPlayerStyle(plID))\10=1
// {
// s ind2=$O(^dPlayerStyle(plID,""))
// while ind2'=""
// {
// if $D(arGame(DayID,i))=0
// {
// s arGame(DayID,i)=ind2
// s arPl(plID)=ind2
// }
// s arPl(plID,ind2)=arGame(DayID,i)
// s ^MyRez(plID,ind2)=0
// s ind2=$O(^dPlayerStyle(plID,ind2))
// } //while ind2'=""
// } //if $Data(^dPlayerStyle(plID))\10=1
// else
// {
// // Возможны все стили
// s ind2=$O(^sFavStyle(""))
// while ind2'=""
// {
// if $D(arGame(DayID,i))=0
// {
// s arGame(DayID,i)=ind2
// s arPl(plID)=ind2
// }
// s arPl(plID,ind2)=arGame(DayID,i)
// s ^MyRez(plID,ind2)=0
// s ind2=$O(^sFavStyle(ind2))
// } //while ind2'=""
// } //else if $Data(^dPlayerStyle(plID))\10=1
} //if $Data(arPl(plID))\10=0
else
{
s arPlInd(DayID,plID)=i
s arPlInd2(DayID,i)=plID
// игрок уже есть, его только в arGame
s arGame(DayID,i)=arPl(plID)
// s ind2=$O(arPl(plID,""))
// while ind2'=""
// {
// s ^MyRez(plID,ind2)=0
// s ind2=$O(arPl(plID,ind2))
// } //while ind2'=""
} //else if $Data(arPl(plID))\10=0
} //f i=1:1:16
s arGame(DayID,"VZ")=$P(sTemp,"^",17)
s arGame(DayID,"ST")=$P(sTemp,"^",18)
s DayID=$O(^dGam(TaskID,DayID))
} //while DayID'=""


w iPlCount,!
w $$CountVar2(),!
s iCountRez=0

// Начинаем перебор вариантов
s i=iPlCount
s indSt=$O(arPl(arPlNum(iPlCount),""))
while i>0
{
// Делаем расчет варианта
do CountGame2()
// Затем меняем состояние i-го элемента
s indSt=arPl(arPlNum(i))
s NewInd=$O(arPl(arPlNum(i),indSt))
if NewInd=""
{
// Перенос в более старший разряд
while (i>0)&&(NewInd="")
{
// пока у i-го игрока стилей больше нет
s NewInd=$O(arPl(arPlNum(i),NewInd))
if NewInd'=indSt
{
s indSt=NewInd
s arPl(arPlNum(i))=indSt

s DayID=$O(^dGam(TaskID,""))
while DayID'=""
{
if $D(arPlInd(DayID,arPlNum(i)))=1 {s arGame(DayID,arPlInd(DayID,arPlNum(i)))=indSt}
s DayID=$O(^dGam(TaskID,DayID))
}
} //if NewInd'=indSt
s i=i-1
if i>0
{
s indSt=arPl(arPlNum(i))
s NewInd=$O(arPl(arPlNum(i),indSt))
} //if i>0
} //while (i>0)&&(NewInd="")
if (i>0)&&(NewInd'=indSt)
{
s indSt=NewInd
s arPl(arPlNum(i))=indSt
s DayID=$O(^dGam(TaskID,""))
while DayID'=""
{
if $D(arPlInd(DayID,arPlNum(i)))=1 {s arGame(DayID,arPlInd(DayID,arPlNum(i)))=indSt}
s DayID=$O(^dGam(TaskID,DayID))
}
} //if (i>0)&&(NewInd'=indSt)
if i>0 {s i=iPlCount}
} //if NewInd=""
else
{
// меняем состояние в текущем разряде
s indSt=NewInd
s arPl(arPlNum(i))=indSt
s DayID=$O(^dGam(TaskID,""))
while DayID'=""
{
if $D(arPlInd(DayID,arPlNum(i)))=1 {s arGame(DayID,arPlInd(DayID,arPlNum(i)))=indSt}
s DayID=$O(^dGam(TaskID,DayID))
}
} //elseif NewInd'=indSt
} //while i>0

//q

// Теперь результат
if iCountRez
{
s sTemp=$H
s sTemp1=$P(sTemp,",",1)
s sTemp2=$P(sTemp,",",2)
while $L(sTemp2)<5
{
s sTemp2="0"_sTemp2
}
s TrID=sTemp1_sTemp2
s TrID=+TrID

s PlID=$O(^MyRez(""))
while PlID'=""
{
s st=$O(^MyRez(PlID,""))
while st'=""
{
if ^MyRez(PlID,st)=0
{
do DelPlStByT(PlID,TeamID,st)
// if '$D(^dPlayerStyle(PlID))
// {
// s ^dPlayerStyle(PlID,1)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,2)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,3)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,4)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,5)=^sPlayers(PlID)
// s ^dPlayerStyle(PlID,6)=^sPlayers(PlID)
// }
//
// s ^TRANSACTIONS(TrID,TeamID,PlID,st)="k"
// s TrID=TrID+1
// k ^dPlayerStyle(PlID,st)
}
s st=$O(^MyRez(PlID,st))
}
s PlID=$O(^MyRez(PlID))
}
}
q

CountVar2()
//Пурга умеет считать количество вариантов
new cvInd1,cvInd2, iAmount, iSum
s cvInd1=$O(arPl(""))
s iSum=1
while cvInd1'=""
{
s cvInd2=$O(arPl(cvInd1,""))
s iAmount=0
while cvInd2'=""
{
s iAmount=iAmount+1
s cvInd2=$O(arPl(cvInd1,cvInd2))
} //while cvInd2'=""
s iSum=iSum*iAmount
s cvInd1=$O(arPl(cvInd1))
} //while cvInd1'=""
q iSum


CountGame2()
// Пурга умеет обсчитывать взаимопонимание для текщуго состояния
s flOk=1
s DayID=$O(^dGam(TaskID,""))
while (flOk=1)&&(DayID'="")
{
s iRet=0
s LastSt=0
f iLoc=1:1:11
{
s adLoc=0
if arGame(DayID,iLoc)=arGame(DayID,"ST") {s adLoc=2}
if LastSt=arGame(DayID,iLoc) {s adLoc=adLoc+12}
elseif (LastSt=arCol(arGame(DayID,iLoc),1))||(LastSt=arCol(arGame(DayID,iLoc),2))
{
s adLoc=adLoc-4
}
s iRet=iRet+adLoc
s LastSt=arGame(DayID,iLoc)
} //f iLoc=1:1:11

if iRet>arGame(DayID,"VZ") {s flOk=0}
else
{
f iLoc=12:1:16
{
if arGame(DayID,iLoc)=arGame(DayID,"ST") {s iRet=iRet+2}
} //f iLoc=12:1:16
if iRet'=arGame(DayID,"VZ") {s flOk=0}
}
s DayID=$O(^dGam(TaskID,DayID))
} //while (flOk=1)&&(DayID'="")

if flOk=1
{
s iCountRez=iCountRez+1
do WriteRez()
}
q


WriteRez()
// пурга пишет подходящий вариант
new PlInd,arFin,CurSt
s VariantInd=VariantInd+1
s PlInd=$O(arPl(""))
while PlInd'=""
{
s CurSt=arPl(PlInd)
s ^MyRez(PlInd,CurSt)=^MyRez(PlInd,CurSt)+1
s PlInd=$O(arPl(PlInd))
}
q

KillTeam2(TeamID) PUBLIC
{
// Пурга умеет убирать все игры из GoodGam
s Day=$O(^dGoodGam(TeamID,""))
while Day'=""
{
s ^dGam(TeamID,Day)=^dGoodGam(TeamID,Day)
k ^dGoodGam(TeamID,Day)
s Day=$O(^dGoodGam(TeamID,Day))
}
s ^dBT(TeamID)=$H
}

KillTeam(TeamID) PUBLIC
{
// Пурга умеет сбрасывать все стили одной команды
s d=$O(^dGoodGam(TeamID,""))
while d'=""
{
s ^dGam(TeamID,d)=^dGoodGam(TeamID,d)
k ^dGoodGam(TeamID,d)
s d=$O(^dGoodGam(TeamID,d))
}
s a=$$IndexTeam(TeamID,1)
s d=$O(^dGam(TeamID,""))
while d'=""
{
s sTemp=$G(^dGam(TeamID,d))
f i=1:1:16
{
s Pl=$P(sTemp,"^",i)
s arPl(Pl)=""
}
s d=$O(^dGam(TeamID,d))
}

k arPl(0)

s Pl=$O(arPl(""))
while Pl'=""
{
s st=$$GetPlStByT(Pl,TeamID)
if $P(st,"^",1)<6
{
s F=^dPlT(Pl,TeamID,"F")
s L=^dPlT(Pl,TeamID,"L")
f i=1:1:6
{
s ^dPlStD(Pl,F,i)=1
s ^dPlStD(Pl,L,i)=0
}
}
s Pl=$O(arPl(Pl))
}
}


CountVarTeam(TaskID) PUBLIC
{
s DayID=$O(^dGam(TaskID,""))
s iRet=1
while (DayID'="")&&(iRet<1000000000000)
{
s sTemp=^dGam(TaskID,DayID)
f i=1:1:16
{
s plID=$P(sTemp,"^",i)
if '$D(arPl(plID))
{
//s iCount=0
//s st=$O(^dPlayerStyle(plID,""))
//while st'=""
//{
// s iCount=iCount+1
// s st=$O(^dPlayerStyle(plID,st))
//}
//if iCount=0 {s arPl(plID)=6}
//else {s arPl(plID)=iCount}
s arPl(plID)=$P($$GetPlStByT(plID,TaskID),"^",1)
s iRet=iRet*arPl(plID)
}
} //f i=1:1:16
s DayID=$O(^dGam(TaskID,DayID))
} //while DayID'=""

q iRet
}


GoToBad(t,d1,d2) PUBLIC
{
if $D(^dGam(t,d1)) {s d=d1}
else {s d=$O(^dGam(t,d1))}
while (d<=d2)&&(d'="")
{
s ^dBadGam(t,d)=^dGam(t,d)
k ^dGam(t,d)
s d=$O(^dGam(t,d))
}

}


Добавлено спустя 2 часа 9 минут 10 секунд:
да забыл сказать про платформу. Это - cache, ссылка на скачивание:
http://www.intersystems.ru/cache/downloads/index.html
Killer74
 
 
 

Re: Методика определения любимых стилей игроков
Сообщение Колян07 24 авг 2011, 17:17
я в экселе построил мат мадель по расчету взаимки. ссылками связал одинаковых игроков а далее перебрал все возможные варианты при помащи простых циклов. Я свою последнюю так считал. но перебор много времени занимает.
Колян07
Опытный менеджер
 
Сообщений: 439
Зарегистрирован: 09 мар 2007, 20:14
Откуда: Пятигорск, Россия
Рейтинг: 540
 
Хард (Хард, Австрия)
Айви Роверс (Айви, Барбадос)
Аль-Талия (Маскат, Оман)
 

Re: Методика определения любимых стилей игроков
Сообщение Killer74 25 авг 2011, 10:20
Nikolai писал(а):я в экселе построил мат мадель по расчету взаимки. ссылками связал одинаковых игроков а далее перебрал все возможные варианты при помащи простых циклов. Я свою последнюю так считал. но перебор много времени занимает.
Сколько примерно по времени и какое количество вариантов перебирается?
Killer74
 
 
 

Пред.След.

Вернуться в Барбадос