(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"];
}