Как задать умножение в целевой функции смешанной целочисленной линейной программы Sage? - PullRequest
0 голосов
/ 07 октября 2018

Я хочу представить это в Sage как целевую функцию смешанной целочисленной линейной программы

sum i sum j of c i j x i j

Но когда ятип:

p = MixedIntegerLinearProgram()  
x = p.new_variable(integer=True, nonnegative=True)
c = p.new_variable(integer=True,nonnegative=True)
p.set_objective(sum(c[(i,j)]*x[(i,j)] for i in range(3) for j in range(4) ))

Я получаю эту ошибку:

Error in lines 1-1
Traceback (most recent call last):
  File "/usr/local/sage/local/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1188, in execute
    flags=compile_flags) in namespace, locals
  File "", line 1, in <module>
  File "/usr/local/sage/local/lib/python2.7/site-packages/sage/misc/functional.py", line 577, in symbolic_sum
    return sum(expression, *args)
  File "", line 1, in <genexpr>
  File "sage/structure/element.pyx", line 1532, in sage.structure.element.Element.__mul__ (build/cythonized/sage/structure/element.c:12188)
    return (<Element>left)._mul_(right)
  File "sage/structure/element.pyx", line 1576, in sage.structure.element.Element._mul_ (build/cythonized/sage/structure/element.c:12602)
    raise bin_op_exception('*', self, other)
TypeError: unsupported operand parent(s) for *: 'Linear functions over Real Double Field' and 'Linear functions over Real Double Field'

Странно, но это нормально работает (+ вместо *):

p.set_objective(sum(c[(i,j)]+x[(i,j)] for i in range(3) for j in range(4) ))

Есть какие-нибудь подсказки?Не поддерживается ли умножение в Sage для целевых функций смешанных целочисленных линейных программ?

1 Ответ

0 голосов
/ 07 октября 2018

Нашел свою ошибку, единственная переменная, которую я имею, это x.c - это , а не a переменная решения .Так что это должно быть определено как матрица.Это c[i,j]*x[i,j] не приводит к ошибке:

x = p.new_variable(integer=True, nonnegative=True)
c=matrix([[10,15],[24,25],[87,12]])
p.set_objective(sum(c[i,j]*x[i,j] for i in range(3) for j in range(2) ))
...