2009-07-10 1 views
2

Я пытаюсь создать приложение, которое рассчитает стоимость экзотических расходов на паримутул. Я нашел несколько для определенных типов ставок, но не один, который разрешает все сценарии для одного типа ставок. Если бы я мог найти алгоритм, который мог бы рассчитать все возможные комбинации, я мог бы использовать эту формулу для решения моих других проблем.Формула для расчета экзотических ставок, таких как Trifecta и Superfecta

Дополнительная информация: Мне нужно рассчитать перестановки групп чисел. Например;

Группа 1 = 1,2,3
Группа 2 = 2,3,4
Группа 3 = 3,4,5

Каковы все возможные перестановки этих 3-х групп чисел с 1 число из каждой группы на каждую перестановку. Никаких повторов на перестановку, то есть число не может отображаться в более чем 1 позиции. Таким образом, 2,4,3 действительно, но 2,4,4 недействительны.

Спасибо за помощь.

+0

Стоимость расходов? –

+2

Это похоже на интересный вопрос, но я не могу сделать головы или хвосты. Как вы думаете, вы можете отредактировать его, чтобы объяснить более подробно, возможно, включая ссылки на некоторые из более технических терминов? – rmeador

ответ

4

Как и большинство интересных проблем, ваш вопрос имеет несколько решений. Алгоритм, который я написал (ниже), является самой простой вещью, которая пришла на ум.

Мне было проще подумать о проблеме, подобной дереву: первая группа, корень, имеет дочерний элемент для каждого содержащегося в нем номера, где каждый ребенок является второй группой. Вторая группа имеет дочернюю группу третьей группы для каждого числа, которое она содержит, у третьей группы есть ребенок четвертой группы для каждого числа, которое она содержит, и т. Д. Все, что вам нужно сделать, это найти все допустимые пути от корня до листьев.

Однако для многих групп с большим количеством чисел этот подход окажется медленным без каких-либо эвристик. Одна вещь, которую вы можете сделать, - сначала отсортировать список групп по размеру группы, наименьшей группе. Это был бы быстрый подход, который, в общем, обнаружил бы, что перестановка недействительна раньше, чем позже. Look-ahead, arc-consistency, и обратное отслеживание - это другие вещи, о которых вы могли бы подумать. [К сожалению, я могу включить только одну ссылку, потому что это мой первый пост, но вы можете найти эти вещи в Википедии.]

## Algorithm written in Python ## 
## CodePad.org has a Python interpreter 

Group1 = [1,2,3] ## Within itself, each group must be composed of unique numbers 
Group2 = [2,3,4] 
Group3 = [3,4,5] 
Groups = [Group1,Group2,Group3] ## Must contain at least one Group 

Permutations = [] ## List of valid permutations 

def getPermutations(group, permSoFar, nextGroupIndex): 
    for num in group: 
    nextPermSoFar = list(permSoFar) ## Make a copy of the permSoFar list 

    ## Only proceed if num isn't a repeat in nextPermSoFar 
    if nextPermSoFar.count(num) == 0: 
     nextPermSoFar.append(num) ## Add num to this copy of nextPermSoFar 

     if nextGroupIndex != len(Groups): ## Call next group if there is one... 
     getPermutations(Groups[nextGroupIndex], nextPermSoFar, nextGroupIndex + 1) 
     else: ## ...or add the valid permutation to the list of permutations 
     Permutations.append(nextPermSoFar) 

## Call getPermutations with: 
## * the first group from the list of Groups 
## * an empty list 
## * the index of the second group 
getPermutations(Groups[0], [], 1) 

## print results of getPermutations 
print 'There are', len(Permutations), 'valid permutations:' 
print Permutations 
0

в качестве профессионального игрока я могу сказать вам, что есть гораздо более простой способ:

Для трифекты вам нужно 3 комбинации.Скажем, есть 8 бегунов, общее количество возможных перестановок - 8 (общее количество бегунов) * 7 (оставшиеся бегуны после того, как победитель пропущен) * 6 (оставшиеся бегуны после победителя и 2-ое опущены) = 336

Для точной оценки (с 8 бегунами) 8 * 7 = 56

Quinellas - это исключение, так как вам нужно брать только одну ставку один раз, как 1/2, так и 2/1, поэтому ответ 8 * 7/2 = 28

Простой

+0

Я не думаю, что это проблема, которую он пытается решить.Да, вы правы, вот как вы получаете общее количество перестановок всех бегунов. Он хочет, чтобы бегун 1 был в группе 1, бегун 2 в группе 2 и бегун 3 в группе 3, но без дубликатов. Я думаю, что это сложнейшая проблема, возможно, невозможная алгебраически. –

1

Пересмотренный через несколько лет: -

я вновь вошел в мой счет SE через некоторое время и заметил этот вопрос, и понял, что я написал даже не ответил вам: -

Вот некоторые питона код

import itertools 
def explode(value, unique): 
    legs = [ leg.split(',') for leg in value.split('/') ] 
    if unique: 
     return [ tuple(ea) for ea in itertools.product(*legs) if len(ea) == len(set(ea)) ] 
    else: 
     return [ tuple(ea) for ea in itertools.product(*legs) ] 

вызова взрываются работы на том основании, что каждая нога отделяется /, и каждой позиции по а,

для вашего расчета Trifecta вы можете работать его следующим: -

result = explode('1,2,3/2,3,4/3,4,5', True) 
stake = 2.0 
cost = stake * len(result) 
print cost 

для Superfecta

result = explode('1,2,3/2,4,5/1,3,6,9/2,3,7,9', True) 
stake = 2.0 
cost = stake * len(result) 
print cost 

для pick4 (Set Уникальной Ложные)

result = explode('1,2,3/2,4,5/3,9/2,3,4', False) 
stake = 2.0 
cost = stake * len(result) 
print cost 

Надежда, что помогает

1

Это самый простой общая формула я знаю trifectas.

A = количество выбранных вами вариантов для первого; B = количество выборов для второго; C = количество выборов для третьего; AB = количество выбранных вами вариантов как в первом, так и в втором; AC = нет. как для первого, так и для третьего; BC = нет. для 2-го и 3-го; и ABC = нет. выбор для всех 1-го, 2-го и третьего. формула (АхВхС) - (ABxC) - (ACxB) - (BCxA) + (2xABC)

Так, для примера ::

Group 1 = 1,2,3 
Group 2 = 2,3,4 
Group 3 = 3,4,5 

решение является :: (3x3x3) - (2x3) - (1x3) - (2x3) + (2x1) = 14. Надеюсь, что это поможет Может быть, более простой метод, о котором я не знаю. Теперь кто-нибудь знает общую формулу для First4?

+0

Как бы это уравнение распространилось на нечто вроде суперфекции? Не могли бы вы ссылаться на ресурс, который объясняет эту формулу, или дать еще несколько объяснений? – sammarks

0

Ответ, предоставленный luskin, является правильным для trifectas. Он задал еще один вопрос, который мне нужно решить в отношении First4. Я везде искал, но не мог найти формулу. Однако я нашел простой способ определить количество уникальных перестановок, используя вложенные циклы, чтобы исключить повторяющиеся последовательности.

Public Function fnFirst4PermCount(arFirst, arSecond, arThird, arFourth) As Integer 


Dim intCountFirst As Integer 
Dim intCountSecond As Integer 
Dim intCountThird As Integer 
Dim intCountFourth As Integer 
Dim intBetCount As Integer 

'Dim arFirst(3) As Integer 
'Dim arSecond(3) As Integer 
'Dim arThird(3) As Integer 
'Dim arFourth(3) As Integer 

'arFirst(0) = 1 
'arFirst(1) = 2 
'arFirst(2) = 3 
'arFirst(3) = 4 
' 
'arSecond(0) = 1 
'arSecond(1) = 2 
'arSecond(2) = 3 
'arSecond(3) = 4 
' 
'arThird(0) = 1 
'arThird(1) = 2 
'arThird(2) = 3 
'arThird(3) = 4 
' 
'arFourth(0) = 1 
'arFourth(1) = 2 
'arFourth(2) = 3 
'arFourth(3) = 4 

intBetCount = 0 
For intCountFirst = 0 To UBound(arFirst) 
    For intCountSecond = 0 To UBound(arSecond) 
     For intCountThird = 0 To UBound(arThird) 
      For intCountFourth = 0 To UBound(arFourth) 
       If (arFirst(intCountFirst) <> arSecond(intCountSecond)) And (arFirst(intCountFirst) <> arThird(intCountThird)) And (arFirst(intCountFirst) <> arFourth(intCountFourth)) Then 
        If (arSecond(intCountSecond) <> arThird(intCountThird)) And (arSecond(intCountSecond) <> arFourth(intCountFourth)) Then 
         If (arThird(intCountThird) <> arFourth(intCountFourth)) Then 
         ' Debug.Print "First " & arFirst(intCountFirst), " Second " & arSecond(intCountSecond), "Third " & arThird(intCountThird), " Fourth " & arFourth(intCountFourth) 
          intBetCount = intBetCount + 1 
         End If 
        End If 
       End If 
      Next intCountFourth 
     Next intCountThird 
    Next intCountSecond 
Next intCountFirst 
fnFirst4PermCount = intBetCount 

End Function 

Эта функция принимает четыре строковых массива для каждой позиции. Я оставил в тестовом коде (прокомментировал), чтобы вы могли видеть, как он работает на 1/2/3/4 для каждой из четырех позиций.

Смежные вопросы