Optimization 二进制变量输出非二进制-pyomo(ipopt解算器)

Optimization 二进制变量输出非二进制-pyomo(ipopt解算器),optimization,pyomo,Optimization,Pyomo,我正在使用Pyomo(使用iPopt解算器)建立一个优化模型,并试图设置一个约束,使模型的特定变量保持在一定范围(0500)之外,即变量可以为零或大于500 因为我不能为变量指定多个域,所以我使用二进制变量为每个变量添加一个约束 约束的工作原理如下: model.variable <= 1 + (large_upper_bound-1)*model.binary_variable model.variable >= 500*model.binary_variable 这意味着x变量

我正在使用Pyomo(使用iPopt解算器)建立一个优化模型,并试图设置一个约束,使模型的特定变量保持在一定范围(0500)之外,即变量可以为零或大于500

因为我不能为变量指定多个域,所以我使用二进制变量为每个变量添加一个约束

约束的工作原理如下:

model.variable <= 1 + (large_upper_bound-1)*model.binary_variable
model.variable >= 500*model.binary_variable
这意味着x变量的解决方案不会超出指定的范围

有人能帮我理解为什么二进制变量变成小数吗

我如何才能停止这种行为,并为这些二进制变量(如[0,1])向模型施加一组整数

和/或是否有其他方法解决此问题


谢谢大家。

首先,Ipopt只解决连续问题。它忽略变量的离散状态,并将它们视为在指定边界之间的连续变量


第二,即使您要使用MIP解算器(例如,Gurobi、Cplex),说明这些解算器中内置的整数容差非常重要。根据解算器使用的容差设置,它们可能会返回一个值,如二进制变量的.999999。在检查解算器时,最好说明这一点,可能在适当的情况下,将解算器四舍五入为整数。

首先,Ipopt只解决连续问题。它忽略变量的离散状态,并将它们视为在指定边界之间的连续


第二,即使您要使用MIP解算器(例如,Gurobi、Cplex),必须考虑这些解算器内置的整数容差。根据解算器使用的容差设置,它们可能会返回一个值,如二进制变量的.999999。在检查解决方案时考虑这一点是一个好主意,可能在适当的情况下,将解算器四舍五入为整数。

d、 你帮了我很多,你帮了我很多
model.x2 = Var(binary_vars, within=Binary)

for route in binary_vars:
        model.cons.add(model.x[route[0], route[1], route[2], route[3]] <= (1 + (100000-1)*model.x2[route[0], route[1], route[2], route[3]]))
        model.cons.add(model.x[route[0], route[1], route[2], route[3]] >= (500*model.x2[route[0], route[1], route[2], route[3]]))
model_result = SolverFactory('ipopt').solve(model, tee=True)
dict_values([0.0, 0.0, 0.0, 0.0, 0.0, 0.69771460622592687, 
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 0.0, 0.0,  0.0, 0.52210753137570483, 0.0, 0.0,
0.44349809775540615])