Я новичок в Python и CPLEX. Я хотел бы суммировать коэффициенты переменных для каждого ограничения, но я не знаю, как сгруппировать по переменным в ограничении, а затем использовать функцию Sum.
for i in (d.linear_constraints.get_names()):
for j in (d.variables.get_names()):
Varconst = d.linear_constraints.get_coefficients(i,j)
print("constraints-coefficients: ",i,"-",j,":",Varconst)
1 ответ
Я рекомендую вам использовать docplex - высокоуровневый API Python CPLEX.
И если я немного изменю пример zoo:
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.add_constraint(nbbus40*45 + nbbus30*35 >= 320, 'kids2')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
vardict={i:0 for i in mdl.iter_variables()}
for i in mdl.iter_linear_constraints():
for j in i.iter_variables():
Varconst = i.lhs.get_coef(j)
print("constraints-coefficients: ",i,"-",j,":",Varconst)
vardict[j]+=Varconst
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
for i in mdl.iter_variables():
print(i," ==> ",vardict[i])
Дает
constraints-coefficients: kids: 40nbBus40+30nbBus30 >= 300 - nbBus40 : 40
constraints-coefficients: kids: 40nbBus40+30nbBus30 >= 300 - nbBus30 : 30
constraints-coefficients: kids2: 45nbBus40+35nbBus30 >= 320 - nbBus40 : 45
constraints-coefficients: kids2: 45nbBus40+35nbBus30 >= 320 - nbBus30 : 35
nbBus40 = 6.0
nbBus30 = 2.0
nbBus40 ==> 85
nbBus30 ==> 65
Похожие вопросы
Новые вопросы
cplex
CPLEX - это быстрый коммерческий линейный, квадратичный и смешанный целочисленный оптимизатор. CPLEX предлагает ряд инструментов для предварительной и последующей обработки, позволяющих программному обеспечению значительно сократить количество переменных (столбцов) и ограничений (строк) модели. Модели можно решать с помощью интерактивной оболочки, OPL (языка программирования оптимизации) или ряда интерфейсов с языками программирования, такими как C, C ++, Java, C #, Python и MATLAB.