我可以在mdl.sum变量上使用docplex分段函数吗?

2024-10-01 19:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用docplex为最长路径问题创建成本函数。作为公式的一部分,我想对模型中包含的变量和使用单位步长函数。下面是我的代码:

top_sort = list(range(0,5)) # topological sort of nodes
mdl = Model(name='lpp')
x = {i: mdl.binary_var(name='x_{0}'.format(i)) for i in top_sort}

H = mdl.piecewise(0, [(0, 0), (0, 1)], 0)
H(mdl.sum(x[k] for k in top_sort))

但是,每次运行此代码时,都会出现以下错误:

The type of Variable x6 is continuous. It must be a binary variable.
The type of Variable _pwl6 is continuous. It must be a binary variable.
Traceback (most recent call last):
  File "vqe.py", line 57, in <module>
    qubitOp, offset = longest_path.get_operator(G)
  File "C:\Users\vasnt\Documents\EDI2020\HONOURS\lpp\longest_path.py", line 109, in get_operator
    return docplex.get_operator(mdl)
  File "C:\Users\vasnt\Anaconda3\envs\qiskit\lib\site-packages\qiskit\optimization\applications\ising\docplex.py", line 90, in get_operator
    _validate_input_model(mdl)
  File "C:\Users\vasnt\Anaconda3\envs\qiskit\lib\site-packages\qiskit\optimization\applications\ising\docplex.py", line 232, in _validate_input_model
    if not constraint.sense == ComparisonType.EQ:
AttributeError: 'PwlConstraint' object has no attribute 'sense'

我甚至试着在一个二进制变量上应用H,它不断地告诉我这个变量是连续的,所以不起作用。你知道会出什么问题吗?谢谢


Tags: ofinpygettoplinesortoperator
1条回答
网友
1楼 · 发布于 2024-10-01 19:32:09

您得到的异常不是来自docplex内部,而是来自qiskit代码:

...qiskit\optimization\applications\ising\docplex.py"

我会让qiskit开发者对此发表评论。 在普通docplex上运行代码效果很好:(我只是简化了bianry var dict的定义:docplex将大小转换为raneg,宏从前缀生成名称):

代码是:

mdl = Model(name='lpp')
#x = {i: mdl.binary_var(name='x_{0}'.format(i)) for i in top_sort}
x = mdl.binary_var_dict(keys=5, name='x')

H = mdl.piecewise(0, [(0, 0), (0, 1)], 0)
z = mdl.continuous_var(name='z')
H(mdl.sum(x[k] for k in top_sort))
mdl.add(z == H(mdl.sum(x[k] for k in top_sort)))
mdl.maximize(mdl.sum(x))
s = mdl.solve(log_output=True)
mdl.print_solution()

输出为:

Version identifier: 20.1.0.0 | 2020-11-10 | 9bedb6d68
CPXPARAM_Read_DataCheck                          1
Found incumbent of value 0.000000 after 0.00 sec. (0.00 ticks)
Tried aggregator 1 time.
MIP Presolve eliminated 5 rows and 10 columns.
All rows and columns eliminated.
Presolve time = 0.00 sec. (0.01 ticks)

Root node processing (before b&c):
  Real time             =    0.00 sec. (0.01 ticks)
Parallel b&c, 12 threads:
  Real time             =    0.00 sec. (0.00 ticks)
  Sync time (average)   =    0.00 sec.
  Wait time (average)   =    0.00 sec.
                                
Total (root+branch&cut) =    0.00 sec. (0.01 ticks)
objective: 5
  x_0=1
  x_1=1
  x_2=1
  x_3=1
  x_4=1
  z=1.000

相关问题 更多 >

    热门问题