如何在matlab界面或任何其他技术计算语言中使用gurobi优化器解决校车路由(SBR)?

时间:2013-06-10 10:34:09

标签: matlab octave mathematical-optimization

%在matlab界面中使用gurobi优化器解决MILP的示例如下:

function[] = mip1() 

names = {'x'; 'y'; 'z'}; 

try 
    clear model;  
    model.A = sparse([1 2 3; 1 1 0]);  
    model.obj = [1 1 2];  
    model.rhs = [4; 1];  
    model.sense = '<>';  
    model.vtype = 'B';  
    model.modelsense = 'min';  

    clear params;  
    params.outputflag = 0;  
    params.resultfile = 'mip1.lp';  

    result = gurobi(model, params);  

    disp(result)  

    for v=1:length(names)  
        fprintf('%s %d\n', names{v}, result.x(v));  
    end  

    fprintf('Obj: %e\n', result.objval);  

catch gurobiError  
    fprintf('Error reported\n');  
end  

end  

======================================

运行此代码后,我们输出如下:

      status: 'OPTIMAL'
 versioninfo: [1x1 struct]
      objval: 1
     runtime: 0
           x: [3x1 double]
       slack: [2x1 double]
    objbound: 1
   itercount: 0
baritercount: 0
   nodecount: 0

x 0
y 1
z 0
Obj: 1.000000e+000

=========================================

现在我想概括一下这段代码来解决校车路由问题。

我已经建模了这样的SBRP问题:

minimize sum_{i!=j} c_{ij} x_{ij}

subject to sum_{j=1}^{n} x_{ij} = 1, for i=1,2,...,n

           sum_{i=1}^{n} x_{ij} = 1, for j=1,2,...,n



           sum_{i,j \in s} <=|s|-v(s);

           s c V\{1};

           |s|>=2;

           x_{ij} \in {0,1}; i,j =1,2,...,n; i!=j

c_{ij}是费用

v(s)是在最佳解决方案中访问s的所有顶点所需的车辆数量的下限。

SV/{1}的子集,其中V是公交车站的集合。

请帮帮我。

感谢你,

的Ajay

1 个答案:

答案 0 :(得分:1)

您可能希望迭代地添加子消除约束(因为它们有很多)。你想这样做:

  1. 在没有消除树干限制的情况下解决Gurobi中的问题。
  2. 检查并查看违反了哪些地形消除限制。
  3. 将违反的约束添加到模型中。 重复直到1-3,直到没有违反地下消除约束。
  4. 通过这种方法,通过超过大约10次停止将实例解决为最优性通常很困难。