繁体   English   中英

Python 线性规划,将输入约束为零或范围

[英]Python Linear Programming, Constrain Input to Zero or Range

在线性程序中,我正在最小化加权输入向量和目标向量之间的距离。 我使用 Scipyto 计算我需要的权重值。 目前它们在零和一之间,但如果它们小于.2,我希望它们为零,所以 x_i 应该是 0 或 [.2; 1]。 我被指出混合 integer 线性规划,但我仍然找不到任何方法来解决我的问题。 我怎样才能解决这个问题?

tldr:我想使用 (0,0) 或 (.3,1) 作为每个 x 的边界,我该如何实现呢?

这是我的 SciPy 代码:

    # minimize the distance between weighted input vectors and a target vector
def milp_objective_function(weights):
    scaled_matrix = input_matrix * weights[:, np.newaxis] # scale input_matrix columns by weights
    sum_vector = sum(scaled_matrix) # sum weighted_input_matrix columns
    difference_vector = sum_vector - target_vector
    return np.sqrt(difference_vector.dot(difference_vector)) # return the distance between the sum_vector and the target_vector

# sum of weights should equal 100%
def milp_constraint(weights):
    return sum(weights) - 1

def main():
    # bounds should be 0 or [.2; 1] -> mixed integer linear programming?
    weight_bounds = tuple([(0, 1) for i in input_matrix])
    # random guess, will implement later
    initial_guess = milp_guess_weights()
    
    constraint_obj = {'type': 'eq', 'fun': milp_constraint}
    result = minimize(milp_objective_function, x0=initial_guess, bounds=weight_bounds, constraints=constraint_obj)

{0} ∪ [L,U] 中的变量称为半连续变量 高级 MIP 求解器内置支持这些类型的变量。

请注意,SciPy 根本没有 MIP 求解器。

我还想指出,如果您的 MIP 求解器不支持半连续变量,您可以使用二进制变量模拟它们:

 L ⋅ δ(i) ≤ x(i) ≤ U ⋅ δ(i) 
 δ(i) ∈ {0,1}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM