В настоящее время я использую cvxpy для оптимизации действительно большой проблемы, но теперь столкнулся с текущей проблемой. Я запускаю несколько итераций решателя (каждая итерация снижает гибкость некоторых переменных). В каждом прогоне всего 50 ограничений, из которых только 2 различаются в каждом прогоне. Остальные 48 ограничений идентичны. На каждой итерации я перестраиваю с нуля эти 2 ограничения, проблему и функцию obj. Если я не перестрою оставшиеся (те же) 48 ограничений, окончательное решение не будет иметь смысла.
Я прочитал этот пост CVXPY: как эффективно решить серию аналогичных проблем, но здесь, в моем случае, мне не нужно менять параметры и повторно оптимизировать.
Мне только что удалось подготовить пример, показывающий эту проблему:
x = cvx.Variable(3)
y = cvx.Variable(3)
tc = np.array([1.0, 1.0,1.0])
constraints2 = [x >= 2]
constraints3 = [x <= 4]
constraints4 = [y >= 0]
for i in range(2):
if i == 0:
constraints1 = [x - y >= 0]
else:
x = cvx.Variable(3)
y = cvx.Variable(3)
constraints1 = [x + y == 1,
x - y >= 1,
x - y >= 0,
x >= 0]
constraints = constraints1 + constraints2 + constraints3 + constraints4
# Form objective.
obj = cvx.Minimize( (tc.T @ x ) - (tc.T @ y ) )
# Form and solve problem.
prob = cvx.Problem(obj, constraints)
prob.solve()
solution_value = prob.value
solution = str(prob.status).lower()
print("\n\n** SOLUTION: {} Value: {} ".format(solution, solution_value))
print("* optimal (x + y == 1) dual variable", constraints[0].dual_value)
print("optimal (x - y >= 1) dual variable", constraints[1].dual_value)
print("x - y value:", (x - y).value)
print("x = {}".format(x.value))
print("y = {}".format(y.value))
Как видите, constraints2 требует, чтобы все значения в векторе x были больше 2. constraints2 добавляется в обеих итерациях к ограничениям, используемым в решателе. Второе решение должно дать вам значения вектора x меньше 2. Почему? Как избежать этой проблемы? Спасибо