Это мой первый пост на этих форумах, спасибо за все ответы.Комбинаторная оптимизация с взаимозависимыми переменными
Я разрабатываю приложение Java, в котором я столкнулся с тем, что, как мне кажется, называется «проблемой комбинаторной оптимизации». У меня есть только базовые математические навыки, поэтому попытка исследовать настройку такой проблемы пока не принесла больших результатов.
В общем, что я хотел бы сделать, это запрограммировать наиболее эффективный способ нахождения оптимального подмножества n большего множества N с переменными v1, v2, v3 и т. Д. Все переменные имеют определенное значение/балл в дополнение к значению/оценке, которое зависит от некоторых других переменных, которые могут или не могут быть включены в подмножество.
Я заинтересован в выборе подмножества, которое дает максимальную общую стоимость/оценку.
Так, например, полный набор N состоит из следующих переменных и имеют следующие определенные значения, а также отношения к другим переменным:
v1 8 { v2 ; v8 }
v2 6 { v1 ; v4 }
v3 9 { }
v4 7 { v2 ; v5 ; v8 }
v5 6 { v4 ; v10 }
v6 8 { v7 }
v7 5 { v6 }
v8 9 { v1 ; v4 }
v9 6 { }
v10 7 { v5 }
Имея отношение к одному или нескольким другим выбранной переменной означает, что общее значение будет иметь определенный «взлет» - ради этого примера допустим один для каждого отношения. Так выбирая первые пять переменных, как подмножество даст общее значение 30:
v1 8 { v2 ; v8 } = 8 - 1 = 7
v2 6 { v1 ; v4 } = 6 - 2 = 4
v3 9 { } = 9 - 0 = 9
v4 7 { v2 ; v5 ; v8 } = 7 - 2 = 5
v5 6 { v4 ; v10 } = 6 - 1 = 5
Это, конечно, не проблема для таких небольших наборов, но я в настоящее время сталкиваются наборы 100К и подмножества 10K - с текущим алгоритмом мой компьютер вычислил решение через 3 дня!
Мне не обязательно нужен код для решения этого вопроса, а скорее оптимальный математический способ его выполнения (если они есть!). Имейте в виду, что мне трудно понять математическую нотацию выше базового уровня.
Снова благодарим за все ответы!
Взял меня на некоторое время, но теперь я попытался понять некоторые из упомянутых здесь решений. В итоге я закончил симулированное отжиг. Не уверен, что это было правильное/оптимальное решение, но, по крайней мере, его было достаточно легко понять и реализовать - и, похоже, он отлично справляется с тем, что я пытаюсь сделать. Спасибо за все предложения! –