Найти пороговое значение - PullRequest
0 голосов
/ 24 февраля 2020

(FF14: RR) Этот предмет может иметь 5 материалов, 1 высокий уровень, 4 низкий уровень. Я упростил петли, имея 3 типа материалов (но у меня есть 6, anw). Я помещаю материал в элемент и затем вызываю Group.GetStats () для оценки статистики элемента, затем сохраняю его в списке, сначала проверяя его уникальность. Вызов Group.GetStats () дает мне словарь с 3 характеристиками. И я хочу отфильтровать количество возможностей на основе этой статистики.

Пример:

  • Stat1 - Stat2 - Stat3
  • (9, 7, 5)
  • (3, 10, 5)
  • (9, 7, 6)
  • (8, 6, 4)
  • (7, 6, 8 )
  • (7, 7, 7) <- </li>
  • (7, 7, 6)
  • (6, 6, 5)
  • (7 , 6, 7)

Все кортежи в (7, 7, 7) бесполезны, потому что больше ничего не добавляются.

Я уже закончил алгоритм, чтобы получить все возможные комбинации Материи но я хочу отфильтровать бесполезные комбинации.

for (int i = 0; i < 6; i++)
{
    for (int j = 0; j < 3; j++)
    {
        for (int k = j; k < 3; k++)
        {
            for (int l = k; l < 3; l++)
            {
                for (int m = l; m < 3; m++)
                {
                    ItemContainer Group = new ItemContainer(735, 400, 0, 1, 4, 864, 471, 6, new string[] { "Facet Alembic", "Facet Mortar" });
                    Group.AddMateria(new Materia(i >= 3 ? i-3 : i));
                    Group.AddMateria(new Materia(j));
                    Group.AddMateria(new Materia(k));
                    Group.AddMateria(new Materia(l));
                    Group.AddMateria(new Materia(m));
                    if (DEBUG) Console.WriteLine("{" + string.Join(",", Group.GetStats()) + "}");

                    string tempkey = string.Join(",", Group.GetStats());
                    if (i >= 3)
                    {
                        if (!unicityChecker.ContainsKey(tempkey))
                        {
                            if (isAnyBetter(Group.GetStats(),betterChecker.GetStats())) // Condition to keep it
                            {
                                ContainerList_1.Add(Group);
                                unicityChecker.Add(tempkey, Group.GetStats());
                            }
                        }
                    }
                    else
                    {
                        /* 
                            find the betterChecker in order to do isAnyBetter to only get the useful items
                            */
                        if (betterChecker == null) betterChecker = Group;
                        else
                        {
                            if (isAllBetter(Group.GetStats(), betterChecker.GetStats())) betterChecker = Group;
                        }
                    }
                }
            }
        }
    }
}

Звучит i <6 странно, но таким образом я сделал 2 прохода на одном поколении комбинаций. </p>

На выходе весь алгоритм (который включает в себя 7 из этого) у меня есть около 10 миллионов записей. Я подумал, удалив ненужные элементы в первом поколении, я мог бы уменьшить размер вывода (1 ГБ в json).

РЕДАКТИРОВАТЬ:

static bool isAnyBetter(Dictionary<String, int> stats1, Dictionary<String, int> stats2)
        {
            return stats1["craftmanship"] > stats2["craftmanship"] || stats1["control"] > stats2["control"] || stats1["cp"] > stats2["cp"];
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...