Итак, один быстрый вопрос - я пытаюсь реализовать пробную версию SOS типа 1 в CPLEX.
Когда я смотрю документацию, я вижу функцию добавления
add(self, type='1', SOS=SparsePair(ind = [0], val = [0.0]), name='')
Adds a special ordered set constraint to the problem.
найдено здесь https://www.ibm.com/support/knowledgecenter/en/SSSA5P_12.7.0/ilog.odms.cplex.help/refpythoncplex/html/cplex._internal._subinterfaces.SOSInterface-class.html#add
Когда я смотрю на документацию, я понимаю все, кроме val. Моя идея этой проблемы SOS1 на самом деле заключается в том, что вы добавляете ограничение (предполагая, что все переменные являются двоичными {0,1}, что сумма всех переменных меньше или равна 1. То есть, что либо все переменные 0 или самое большее 1. Так как это сумма, все значения val равны 1? Как это было бы что-то еще? Я упоминаю об этом, потому что нашел частичку исходного кода, которая делает эти веса 25,18, как показано ниже.
def setproblemdata(p):
p.objective.set_sense(p.objective.sense.maximize)
p.linear_constraints.add(rhs=[20.0, 30.0, 0.0], senses="LLE")
obj = [1.0, 2.0, 3.0, 1.0]
lb = [0.0, 0.0, 0.0, 2.0]
ub = [40.0, cplex.infinity, cplex.infinity, 3.0]
cols = [[[0, 1], [-1.0, 1.0]],
[[0, 1, 2], [1.0, -3.0, 1.0]],
[[0, 1], [1.0, 1.0]],
[[0, 2], [10.0, -3.5]]]
p.variables.add(obj=obj, lb=lb, ub=ub, columns=cols,
types="CIII", names=["0", "1", "2", "3"])
p.SOS.add(type="1", SOS=[["2", "3"], [25.0, 18.0]])
p.order.set([(1, 8, p.order.branch_direction.up),
("3", 7, p.order.branch_direction.down)])
p.order.write("mipex3.ord")
return