【问题标题】:How to give to CP Optimizer an initial feasible solution如何给 CP Optimizer 一个初始可行的解决方案
【发布时间】:2020-09-15 23:44:18
【问题描述】:

我需要解决一个硬调度问题。为此,我使用贪婪启发式获得了一个初始可行的解决方案。这种启发式方法为我提供了每台机器上每项作业的开始时间。

如何使用此初始解决方案初始化 CP Optimizer? (“热启动”)

提前致谢

【问题讨论】:

    标签: cplex cp ilog cp-optimizer


    【解决方案1】:

    使用 opl Cplex CPo,您可以在

    中查看示例

    https://github.com/AlexFleischerParis/zooopl/blob/master/zoowarmstartapicpo.mod

    //我们看到了如何在 CPLEX 中热启动。让我们看看如何在 CPLEX 中对 CPO 做同样的事情:

        using CP;
    
        int nbKids=300;
    
        // a tuple is like a struct in C, a class in C++ or a record in Pascal
        tuple bus
        {
         key int nbSeats;
         float cost;
        }
    
    
        // This is a tuple set
        {bus} pricebuses=...;
    
        // asserts help make sure data is fine
        assert forall(b in pricebuses) b.nbSeats>0;assert forall(b in pricebuses) b.cost>0;
    
    
        // To compute the average cost per kid of each bus
        // you may use OPL modeling language
    
        float averageCost[b in pricebuses]=b.cost/b.nbSeats;
    
        // Let us try first with a naïve computation, use the cheapest bus
    
        float cheapestCostPerKid=min(b in pricebuses) averageCost[b];
        int cheapestBusSize=first({b.nbSeats | b in pricebuses : averageCost[b]==cheapestCostPerKid});
        int nbBusNeeded=ftoi(ceil(nbKids/cheapestBusSize));
    
        float cost0=item(pricebuses,<cheapestBusSize>).cost*nbBusNeeded;
        execute DISPLAY_Before_SOLVE
        {
          writeln("The naïve cost is ",cost0);
          writeln(nbBusNeeded," buses ",cheapestBusSize, " seats");
          writeln();
        }
    
        int naiveSolution[b in pricebuses]=
          (b.nbSeats==cheapestBusSize)?nbBusNeeded:0;
    
    
        // decision variable array
        dvar int+ nbBus[pricebuses];
    
        // objective
        minimize
          sum(b in pricebuses) b.cost*nbBus[b];
             
        // constraints
        subject to
        {
          sum(b in pricebuses) b.nbSeats*nbBus[b]>=nbKids;
        }
    
        float cost=sum(b in pricebuses) b.cost*nbBus[b];
        execute DISPLAY_After_SOLVE
        {
         writeln("The minimum cost is ",cost);
         for(var b in pricebuses) writeln(nbBus[b]," buses ",b.nbSeats, " seats");
    
        }
    
    
        main
        {
        thisOplModel.generate();
    
        // Warm start the naïve solution
        var sol=new IloOplCPSolution();
        for(var b in thisOplModel.pricebuses)
           sol.setValue(thisOplModel.nbBus[b],thisOplModel.naiveSolution[b]);
        cp.setStartingPoint(sol);
    
        cp.solve();
        thisOplModel.postProcess();
        }
    /*
    .dat
     
        pricebuses={<40,500>,<30,400>};
    which gives
     
        The naïve cost is 4000
        8 buses 40 seats
        The minimum cost is 3800
        6 buses 40 seats
        2 buses 30 seats
    and in the log we see
     
        ! ----------------------------------------------------------------------------
         ! Minimization problem - 2 variables, 1 constraint
         ! Using starting point solution
         
         */
    

    还有时间安排

    using CP;
    
    range r = 1..10;
    dvar interval x[r] size 1;
    
    dvar interval y[r] size 1;
    // The following array of values (defined as data) will be used as  
    // a starting solution to warm-start the CP Optimizer search.
    
    int values[i in r] = (i==5)? 10 : 0;     
    
    minimize sum( i in r ) startOf(x[i]) + sum( j in r ) startOf(y[j]);
    subject to
    {
    ctSum: sum( i in r ) startOf(x[i]) >= 10;
    forall( j in r ) ctEqual: startOf(y[j]) == j;
    }   
    
    execute
    {
    for(i in r) write(Opl.startOf(x[i])," ");
    writeln();
    }
    
    main
    {
    thisOplModel.generate();
    var sol=new IloOplCPSolution();
    
    for(var i=1;i<=10;i++) sol.setStart(thisOplModel.x[i],thisOplModel.values[i]);
    cp.solve();
    thisOplModel.postProcess();
    cp.setStartingPoint(sol);
    cp.solve();
    thisOplModel.postProcess();
    }
    

    【讨论】:

      【解决方案2】:

      这在 CP 中称为“起点”,在手册中的 CP Optimizer > CP Optimizer C++ API Reference Manual > Concepts > Starting point in CP Optimizer 中进行了说明。要使用的函数是IloCP::setStartingPoint(IloSolution)

      在 CPLEX 发行版中,您在 plantlocation.cppsched_goalprog.cpp 示例及其其他 API 的变体中有这方面的示例。

      【讨论】:

      • 我的模型中有以下变量:dvar interval itvs[j in Jobs][m in Mchs] size OpDurations[j][m];我想为@987654326 设置一些先前计算的值作为起点@您能指导我解决这个疑问吗?提前谢谢你。
      猜你喜欢
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2010-09-05
      相关资源
      最近更新 更多