Bambuk, on 20 September 2016 - 18:22, сказал:
ТРИГГЕР_ТЕННИС_ЗАМРИ_УМРИ_ВОСКРЕСНИ
#21 OFFLINE
Добавлено 20 September 2016 - 19:43
#22 OFFLINE
Добавлено 20 September 2016 - 19:57
petrovipv, on 20 September 2016 - 19:43, сказал:
Я проверял достаточно много похожих по вашей логике ситуаций--там нет ни ХУ (и в конторах не бамбуки и кефф формируется на бирже под мнением достаточно большого числа людей....очень трудно переиграть большое число народу)..... На больших объёмах всё явное идёт достаточно хорошо в рамках статистики.
Вывод вот какой--для простых манипуляций (типа бак-лей итд) если до лайва в кефах нет перевеса то его и не будет в лайве (ну исключения есть везде...но в целом ситуация выглядит именно так для подавляющего числа случаев...)....
#23 OFFLINE
Добавлено 20 September 2016 - 20:38
Function Gen(ByVal P As Single) As Integer
Dim Pg, T As Single
Pg = P
T = Rnd()
T = Rnd()
If T <= Pg Then
Gen = 1
Else
Gen = 0
End If
End Function
Function F_Tennis(ByVal rp1g As Single, ByVal rp2g As Single, ByVal Mmarktb As Integer _
, ByVal Vmark_1 As Integer, ByVal Mmarkmany As Integer, ByVal Mnst As Integer, ByVal fshm1 As Integer, ByVal fshm2 As Integer _
, ByVal fshst1 As Integer, ByVal fshst2 As Integer, ByVal Tec_tot As Single, ByVal TOT_Buk As Single) As Single
Dim Rasp(1) As Single
Dim m1, m2, st1, st2, marktb, mark1, markmany, G, n, ws1, ws2, PRO_m1, PRO_m2, PRO_st1, PRO_st2, PRO_mark1, nst, g1, g2 As Integer
Dim i, j, k, sumws1, sumws2, Ngenerat As Long
Dim Pp1st, Pp2st As Single
Dim Pwin1, p1g, p2g, p1st, p2st, tb_0, tb_1, summRasp, Tt, Tb, t_if, summtot, MOsumm As Single
p1g = rp1g
p2g = rp2g
Pp1st = p1g ^ 4 * (15 - 4 * p1g - 10 * p1g ^ 2 / (1 - 2 * p1g * (1 - p1g)))
Pp2st = p2g ^ 4 * (15 - 4 * p2g - 10 * p2g ^ 2 / (1 - 2 * p2g * (1 - p2g)))
Tt = Tec_tot
Tb = TOT_Buk
nst = Mnst
t_if = 0
markmany = Mmarkmany
MOsumm = 0
Ngenerat = 10000
tb_0 = 0
tb_1 = 0
If nst = 3 Then
n = 2
Else
n = 3
End If
marktb = Mmarktb
summRasp = 0
PRO_mark1 = Vmark_1
PRO_m1 = fshm1
PRO_m2 = fshm2
PRO_st1 = fshst1
PRO_st2 = fshst2
For k = 1 To Ngenerat Step 1
mark1 = PRO_mark1
m1 = PRO_m1
m2 = PRO_m2
st1 = PRO_st1
st2 = PRO_st2
ws1 = m1
ws2 = m2
summtot = 0
Do Until (ws1 = n And ws2 < n) Or (ws2 = n And ws1 < n)
If mark1 = 1 Then
p1st = Pp1st
p2st = Pp2st
ElseIf mark1 = 0 Then
p1st = 1 - Pp2st
p2st = 1 - Pp1st
End If
If marktb = 0 Then 'без тай-брейка
Do Until (st1 >= 6 And st1 - st2 >= 2) Or (st2 >= 6 And st2 - st1 >= 2)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
Loop
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
Else
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
ElseIf mark1 = 0 And Not (i Mod 2 = 0) Then
mark1 = 1
End If
If st1 >= 6 And st2 >= 6 Then
summtot = summtot + 13
Else
summtot = summtot + st1 + st2
End If
st1 = 0
st2 = 0
End If
If marktb = 0 Then GoTo M 'с тай-брейком
Do Until (st1 = 6 And st1 - st2 >= 2) Or (st2 = 6 And st2 - st1 >= 2) Or (st1 = 6 And st2 = 6) Or (st1 = 7 And st2 = 5) Or (st2 = 7 And st1 = 5)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
Loop
If st1 = 6 And st2 = 6 Then
summtot = summtot + 13
Else
summtot = summtot + st1 + st2
End If
If Not (st1 = 6 And st2 = 6) Then
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
ElseIf st2 >= 6 And st2 - st1 >= 2 Then
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
Else
mark1 = 1
End If
st1 = 0
st2 = 0
End If
If Not (st1 = 6 And st2 = 6) Then GoTo M
'тай-брейк
tb_1 = tb_1 + 1
g1 = 0
g2 = 0
If mark1 = 1 Then
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
Else
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
End If
If mark1 = 1 Then
Do
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 0
Else
Do
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 1
End If
If g1 > g2 Then
ws1 = ws1 + 1
Else
ws2 = ws2 + 1
End If
st1 = 0
st2 = 0
M: Loop
If ws1 > ws2 Then
sumws1 = sumws1 + 1
Else
sumws2 = sumws2 + 1
End If
If summtot + Tt < Tb Then
t_if = t_if + 1
End If
MOsumm = MOsumm + summtot
Next k
Pwin1 = sumws1 / Ngenerat
Rasp(0) = Pwin1
Rasp(1) = t_if / Ngenerat
If markmany = 0 Then
F_Tennis = Rasp(0)
ElseIf markmany = 1 Then
F_Tennis = Rasp(1)
Else
F_Tennis = MOsumm / Ngenerat
End If
End Function
Sub Main()
'
' Minimizsolv2
'
'
Dim Raspsolv(1) As Single
Raspsolv(0) = 0
Raspsolv(1) = 0
Dim m1, m2, st1, st2, marktb, mark1, n, Vibor As Integer
Dim i, j, k As Long
Dim Tt, Tb, pwm, ptm As Single
Tt = 0
Tb = 44.5
pwm = 1 / 4.5714285
ptm = 40.5
n = 5
marktb = 1
mark1 = 0
m1 = 0
m2 = 0
st1 = 0
st2 = 0
Dim f1, A1, f2, A2, A3, Y1, Y2, Y3 As Single
f1 = 0.65
f2 = 0.65
System.Console.WriteLine("Привет, чувак! Я Bambuk, не отпало желание получать цифры?")
System.Console.WriteLine("тогда введите текущий тотал геймов")
Tt = CSng(System.Console.ReadLine())
System.Console.WriteLine("введите число сетов в матче")
n = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите marktb 1-с тайбр. 0-без тайбр.")
marktb = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите mark1 1-подача у 1-го игрока, 0-у 2-го")
mark1 = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите тек.счёт в матче для 1-го игр. m1")
m1 = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите m2")
m2 = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите гейм-счёт1 в тек.сете st1")
st1 = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите счёт2 st2")
st2 = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите коэффициент win1")
pwm = 1 / CSng(System.Console.ReadLine())
System.Console.WriteLine("Выбор алгоритма 1-подбор по К_win & K_TOT_Buk 0-по К_win & MO_TOT")
Vibor = CInt(System.Console.ReadLine())
If Vibor = 1 Then
System.Console.WriteLine("введите коэффициент K_TOT_Buk на TOT_Buk геймов ")
ptm = 1 / CSng(System.Console.ReadLine())
System.Console.WriteLine("введите тотал TOT_Buk геймов")
Tb = CSng(System.Console.ReadLine())
Else
System.Console.WriteLine("введите мат.ожидание тот")
ptm = CSng(System.Console.ReadLine())
End If
For k = 1 To 5
A1 = 0.065 / k ^ 0.65
A2 = 0.065 / k ^ 0.65
A3 = 0.05 / k ^ 0.75
j = 0
i = 0
Do Until j > 2 Or i > 30
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f1 = f1
A1 = A1 / 5
j = j + 1
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f1 = f1 + A1
Else
f1 = f1 - A1
End If
If (f1 < 0) Or (f1 > 1) Then
Exit Do
End If
Loop
If (f1 < 0) Or (f1 > 1) Then
GoTo M
End If
j = 0
i = 0
Do Until j > 2 Or i > 30
i = i + 1
If Vibor = 1 Then
Y1 = (F_Tennis(f1, f2, marktb, mark1, 1, n, m1, m2, st1, st2, Tt, Tb) - ptm) ^ 2 / 3 + (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 1, n, m1, m2, st1, st2, Tt, Tb) - ptm) ^ 2 / 3 + (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 1, n, m1, m2, st1, st2, Tt, Tb) - ptm) ^ 2 / 3 + (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
Else
Y1 = (F_Tennis(f1, f2, marktb, mark1, 3, n, m1, m2, st1, st2, Tt, Tb) - ptm) ^ 2 / 2000 + (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 3, n, m1, m2, st1, st2, Tt, Tb) - ptm) ^ 2 / 2000 + (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 3, n, m1, m2, st1, st2, Tt, Tb) - ptm) ^ 2 / 2000 + (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 0, n, m1, m2, st1, st2, Tt, Tb) - pwm) ^ 2
End If
If (Y1 < Y2) And (Y1 < Y3) Then
f2 = f2
A2 = A2 / 5
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f2 = f2 + A2
f1 = f1 + A2 * 1.07
Else
f2 = f2 - A2
f1 = f1 - A2 / 1.06
End If
If (f2 < 0) Or (f2 > 1) Then
Exit Do
End If
Loop
If (f2 < 0) Or (f2 > 1) Then
GoTo M
End If
Next k
M: If f1 < 0.5 And f2 < 0.5 Then
Raspsolv(0) = 1 - f2
Raspsolv(1) = 1 - f1
Else
Raspsolv(0) = f1
Raspsolv(1) = f2
End If
Console.WriteLine(" ")
Console.WriteLine(" ")
System.Console.WriteLine("P_win1 очко со своей подачи = {0} P_win2 очко со своей подачи = {1}", Raspsolv(0), Raspsolv(1))
Console.WriteLine(" ")
Console.WriteLine(" ")
Console.WriteLine("Это моя первая консольная программа, и сейчас она будет делать страшные вещи />")
Console.WriteLine("Нажмите что-нибудь.")
Console.ReadKey()
End Sub
End Module
Отредактировано Bambuk, 20 September 2016 - 20:46.
#24 OFFLINE
Добавлено 20 September 2016 - 20:59
Я залью два консольных приложения (на второе тоже код дам) смысл в целом вот в чём----в екселе очень долго считаются такие вещи (да и тут минуты 2 если 5-ти сетовые брать матчи).... Идея вообще состояла в том что некоторые базы данных не имеют подробной росписи и там можно только тотал выцепить или формально его разделить на два тотала (для игрока 1 и игрока 2 по геймам) ну вот тупо так 6-1 6-2 будет тотал 12 и 3 ну итд но в виду триггерной концепции мы опять можем в некоторых БД разделить вины и лузы но там в первом консольном приложении (которое не имеет практической пользы) там показано что по тоталу и Рвин мач по идее можно востановить Рочко... но мы можем попробовать так поступить для двух ветвей вин-лоз во втором консольном приложении. Алгоритм там можете взять и другой...смысл по двум МОгеймов попробовать приблизительно найти Рочко(приблизительно так как там очень чувствительная функция и она не аналитическая что создаёт проблемы в оптимизации)... так как в БД мы можем частоты реализации ветвей найти и вот эти тоталы персональные то это просто как вариант за неимением лучшего.....
вот вторая куйня
Module Module1
Function Gen(ByVal P As Single) As Integer
Dim Pg, T As Single
Pg = P
T = Rnd()
T = Rnd()
If T <= Pg Then
Gen = 1
Else
Gen = 0
End If
End Function
Function F_Tennis(ByVal rp1g As Single, ByVal rp2g As Single, ByVal Mmarktb As Integer _
, ByVal Vmark_1 As Integer, ByVal Mmarkmany As Integer, ByVal Mnst As Integer, ByVal fshm1 As Integer, ByVal fshm2 As Integer _
, ByVal fshst1 As Integer, ByVal fshst2 As Integer) As Single
Dim Rasp(1) As Single
Dim m1, m2, st1, st2, marktb, mark1, markmany, G, n, ws1, ws2, PRO_m1, PRO_m2, PRO_st1, PRO_st2, PRO_mark1, nst, g1, g2 As Integer
Dim i, j, k, sumws1, sumws2, Ngenerat As Long
Dim Pp1st, Pp2st As Single
Dim Pwin1, p1g, p2g, p1st, p2st, tb_0, tb_1, summRasp, Tt, Tb, t_if, summtot1, summtot2, MOsumm1, MOsumm2 As Single
p1g = rp1g
p2g = rp2g
Pp1st = p1g ^ 4 * (15 - 4 * p1g - 10 * p1g ^ 2 / (1 - 2 * p1g * (1 - p1g)))
Pp2st = p2g ^ 4 * (15 - 4 * p2g - 10 * p2g ^ 2 / (1 - 2 * p2g * (1 - p2g)))
nst = Mnst
t_if = 0
markmany = Mmarkmany
MOsumm1 = 0
MOsumm2 = 0
Ngenerat = 10000
tb_0 = 0
tb_1 = 0
If nst = 3 Then
n = 2
Else
n = 3
End If
marktb = Mmarktb
summRasp = 0
PRO_mark1 = Vmark_1
PRO_m1 = fshm1
PRO_m2 = fshm2
PRO_st1 = fshst1
PRO_st2 = fshst2
For k = 1 To Ngenerat Step 1
mark1 = PRO_mark1
m1 = PRO_m1
m2 = PRO_m2
st1 = PRO_st1
st2 = PRO_st2
ws1 = m1
ws2 = m2
summtot1 = 0
summtot2 = 0
Do Until (ws1 = n And ws2 < n) Or (ws2 = n And ws1 < n)
If mark1 = 1 Then
p1st = Pp1st
p2st = Pp2st
ElseIf mark1 = 0 Then
p1st = 1 - Pp2st
p2st = 1 - Pp1st
End If
If marktb = 0 Then 'без тай-брейка
Do Until (st1 >= 6 And st1 - st2 >= 2) Or (st2 >= 6 And st2 - st1 >= 2)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
Loop
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
Else
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
ElseIf mark1 = 0 And Not (i Mod 2 = 0) Then
mark1 = 1
End If
If st1 >= 6 And st2 >= 6 And st1 > st2 Then
summtot1 = summtot1 + 7
summtot2 = summtot2 + 6
ElseIf st1 >= 6 And st2 >= 6 And st2 > st1 Then
summtot1 = summtot1 + 6
summtot2 = summtot2 + 7
Else
summtot1 = summtot1 + st1
summtot2 = summtot2 + st2
End If
st1 = 0
st2 = 0
End If
If marktb = 0 Then GoTo M 'с тай-брейком
Do Until (st1 = 6 And st1 - st2 >= 2) Or (st2 = 6 And st2 - st1 >= 2) Or (st1 = 6 And st2 = 6) Or (st1 = 7 And st2 = 5) Or (st2 = 7 And st1 = 5)
i = st1 + st2 + 1
If Not (i Mod 2 = 0) Then 'нечет
G = Gen(p1st)
st1 = st1 + G
st2 = st2 + 1 - G
Else
G = Gen(p2st)
st2 = st2 + G
st1 = st1 + 1 - G
End If
Loop
If Not (st1 = 6 And st2 = 6) Then
summtot1 = summtot1 + st1
summtot2 = summtot2 + st2
End If
If Not (st1 = 6 And st2 = 6) Then
If st1 >= 6 And st1 - st2 >= 2 Then
ws1 = ws1 + 1
ElseIf st2 >= 6 And st2 - st1 >= 2 Then
ws2 = ws2 + 1
End If
If mark1 = 1 And Not (i Mod 2 = 0) Then
mark1 = 0
ElseIf mark1 = 1 And i Mod 2 = 0 Then
mark1 = 1
ElseIf mark1 = 0 And i Mod 2 = 0 Then
mark1 = 0
Else
mark1 = 1
End If
st1 = 0
st2 = 0
End If
If Not (st1 = 6 And st2 = 6) Then GoTo M
'тай-брейк
tb_1 = tb_1 + 1
g1 = 0
g2 = 0
If mark1 = 1 Then
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
Else
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
End If
If mark1 = 1 Then
Do
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 0
Else
Do
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p1g)
g1 = g1 + G
g2 = g2 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
G = Gen(p2g)
g2 = g2 + G
g1 = g1 + 1 - G
If (g1 >= 7 And g1 - g2 >= 2) Or (g2 >= 7 And g2 - g1 >= 2) Then
Exit Do
End If
Loop
mark1 = 1
End If
If g1 > g2 Then
ws1 = ws1 + 1
summtot1 = summtot1 + 7
summtot2 = summtot2 + 6
Else
ws2 = ws2 + 1
summtot1 = summtot1 + 6
summtot2 = summtot2 + 7
End If
st1 = 0
st2 = 0
M: Loop
If ws1 > ws2 Then
sumws1 = sumws1 + 1
Else
sumws2 = sumws2 + 1
End If
MOsumm1 = MOsumm1 + summtot1
MOsumm2 = MOsumm2 + summtot2
Next k
Rasp(0) = MOsumm1 / Ngenerat
Rasp(1) = MOsumm2 / Ngenerat
If markmany = 0 Then
F_Tennis = Rasp(0)
ElseIf markmany = 1 Then
F_Tennis = Rasp(1)
End If
End Function
Sub Main()
'
' Minimizsolv2
'
'
Dim Raspsolv(1) As Single
Raspsolv(0) = 0
Raspsolv(1) = 0
Dim m1, m2, st1, st2, marktb, mark1, n As Integer
Dim i, j, k As Long
Dim pwm, ptm As Single
pwm = 14
ptm = 10.5
n = 5
marktb = 1
mark1 = 1
m1 = 0
m2 = 0
st1 = 0
st2 = 0
Dim f1, A1, f2, A2, A3, Y1, Y2, Y3 As Single
System.Console.WriteLine("Привет, чувак! Я Bambuk, не отпало желание получать цифры?")
System.Console.WriteLine("Тогда введите число сетов в матче")
n = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите marktb 1-с тайбр. 0-без тайбр.")
marktb = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите mark1 1-подача у 1-го игрока, 0-у 2-го")
mark1 = CInt(System.Console.ReadLine())
System.Console.WriteLine("введите мат.ожидание тот гейм 1")
pwm = CSng(System.Console.ReadLine())
System.Console.WriteLine("введите мат.ожидание тот гейм 2")
ptm = CSng(System.Console.ReadLine())
If pwm >= ptm Then
f1 = 0.8
f2 = 0.65
Else
f1 = 0.65
f2 = 0.8
End If
For k = 1 To 5
A1 = 0.065 / k ^ 0.5
A2 = 0.065 / k ^ 0.5
A3 = 0.05 / k ^ 0.65
j = 0
i = 0
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f1 = f1
A1 = A1 / 4
j = j + 1
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f1 = f1 + A1
Else
f1 = f1 - A1
End If
If (f1 < 0) Or (f1 > 1) Then
Exit Do
End If
Loop
If (f1 < 0) Or (f1 > 1) Then
GoTo M
End If
j = 0
i = 0
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f2 = f2
A2 = A2 / 4
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f2 = f2 + A2
f1 = f1 + A2 * 1.07
Else
f2 = f2 - A2
f1 = f1 - A2 / 1.06
End If
If (f2 < 0) Or (f2 > 1) Then
Exit Do
End If
Loop
If (f2 < 0) Or (f2 > 1) Then
GoTo M
End If
Next k
M: If f1 < 0.5 And f2 < 0.5 Then
Raspsolv(0) = 1 - f2
Raspsolv(1) = 1 - f1
Else
Raspsolv(0) = f1
Raspsolv(1) = f2
End If
Console.WriteLine(" ")
Console.WriteLine(" ")
System.Console.WriteLine("P_win1 очко со своей подачи = {0} P_win2 очко со своей подачи = {1}", Raspsolv(0), Raspsolv(1))
Console.WriteLine(" ")
Console.WriteLine(" ")
Console.WriteLine("Это моя бамбук-консольная программа, и сейчас она будет делать страшные вещи ")
Console.WriteLine("Нажмите что-нибудь и ракеты пойдут на цели-букмекерские конторы")
Console.ReadKey()
End Sub
End Module
ПРОГРАММЫ ТУТ (пришлось поизучать VB.NET а то в екселе ента куйня минут 15-20 считается..)
https://yadi.sk/d/dBjHsSKdvT4nB
https://yadi.sk/d/lvpTjywIvT4uK (похожие проги можно попробовать в БД где есть кефы и только расклад по счёту геймов в матчах) ибо если нет кефоф то всё равно роспись по числу подач она там не пришей к пи..де рукав...ибо баланс-то мы не понимаем...или базу допиливать по кефам или брать то чё есть)
Это можно рассматривать как примеры и руководство к дальнейшему разруливанию данной ситуации с нехваткой данных
Отредактировано Bambuk, 20 September 2016 - 21:06.
#25 OFFLINE
Добавлено 20 September 2016 - 21:31
0.7227--это у нас вероятность реализации ветви вин (лоз 1-р вин)
и были данные 0.6905 0.5832 тоталы там так --общий 23.27 и раздельно 14 и 9.27 (это эксперимент)
лузерная ветвь
0.622 0.6828 25.2-общий тот и порознь 11.07 14.14
вот можете всё подставить и проверить...ситуация примерно по данному примеру (но это тока по этому одному а как там далее хз)
кефф получится примерно 1.47 но зато будет получше совпадение с общим тоталом (ну это понятно--мы по тоталам восстанавливаем Рочко для игроков)
Как видно тут в модели всё ж есть некоторые противоречия---часто трудно выйти на тотал по геймам с экспериментом если берём данные по Рочко из БД (если они там есть в файле куска БД недопиленной там понятно по каким столбцам считается это грёбаное ОЧКО).
Ну пока тормознём-с с формулами, а то у мене тут водка киснет...
#26 OFFLINE
Добавлено 20 September 2016 - 22:12
Тут нет кефоф https://github.com/J...mann/tennis_atp
#27 OFFLINE
Добавлено 20 September 2016 - 22:38
Проблема в основном в том что какие-то традиционные алгоритмы ни ху.. не работают---у нас же там идёт обращение к функции которая численными методами находит параметры(и они ещё мля и плавают...так как невозможно выставить очень большое число примеров в цикле --там стоит 10000 и вот постоянно эта хрень запрашивается из процедуры.....короче я и так и сяк думал ни хуя не получается.....аналитическую фуйню там тоже проблемно впихивать...)
Может у кого возникнут решения...просьба поделиться резом....(но тут в таких задачах может даже на рез влиять начальные параметры с которых начинаем итерации. поставим допустим начальные Рочко 0.5 и 0.5 получим одно поставим 0.65 0.5 можем получить другое...саму структуру функции что ли исследовать...да там ёпрст могут быть до хера локальных минимумов(максимумов) и хз как тогда енту хрень разруливать (надо ж мля каждый кусман исследовать и сравнивать...писец короче)....задача не для слабонервных...
Отредактировано Bambuk, 20 September 2016 - 22:45.
#28 OFFLINE
Добавлено 21 September 2016 - 00:10
#29 OFFLINE
Добавлено 21 September 2016 - 08:01
можно по идее попробовать и разделить алгоритм подбора на случаи когда мо1 больше мо2 и когда мо1 меньше мо2 в коде там частично разделено но только по выбору начальных(стартовых) точек приближения а можно ещё вот эту хрень переписать чтоб значения pwm ptm поменялись местами как бы (они как раз суть мо1 мо2)
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f1 = f1
A1 = A1 / 4
j = j + 1
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f1 = f1 + A1
Else
f1 = f1 - A1
End If
If (f1 < 0) Or (f1 > 1) Then
Exit Do
End If
Loop
If (f1 < 0) Or (f1 > 1) Then
GoTo M
End If
j = 0
i = 0
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 + A2 * 1.07, f2 + A2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 - A2 / 1.06, f2 - A2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f2 = f2
A2 = A2 / 4
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f2 = f2 + A2
f1 = f1 + A2 * 1.07
Else
f2 = f2 - A2
f1 = f1 - A2 / 1.06
End If
Теперь что с чем связано по цифрам---для всего матча у нас там в функциях ранее приведённых есть данные по распределению за матч...но надо понимать что это допустим для 5-ти сетового матча просто частоты с которыми могут появляться 6-0 6-1 итд и если надо какое-то разделение по тоталам то там надо или в код что-то дописать или связать попробовать с мат ожиданием числа сетов в маче. МО числа сетов можно получить из распределения по счёту матча
это вот эти счета 2-0 2-1 0-2 1-2 итд для 5-ти сетового по аналогии тогда для 3 сетового у нас получается мо так (2+0)*частота(2-0)+(2+1)*частота(2-1)+....+ и так далее...допустим получили 2.4 мо тогда допустим для МО геймов можно так связать цифры---для распределения по геймам делаем тоже самое
там допустим цифра будет по матчу 10.5 (тут берём суммы 6+0 6+1 итд где тай-брейк там 13....) тогда можно перемножить 2.4*10.5
Потом там надо понимать--что распределение на гейм будет отличаться от распределения для матча (в силу процедуры подсчёта частот) и на вид и цифры будет влиять---кто подаёт первым.
Можно считать достаточно много линий с помощью такой модели (но надо помнить что считаем триггерным способом...нужно два расчёта которые потом объединяем через формулу полной вероятности). Допустим через функцию дающую распределение счёта в гейме можно вычислить линию
<6 =6 >6 (просто складываем частоты событий входящих в события <6 =6 или >6)
#30 OFFLINE
Добавлено 21 September 2016 - 12:16
в общем там дуальности сложно добится хотел чтоб одинаковое (близкое было по значениям если допустим 14 и 9 и 9 14 ставить но хз как там это всё оптимизируется.... меняешь циферы в коде которые отвечают за начальную итерацию шаг и изменение шага и данные мля меняются......)
сделал вот так как вариант (дальше там сами мудите) это кусок кода который отвечает за все вещи которые я упомянул выше (можно попробовать поменять алгоритм подбора)
If pwm >= ptm Then
f1 = 0.62
f2 = 0.57
Else
f1 = 0.57
f2 = 0.62
End If
For k = 1 To 7
A1 = 0.035 / k ^ 0.5
A2 = 0.035 / k ^ 0.5
j = 0
i = 0
If pwm >= ptm Then
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f1 = f1
A1 = A1 / 5
j = j + 1
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f1 = f1 + A1
Else
f1 = f1 - A1
End If
If (f1 < 0) Or (f1 > 1) Then
Exit Do
End If
Loop
If (f1 < 0) Or (f1 > 1) Then
GoTo M
End If
j = 0
i = 0
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A2 * 1.08, f2 + A2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 + A2 * 1.08, f2 + A2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A2 / 1.08, f2 - A2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 - A2 / 1.08, f2 - A2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f2 = f2
A2 = A2 / 5
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f2 = f2 + A2
f1 = f1 + A2 * 1.08
Else
f2 = f2 - A2
f1 = f1 - A2 / 1.08
End If
If (f2 < 0) Or (f2 > 1) Then
Exit Do
End If
Loop
If (f2 < 0) Or (f2 > 1) Then
GoTo M
End If
Else
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2
Y2 = (F_Tennis(f1, f2 + A1, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2
Y3 = (F_Tennis(f1, f2 - A1, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f2 = f2
A1 = A1 / 5
j = j + 1
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f2 = f2 + A1
Else
f2 = f2 - A1
End If
If (f1 < 0) Or (f1 > 1) Then
Exit Do
End If
Loop
If (f1 < 0) Or (f1 > 1) Then
GoTo M
End If
j = 0
i = 0
Do Until j > 3 Or i > 50
i = i + 1
Y1 = (F_Tennis(f1, f2, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1, f2, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y2 = (F_Tennis(f1 + A2, f2 + A2 * 1.08, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 + A2, f2 + A2 * 1.08, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
Y3 = (F_Tennis(f1 - A2, f2 - A2 / 1.08, marktb, mark1, 1, n, m1, m2, st1, st2) - ptm) ^ 2 + (F_Tennis(f1 - A2, f2 - A2 / 1.08, marktb, mark1, 0, n, m1, m2, st1, st2) - pwm) ^ 2
If (Y1 < Y2) And (Y1 < Y3) Then
f1 = f1
A2 = A2 / 5
ElseIf (Y2 < Y1) And (Y2 < Y3) Then
f1 = f1 + A2
f2 = f2 + A2 * 1.08
Else
f1 = f1 - A2
f2 = f2 - A2 / 1.08
End If
If (f1 < 0) Or (f1 > 1) Then
Exit Do
End If
Loop
If (f1 < 0) Or (f1 > 1) Then
GoTo M
End If
End If
Next k
M: If f1 < 0.5 And f2 < 0.5 Then
Raspsolv(0) = 1 - f2
Raspsolv(1) = 1 - f1
Else
Raspsolv(0) = f1
Raspsolv(1) = f2
End If
Наверно будет лучше брать базу где есть возможность непосредственно находить Рочко (а то данные неустойчивые по вышеуказанному механизму...или косяк в алгоритме )
Отредактировано Bambuk, 21 September 2016 - 12:22.