【问题标题】:Linear Program minimize maximal distance线性规划最小化最大距离
【发布时间】:2023-03-22 09:00:01
【问题描述】:

给定:设置 N = [0,...,n-1], k in N, d_ij >= 0 with d_ii = 0 任务:找到子集 C ⊆ N,|C|≤k 最小化 max_i∈N min_j∈C d_ij。

想法:如果 x_i 在 C 中,我用 x_i = 1 定义 x_i,否则为零,受 sum(x_i) = d_ij 约束 x_j = 1 的任意 j。这是我最大的问题。我可以用 python 写这些东西,但不能作为线性程序。无论我尝试什么,我都会在我的公式中失去线性或其他东西。如果我能做到这一步,我可以定义 y,由 y >= w_i 约束每个 i 并最小化 y。我认为,我的想法有一个重大缺陷,但经过深思熟虑,我无法想出不同的方法,可能是因为这是我必须写的第一个 Lp。如果有人对我如何将我的问题表述为 Lp 有任何想法,我将非常感激。

【问题讨论】:

    标签: linear-programming


    【解决方案1】:

    这是一个用 MiniZinc 实现的简单 MILP 模型:

    int: nPoints = 4;
        
    set of int: POINT = 1..nPoints;
        
    array[POINT, POINT] of int: d = [|
        0, 2, 4, 5|
        2, 0, 3, 1|
        1, 4, 0, 4|
        2, 4, 3, 0|];
            
    int: k = 2;
    int: M = max(d);
        
    array[POINT] of var 0..1: x;
    array[POINT, POINT] of var int: d_top;
    array[POINT, POINT] of var 0..1: r;
    array[POINT, POINT] of var int: d_min;
    var int: z;
        
    % max k points in C
    constraint (sum(i in POINT)(x[i]) <= k);
        
    % set d_top_ij to d_ij if x_i in C otherwise M 
    constraint forall(i, j in POINT)
        (d_top[i,j] = d[i,j]*x[i] + M*(1-x[i]));
        
    % exactly one closest point for each point
    constraint forall(j in POINT)
        (sum(i in POINT)(r[i,j]) = 1);
        
    % d_min_ij = d_top_ij*r_ij (linearize product of continuous variable and binary variable)
    constraint forall(i, j in POINT)
        (d_min[i,j] <= d_top[i,j] /\ d_min[i,j] <= M*r[i,j] /\ d_min[i,j] >= 0 /\ d_min[i,j] >= d_top[i,j] - (1-r[i,j])*M);
        
    % z is greater than all values in m 
    constraint forall(i, j in POINT)(z >= d_min[i,j]);
        
    solve
    minimize z;
        
    output ["obj=\(z)\n"] ++
    ["x="] ++ [show(x)] ++
    ["\nd_top=\n"] ++ [show2d(d_top)] ++
    ["r=\n"] ++ [show2d(r)] ++
    ["d_min=\n"] ++ [show2d(d_min)];
    

    跑步给出:

    obj=1
    x=[0, 1, 1, 0]
    d_top=
    [| 5, 5, 5, 5 |
       2, 0, 3, 1 |
       1, 4, 0, 4 |
       5, 5, 5, 5 |]
    r=
    [| 0, 0, 0, 0 |
       0, 1, 0, 1 |
       1, 0, 1, 0 |
       0, 0, 0, 0 |]
    d_min=
    [| 0, 0, 0, 0 |
       0, 0, 0, 1 |
       1, 0, 0, 0 |
       0, 0, 0, 0 |]
    

    【讨论】:

      猜你喜欢
      • 2021-01-29
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多