На самом деле, OR-Tools не требует, чтобы каждое ограничение имело уникальное имя.Но следующее все равно дает им уникальные имена.Как упоминалось выше, если вам нужно сохранить ограничения, вы можете сделать это в массиве следующим образом.Здесь я использую более распространенные обозначения (A - это коэффициенты ограничения, B - это правые части ограничения, c - это объективные коэффициенты).Но он адаптируется к вашей настройке Pandas.
from ortools.linear_solver import pywraplp # adapted from one of the examples
inf = float("inf")
AB = [
[1, 0, 1], # x <= 1
[0, 1, 2], # y <= 2
[1, 1, 2], # x + y <= 2
[-1, -1, 0] # x + y >= 0
]
c = [3, 1]
def main():
solver = pywraplp.Solver('simple_lp_program',
pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
x = solver.NumVar(-inf, inf, 'x') # no UB or LB on x, y
y = solver.NumVar(-inf, inf, 'y')
cts = []
for i, (*a, b) in enumerate(AB):
ct = solver.Constraint(-inf, b, 'ct' + str(i))
ct.SetCoefficient(x, a[0])
ct.SetCoefficient(y, a[1])
cts.append(ct)
print('Number of constraints =', solver.NumConstraints())
objective = solver.Objective()
objective.SetCoefficient(x, c[0])
objective.SetCoefficient(y, c[1])
objective.SetMaximization()
solver.Solve()
print('Solution:')
print('Objective value =', objective.Value())
print('x =', x.solution_value())
print('y =', y.solution_value())
if __name__ == '__main__':
main()