2015-12-24 1 views
-1

Я создаю игру, которая позволяет игроку контролировать «поток мощности» между 10 контурами.Mathmatics для балансировки «нескольких цепей»

Каждая из 10 схем настраивается индивидуально, а общая сумма должна всегда равняться 100%.

Например, прекрасно сбалансированная ситуация была бы все 10 схемы на 10% (10х10 = 100)

Edit 2: Если то, что я пытаюсь сделать здесь знают, как другие, чем «балансирование» вещей, Прошу прокомментировать, и я буду исследовать их.

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

EDIT 3: Иногда запрашиваемая сумма не может быть возможно достичь (например, пример 3 и 6) в этих ситуациях ближайший возможный результат будет результат

EDIT: Видя, что мой пост получает вниз голоса я буду включать то, что я уже пытался

  1. Сумма изменения разделенного схемами, запрашивающих изменение добавление к цепям запрашивающих изменения и сняты цепи не меняется - проблема с этим методом был негативные и позитивные изменения на одна и та же время может уравновешиваться и приводить к «тупиковым» ситуациям, в которых не происходит никаких изменений.
  2. Циклическая цепь путем добавления и принятия по необходимости. Проблема с этим методом заключается в том, что он редко сбалансирован правильно.
  3. Применять вычитания и добавления сначала, а затем сбалансировать все (таким образом, сумма становится равной 100), проблема в том, что мощность будет заканчиваться там, где она не должна быть с цепями, которые должны быть в 0, заканчиваются небольшими количествами мощности.

Чтобы упростить мой вопрос, может работать только с 5 схемами.

Мне нужна помощь в разработке математики для расчета следующего. После 20 или около того попыток я думаю, что я слишком усложняю это, поскольку я продолжаю заканчивать 200 строк сценариев или это действительно очень сложно?

Пример 1: Добавление Пример

20 20 20 20 20 Start values 
+10 +10 0 0 0 Change 
30 30 3.3 3.3 3.3 After first iteration 
50 50 0 0 0 After x iterations (eg key held down) 

Пример 2: Вычитание Пример

20 20 20 20 20 Start values 
-10 -10 0 0 0 Change 
10 10 26.6 26.6 26.6 After first iteration 
    0 0 33.3 33.3 33.3 After x iterations (eg key held down) 

Пример 3: Блокировка + Сложение (L заблокирован)

 L   
2.5 90 2.5 2.5 2.5 Start values 
    0 0 +50 0 0 Change 
    0 90 10 0 0 After first iteration 
    0 90 10 0 0 After x iterations (eg key held down) 

Пример 4: Блокировка + вычитание (L заблокировано)

 L   
2.5 90 2.5 2.5 2.5 Start values 
    0 -10 0 0 0 Change 
    5 80 5 5 5 After first iteration 
25 0 25 25 25 After x iterations (eg key held down) 

Пример 5: Мульти Lock + Вычитание (L заблокирован)

 L L  
2.5 90 2.5 2.5 2.5 Start values 
    0 -10 0 0 0 Change 
5.8 80 2.5 5.8 5.8 After first iteration 
32.5 0 2.5 32.5 32.5 After x iterations (eg key held down) 

Пример 6: Балансирование изменения от несбалансированного старта (Это математика может быть немного выключена)

2.5 90 2.5 2.5 2.5 Start values 
+10 +10 +10 0 0 Change 
16.7 66.6 16.7 0 0 After first iteration 
33.3 33.3 33.3 0 0 After x iterations (eg key held down) 
+0

Можете ли вы объяснить, чего вы хотите достичь? Я не могу понять ваши примеры. Например. напр. 3, третья колонка имеет 10 после добавления от 50 до 2,5. Почему это?Сначала я думал, что вы хотите разрешить игроку менять любую схему и распределять изменения одинаково на остальных цепях. Но, похоже, это не так. –

+0

Привет, Нико, спасибо за ответ. В третьем примере игрок попытался добавить 50 в 3-ю схему, однако вторая схема заблокирована и в настоящее время имеет 90%. Поскольку он заблокирован, 3-я схема может собирать в общей сложности 10% от разблокированных цепей, поскольку от заблокированной цепи ее не разрешается. Вы правы в том, что хотите распределить оставшиеся одинаково по всем схемам, но это нужно делать с ограничением блокировок. Я отредактирую свое сообщение, чтобы объяснить, что запрошенные изменения могут быть не всегда возможны и что они могут быть ограничены в этих случаях. –

ответ

0

Начните с получения всех цепей, которые могут быть изменены во время выполнения:

Candidates = AllCircuits \ (LockedCircuits u ChangedCircuits) 

Здесь \ обозначает набор минус-оператора, а u - оператор объединения.

Вычислить среднее изменение за цепь:

targetTotalChange = totalChange 
averageChange = totalChange/|Candidates| 

Теперь, начинает менять кандидат. Чтобы учесть ограничения, закажите кандидатов по их текущему потоку мощности. Если averageChange отрицательный, то закажите их в порядке возрастания. Если это положительно, закажите их в порядке убывания.

И помните, сколько схем вы уже обработали:

processedCircuits = 0 

Теперь итерацию всех кандидатов в указанном порядке:

for each candidate in Candidates 

Проверить, если среднее изменение может быть добавлено к этой схеме. В противном случае, адаптировать значения:

processedCircuits++ 
    prevPower = candidate.PowerFlow 
    targetPower = prevPower + averageChange 
    if(targetPower < 0) 
    { 
     totalChange += prevPower 
     candidate.PowerFlow = 0 
     //recalculate average change 
    } 
    else if(targetPower > 100) 
    { 
     totalChange -= 100 - prevPower 
     candidate.PowerFlow = 100 
     //recalculate average change 
    } 
    else 
    { 
     totalChange -= averageChange 
     candidate.PowerFlow += averageChange 
    } 

Если вам необходимо пересчитать среднее изменение, выполните следующие действия:

averageChange = totalChange/(|Candidates| - processedCircuits) 

Остерегайтесь деления на ноль.

Теперь вы адаптировали все остальные схемы. Остается адаптировать измененные схемы. Это довольно легко. Мы изменили все остальные схемы на targetTotalChange - totalChange. Это изменение может быть добавлено к измененным схемам. Мы можем просто добавить процент в процентах:

percentage = (targetTotalChange - totalChange)/targetTotalChange 
for each circuit in ChangedCircuits 
    circuit.PowerFlow += percentage * targetChange[circuit] 
next 
+0

Нико, это выглядит очень многообещающим. Я постараюсь проверить его сегодня вечером. Как только я его протестирую, я буду отмечать его как ответ. Большое вам спасибо за ответ. Могли бы вы ответить на мой вопрос? Я чувствую, что подробно изложил свой вопрос, и у него есть 3 голоса. –

+0

В текущей форме вопрос находится прямо на краю, чтобы стать хорошим вопросом. Думаю, голосующий закон. В будущем вы можете сосредоточиться на описании своей проблемы. Напишите его таким образом, чтобы посторонний знал, что вы хотите сделать. Сначала у меня были проблемы. Хотя некоторые пользователи делают это, это не очень хорошая практика, чтобы противостоять голосам с повышением голосов и наоборот. Голоса должны быть заданы только по актуальному вопросу. Не по голосам вопроса. –

+0

Большое спасибо за вашу помощь. С небольшим количеством настроек, которые отвечали –

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