如何使用CPLEX中的决策变量使用地板功能? TypeError:必须是实际数字,而不是Linearexpr

发布于 2025-02-06 03:49:47 字数 615 浏览 2 评论 0原文

我正在解决Python中DOCPLEX的优化问题。我想使用Math.dloor函数将决策变量X1 [a]的值舍入至最接近的数字,并带有1/6步。

我定义了一个名为iNCETE_TIME(x,a)的函数。我使用此功能将X1 [a]离散化,这是一个决策变量。

但是我收到“ TypeError:必须是实际数字,而不是线性元素”。

Ayone是否知道如何解决此错误?如何在决策变量上使用地板功能?

事先感谢您的帮助!

def discret_time(x,a): #x = time in hours, a = length of dicretization steps in hours for example a = 1/6 means discretization in 1/6 hour intervals
    return math.floor(x/a)*a

labels = ['home', 'study', 'work']

x1 = m.continuous_var_dict(labels, lb = 0, name = 'x1') #start time

for a in labels:
    discret_start_a1 = discret_time(x1[a], 1/6)

I am solving an optimization problem with docplex in python. I want to use the math.floor function to round down the value of a decision variable x1[a] to the nearest number with 1/6 steps.

I have defined a function named discrete_time(x,a). I use this function to discretize x1[a] which is a decision variable.

But I receive "TypeError: must be real number, not LinearExpr."

Does ayone know how can I solve this error and how can I use floor function on a decision variable?

Thanks in advance for your help!

def discret_time(x,a): #x = time in hours, a = length of dicretization steps in hours for example a = 1/6 means discretization in 1/6 hour intervals
    return math.floor(x/a)*a

labels = ['home', 'study', 'work']

x1 = m.continuous_var_dict(labels, lb = 0, name = 'x1') #start time

for a in labels:
    discret_start_a1 = discret_time(x1[a], 1/6)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

铁轨上的流浪者 2025-02-13 03:49:47

将您的iNCETE_TIME()更改为:

def discrete_time(x,a):
  return int(x/a)*a

[或]

def discrete_time(x,a):
  temp = 0
  while(temp<=x):
    temp+=a
  temp-=a
  return temp

Math.floor()期望仅整数类型。

Change your discrete_time() to:

def discrete_time(x,a):
  return int(x/a)*a

[OR]

def discrete_time(x,a):
  temp = 0
  while(temp<=x):
    temp+=a
  temp-=a
  return temp

math.floor() expects only integer type.

枕头说它不想醒 2025-02-13 03:49:47

您应该地板应该

查看

from docplex.mp.model import Model

mdl = Model(name='floor')

r=range(0,4)
x=[1.5,4.0,2.0001,5.9999]

y = mdl.integer_var_list(4,0,1000,name="y")
f = mdl.continuous_var_list(4,0,0.99999,name="f")

for i in r:
    mdl.add(x[i]==y[i]+f[i])

mdl.solve()

for i in r:
    print(x[i]," ==> ",y[i].solution_value) from docplex.mp.model import Model

mdl = Model(name='floor')

r=range(0,4)
x=[1.5,4.0,2.0001,5.9999]

y = mdl.integer_var_list(4,0,1000,name="y")
f = mdl.continuous_var_list(4,0,0.99999,name="f")

for i in r:
    mdl.add(x[i]==y[i]+f[i])

mdl.solve()

for i in r:
    print(x[i]," ==> ",y[i].solution_value)

You should linéarize floor

See example

from docplex.mp.model import Model

mdl = Model(name='floor')

r=range(0,4)
x=[1.5,4.0,2.0001,5.9999]

y = mdl.integer_var_list(4,0,1000,name="y")
f = mdl.continuous_var_list(4,0,0.99999,name="f")

for i in r:
    mdl.add(x[i]==y[i]+f[i])

mdl.solve()

for i in r:
    print(x[i]," ==> ",y[i].solution_value) from docplex.mp.model import Model

mdl = Model(name='floor')

r=range(0,4)
x=[1.5,4.0,2.0001,5.9999]

y = mdl.integer_var_list(4,0,1000,name="y")
f = mdl.continuous_var_list(4,0,0.99999,name="f")

for i in r:
    mdl.add(x[i]==y[i]+f[i])

mdl.solve()

for i in r:
    print(x[i]," ==> ",y[i].solution_value)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文