Decision Optimization

Decision Optimization

Delivers prescriptive analytics capabilities and decision intelligence to improve decision-making.


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  no solution

    Posted 08/22/19 08:31 AM

    Originally posted by: reru90


    I have a CPLEX model. When I solve it, I get no solution.I don't know, what ist wrong with this model. Please help me find the solution.

     int Patientenanzahl = ...;
     range Patienten = 1..Patientenanzahl;
     range PatientenundDepots = 0..(Patientenanzahl+1);
     int Mitarbeiteranzahl = ...;
     range Mitarbeitermenge = 1..Mitarbeiteranzahl;
     int p = ...; //PickUp Punkte
     int d = ...; // Delivery Punkte
     {string} Stationen = ...;
     int kapazitaet [Mitarbeitermenge] = ...;
     int Nachfrage[Patienten] = ...; 
     int Servicezeit[Patienten] = ...; // die Zeit, in der Mitarbeiter ankommt plus bis er zum DeliveryLocation losfährt
     int Distanz[PatientenundDepots][PatientenundDepots] =...; //Fahrzeiten zwischen den Stationen in Minuten
     int frueAbholzeit[Patienten] = ...; // frühste Abholzeit
     int spaetAbholzeit[Patienten] = ...; // spätste Abholzeit
    
    
     
     
    // Entscheidungsvariablen
    dvar boolean x[Mitarbeitermenge][PatientenundDepots][PatientenundDepots]; // 1, wenn das Fahrzeug k von i direkt zu j anfährt
    dvar int StartServicezeit[Mitarbeitermenge][PatientenundDepots]; // (s) die Zeit in der Mitarbeiter zum Patient i ankommt, welche nach j transportiert werden muss.
    
    //Zielfunktion
    minimize sum(k in Mitarbeitermenge, i,j in PatientenundDepots)(Distanz[i][j]*x[k][i][j]);
    
    //verbieten aus einem Depot bzw. Patient zu gleichem zu fahren
    subject to {
    forall(i in PatientenundDepots, k in Mitarbeitermenge)
       x[k][i][i] == 0;
              
            // Jeder Patient wird nur einmal besucht
    forall(j in Patienten)
                    sum(k in Mitarbeitermenge, i in PatientenundDepots)
            x[k][i][j] == 1;
    
     // Nachdem Jeder Mitarbeiter den Patient i besucht hat, muss den Ort verlassen, um den Ort j zu erreichen
    forall(k in Mitarbeitermenge, h in Patienten)
      sum(i in PatientenundDepots)x[k][i][h] - sum(j in PatientenundDepots)x[k][h][j] == 0;
             
              // Jedes Fahrzeug muss einmal vom Startdepot starten
    forall(k in Mitarbeitermenge)
               sum(i in PatientenundDepots)  
             x[k][0][i] == 1;
            
            //Jeder Mitarbeiter muss Enddeport einmal erreichen
    forall(k in Mitarbeitermenge)
               sum(i in PatientenundDepots)
             x[k][i][Patientenanzahl+1] == 1;
    
     //Zeitfenster 
    forall(i, j in Patienten, k in Mitarbeitermenge)
                frueAbholzeit[i] <= x[k][i][j]*StartServicezeit[k][i];
               
    forall(i, j in Patienten, k in Mitarbeitermenge)
      x[k][i][j]*StartServicezeit[k][i] <= spaetAbholzeit[i];          
             
    //Kapazität des Mitarbeiters k muss nicht überschritten werden
    forall(k in Mitarbeitermenge)
            sum(i in Patienten)(Nachfrage[i])*
            sum(i, j in PatientenundDepots)(x[k][i][j]) <= kapazitaet[k];
    };     
    
             execute DISPLAY {
        writeln("Ergebnisse: ");
            for(var k in Mitarbeitermenge)
                    for(var i in PatientenundDepots)
                            for (var j in PatientenundDepots)
                                    if(x[k][i][j] == 1)
                                            writeln("Mitarbeiter ", k, " von ", i, " zu ", j);
    }
    

     


    #CPLEXOptimizers
    #DecisionOptimization


  • 2.  Re: no solution

    Posted 08/22/19 08:39 AM

    Originally posted by: reru90


    hier ist the DAT File for this model:

     

    SheetConnection Daten ("Daten VRPTW.xlsx");
    Patientenanzahl = 7;
    Mitarbeiteranzahl = 7;
    Stationen = {"StartDepot", "A", "B", "C", "D", "E", "F", "G", "Enddepot"};
    p from SheetRead(Daten, "Aufträge!C2:C8");
    d from SheetRead(Daten, "Aufträge!D2:D8");
    Servicezeit = [ 2, 3, 4, 5, 2, 4, 3];
    kapazitaet = [ 100, 100, 100, 100, 100, 100, 100 ];
    frueAbholzeit =  [ 24, 20, 13, 14, 34, 87, 80 ];
    spaetAbholzeit = [ 35, 25, 15, 23, 46, 102, 89 ];
       
    Nachfrage from SheetRead(Daten, "Aufträge!I2:I8");

    Distanz = [ 
           [ 0, 3, 6, 5, 2, 6, 3, 4, 100], 
           [ 3, 0, 3, 5, 4, 7, 4, 2, 3 ], 
           [ 6, 3, 0, 2, 6, 3, 6, 8, 6 ], 
           [ 5, 5, 2, 0, 5, 5, 9, 5, 5 ], 
           [ 2, 4, 6, 5, 0, 2, 5, 8, 2 ], 
           [ 6, 7, 3, 5, 2, 0, 6, 4, 6 ], 
           [ 3, 4, 6, 9, 5, 6, 0, 2, 8 ],
           [ 4, 2, 8, 5, 8, 4, 2, 0, 3 ], 
           [ 100, 3, 6, 5, 2, 6, 8, 3, 0 ]];


    #CPLEXOptimizers
    #DecisionOptimization


  • 3.  Re: no solution

    Posted 08/23/19 07:06 AM

    What exactly do you mean by "I get no solution"? Is the model claimed infeasible or do you hit time/memory limits before CPLEX can find an optimal solution?

    In the first case, did you try using the conflict refiner and look at the conflict? If you label all your constraints then the IDE will automatically invoke the conflict refiner and show a minimal conflict. This will probably tell what is wrong with your model.

    If you just hit some resource limit then try changing one of the gap parameters, the time or memory limit, ...

    In any case, to look deeper into your issue we would not only need the .mod and .dat file but also the Excel file that is referenced from the .dat.


    #CPLEXOptimizers
    #DecisionOptimization


  • 4.  Re: no solution

    Posted 08/25/19 05:31 PM

    Originally posted by: T_O


    I guess you mean

    forall(i, j in Patienten, k in Mitarbeitermenge)
            x[k][i][j] == 0 || frueAbholzeit[i] <= StartServicezeit[k][i];
    
    forall(i, j in Patienten, k in Mitarbeitermenge)
            x[k][i][j] == 0 || StartServicezeit[k][i] <= spaetAbholzeit[i];   
    

    instead of

    forall(i, j in Patienten, k in Mitarbeitermenge)
            frueAbholzeit[i] <= x[k][i][j]*StartServicezeit[k][i];
    
    forall(i, j in Patienten, k in Mitarbeitermenge)
            x[k][i][j]*StartServicezeit[k][i] <= spaetAbholzeit[i];
    

    Best regards,
    Thomas


    #CPLEXOptimizers
    #DecisionOptimization


  • 5.  Re: no solution

    Posted 08/26/19 08:32 AM

    Originally posted by: reru90


    CPLEX has accepted the solution. Thank you very much. I think the problem was in the lines like T_O has written

     


    #CPLEXOptimizers
    #DecisionOptimization