Decision Optimization

Decision Optimization

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


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  How to compute geodesic distance within OPL ?

    Posted 09/21/17 06:38 AM

    Geodesic distances are not always the ultimate distance but they often help.

    Let me share some code that compute those geodesic distances:

    .mod

    tuple point {
    float latitude;
    float longitude;
    };

    float PI;

    execute
    {
    PI=Math.PI;
    }

    {point} points = ...;

    {point} pointsRadian={<p.latitude*PI/180,p.longitude*PI/180> | p in points};

    float  earthRadiusKms = 6376.5;


    // Cities
    int     n       = card(points);
    range   Cities  = 1..n;

    point pRadian[c in Cities]=item(pointsRadian,c-1);

    // Edges -- sparse set
    tuple       edge        {int i; int j;}
    setof(edge) Edges       = {<i,j> | ordered i,j in Cities};
    float         dist[Edges];

    execute compute_distances
    {
    writeln(n," points");

    for(e in Edges)
    {
      dist[e]=earthRadiusKms*Math.acos(
      Math.sin(pRadian[e.i].latitude)*Math.sin(pRadian[e.j].latitude)+
      Math.cos(pRadian[e.i].latitude)*Math.cos(pRadian[e.j].latitude)*
      Math.cos(pRadian[e.j].longitude-pRadian[e.i].longitude));
     
      writeln("distance from ",e.i," to ",e.j," = ",dist[e]);
     
    }
    }

    .dat

    points = {

    <90.00, 90.00>,
    <45.00, 45.00>,
    <30,20>,
    <20,-20>
    <45,0>,
    <-90,0>,
    <0,-90>,
    <90.00, 0.00>,
    <71.17, -156.47>,
    <64.51, -147.43>,
    <61.13, -149.53>,


    };

    which gives

    11 points
    distance from 1 to 2 = 5008.091388904
    distance from 1 to 3 = 6677.455185205
    distance from 1 to 4 = 7790.364382739
    distance from 1 to 5 = 5008.091388904
    distance from 1 to 6 = 20032.365555615
    distance from 1 to 7 = 10016.182777808
    distance from 1 to 8 = 0
    distance from 1 to 9 = 2095.608018957
    distance from 1 to 10 = 2836.805544515
    distance from 1 to 11 = 3212.968853281
    distance from 2 to 3 = 2748.227646927
    distance from 2 to 4 = 6509.319132227
    distance from 2 to 5 = 3494.503141191
    distance from 2 to 6 = 15024.274166711
    distance from 2 to 7 = 13354.91037041
    distance from 2 to 8 = 5008.091388904
    distance from 2 to 9 = 6990.683723353
    distance from 2 to 10 = 7796.577300153
    distance from 2 to 11 = 8148.457920375
    distance from 3 to 4 = 4162.273650918
    distance from 3 to 5 = 2417.380052239
    distance from 3 to 6 = 13354.91037041
    distance from 3 to 7 = 11933.658168096
    distance from 3 to 8 = 6677.455185205
    distance from 3 to 9 = 8769.616053004
    distance from 3 to 10 = 9457.100063805
    distance from 3 to 11 = 9846.019348887
    distance from 4 to 5 = 3336.043897524
    distance from 4 to 6 = 12242.001172876
    distance from 4 to 7 = 7929.785501304
    distance from 4 to 8 = 7790.364382739
    distance from 4 to 9 = 9352.971477397
    distance from 4 to 10 = 9614.599355622
    distance from 4 to 11 = 9947.715796963
    distance from 5 to 6 = 15024.274166711
    distance from 5 to 7 = 10016.182777808
    distance from 5 to 8 = 5008.091388904
    distance from 5 to 9 = 6968.154654933
    distance from 5 to 10 = 7518.038417735
    distance from 5 to 11 = 7905.702847421
    distance from 6 to 7 = 10016.182777808
    distance from 6 to 8 = 20032.365555615
    distance from 6 to 9 = 17936.757536658
    distance from 6 to 10 = 17195.560011101
    distance from 6 to 11 = 16819.396702334
    distance from 7 to 8 = 10016.182777808
    distance from 7 to 9 = 9192.24326288
    distance from 7 to 10 = 8525.381590705
    distance from 7 to 11 = 8438.966484735
    distance from 8 to 9 = 2095.608018957
    distance from 8 to 10 = 2836.805544515
    distance from 8 to 11 = 3212.968853281
    distance from 9 to 10 = 830.681781355
    distance from 9 to 11 = 1158.377782719
    distance from 10 to 11 = 390.965210663

    regards

     

    Alex Fleischer

    PS:

    Many how to with OPL at https://www.linkedin.com/pulse/how-opl-alex-fleischer/

    Many examples from a very good book : https://www.linkedin.com/pulse/model-building-oplcplex-alex-fleischer/

    Making optimization simple : https://www.linkedin.com/pulse/making-decision-optimization-simple-alex-fleischer/


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 2.  Re: How to compute geodesic distance within OPL ?

    Posted 10/11/17 05:01 AM

    Originally posted by: gustavgans123


    Hi Alex,

    this is great, thanks for the example.

    I know it might be stupid, but could you help me transform this code into one without using any tuple notation? Or maybe even provide an example without the use of tuples, such that:

    dis[I in N][j in N] = geodesic distance betw. node I and node j.

     

    I got this far:

    int n = ...;

    {int} N = asSet(0..n);

    float latitude[i in N] = ...;

    float longitude[i in N] = ...;

    float PI;

    execute

    {

    PI=Math.PI;

    }

    float pointsRadianlat[i in N] = latitude[i]*PI/180;

    float pointsRadianlong[i in N] = longitude[i]*PI/180;

    float earthRadiusKms = 6376.5;

     

    Introducing tuples in my model now would mean, that I have to basically change all the notation.

     

    Thanks a lot,

    gustav


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 3.  Re: How to compute geodesic distance within OPL ?

    Posted 10/11/17 12:11 PM

    Hi,

    then you could write

    .mod

    int n = ...;

    {int} N = asSet(1..n);

    float latitude[N] = ...;

    float longitude[N] = ...;

    float dist[N][N];

    float PI;

    execute
    {
    PI=Math.PI;
    }

    float pointsRadianlat[i in N] = latitude[i]*PI/180;

    float pointsRadianlong[i in N] = longitude[i]*PI/180;

    float earthRadiusKms = 6376.5;

    execute compute_distances
    {
    writeln(n," points");

    for(a in N) for(b in N)
    {
      dist[a][b]=earthRadiusKms*Math.acos(
      Math.sin(pointsRadianlat[a])*Math.sin(pointsRadianlat[b])+
      Math.cos(pointsRadianlat[a])*Math.cos(pointsRadianlat[b])*
      Math.cos(pointsRadianlong[b]-pointsRadianlong[a]));
     
      writeln("distance from ",a," to ",b," = ",dist[a][b]);
     
    }
    }

    .dat

    n=11;

        latitude = [

        90.00,
        45.00,
        30,
        20,
        45,
        -90,
        0,
        90.00,
        71.17,
        64.51,
        61.13,


        ];
        
        longitude = [

         90.00,
         45.00,
        20,
        -20
        0,
        0,
        -90,
         0.00,
         -156.47,
         -147.43,
         -149.53,


        ];

    which would give

    11 points
    distance from 1 to 1 = 0
    distance from 1 to 2 = 5008.091388904
    distance from 1 to 3 = 6677.455185205
    distance from 1 to 4 = 7790.364382739
    distance from 1 to 5 = 5008.091388904
    distance from 1 to 6 = 20032.365555615
    distance from 1 to 7 = 10016.182777808
    distance from 1 to 8 = 0
    distance from 1 to 9 = 2095.608018957
    distance from 1 to 10 = 2836.805544515
    distance from 1 to 11 = 3212.968853281
    distance from 2 to 1 = 5008.091388904
    distance from 2 to 2 = NaN
    distance from 2 to 3 = 2748.227646927
    distance from 2 to 4 = 6509.319132227
    distance from 2 to 5 = 3494.503141191
    distance from 2 to 6 = 15024.274166711
    distance from 2 to 7 = 13354.91037041
    distance from 2 to 8 = 5008.091388904
    distance from 2 to 9 = 6990.683723353
    distance from 2 to 10 = 7796.577300153
    distance from 2 to 11 = 8148.457920375
    distance from 3 to 1 = 6677.455185205
    distance from 3 to 2 = 2748.227646927
    distance from 3 to 3 = 0
    distance from 3 to 4 = 4162.273650918
    distance from 3 to 5 = 2417.380052239
    distance from 3 to 6 = 13354.91037041
    distance from 3 to 7 = 11933.658168096
    distance from 3 to 8 = 6677.455185205
    distance from 3 to 9 = 8769.616053004
    distance from 3 to 10 = 9457.100063805
    distance from 3 to 11 = 9846.019348887
    distance from 4 to 1 = 7790.364382739
    distance from 4 to 2 = 6509.319132227
    distance from 4 to 3 = 4162.273650918
    distance from 4 to 4 = 0
    distance from 4 to 5 = 3336.043897524
    distance from 4 to 6 = 12242.001172876
    distance from 4 to 7 = 7929.785501304
    distance from 4 to 8 = 7790.364382739
    distance from 4 to 9 = 9352.971477397
    distance from 4 to 10 = 9614.599355622
    distance from 4 to 11 = 9947.715796963
    distance from 5 to 1 = 5008.091388904
    distance from 5 to 2 = 3494.503141191
    distance from 5 to 3 = 2417.380052239
    distance from 5 to 4 = 3336.043897524
    distance from 5 to 5 = NaN
    distance from 5 to 6 = 15024.274166711
    distance from 5 to 7 = 10016.182777808
    distance from 5 to 8 = 5008.091388904
    distance from 5 to 9 = 6968.154654933
    distance from 5 to 10 = 7518.038417735
    distance from 5 to 11 = 7905.702847421
    distance from 6 to 1 = 20032.365555615
    distance from 6 to 2 = 15024.274166711
    distance from 6 to 3 = 13354.91037041
    distance from 6 to 4 = 12242.001172876
    distance from 6 to 5 = 15024.274166711
    distance from 6 to 6 = 0
    distance from 6 to 7 = 10016.182777808
    distance from 6 to 8 = 20032.365555615
    distance from 6 to 9 = 17936.757536658
    distance from 6 to 10 = 17195.560011101
    distance from 6 to 11 = 16819.396702334
    distance from 7 to 1 = 10016.182777808
    distance from 7 to 2 = 13354.91037041
    distance from 7 to 3 = 11933.658168096
    distance from 7 to 4 = 7929.785501304
    distance from 7 to 5 = 10016.182777808
    distance from 7 to 6 = 10016.182777808
    distance from 7 to 7 = 0
    distance from 7 to 8 = 10016.182777808
    distance from 7 to 9 = 9192.24326288
    distance from 7 to 10 = 8525.381590705
    distance from 7 to 11 = 8438.966484735
    distance from 8 to 1 = 0
    distance from 8 to 2 = 5008.091388904
    distance from 8 to 3 = 6677.455185205
    distance from 8 to 4 = 7790.364382739
    distance from 8 to 5 = 5008.091388904
    distance from 8 to 6 = 20032.365555615
    distance from 8 to 7 = 10016.182777808
    distance from 8 to 8 = 0
    distance from 8 to 9 = 2095.608018957
    distance from 8 to 10 = 2836.805544515
    distance from 8 to 11 = 3212.968853281
    distance from 9 to 1 = 2095.608018957
    distance from 9 to 2 = 6990.683723353
    distance from 9 to 3 = 8769.616053004
    distance from 9 to 4 = 9352.971477397
    distance from 9 to 5 = 6968.154654933
    distance from 9 to 6 = 17936.757536658
    distance from 9 to 7 = 9192.24326288
    distance from 9 to 8 = 2095.608018957
    distance from 9 to 9 = 0
    distance from 9 to 10 = 830.681781355
    distance from 9 to 11 = 1158.377782719
    distance from 10 to 1 = 2836.805544515
    distance from 10 to 2 = 7796.577300153
    distance from 10 to 3 = 9457.100063805
    distance from 10 to 4 = 9614.599355622
    distance from 10 to 5 = 7518.038417735
    distance from 10 to 6 = 17195.560011101
    distance from 10 to 7 = 8525.381590705
    distance from 10 to 8 = 2836.805544515
    distance from 10 to 9 = 830.681781355
    distance from 10 to 10 = 0
    distance from 10 to 11 = 390.965210663
    distance from 11 to 1 = 3212.968853281
    distance from 11 to 2 = 8148.457920375
    distance from 11 to 3 = 9846.019348887
    distance from 11 to 4 = 9947.715796963
    distance from 11 to 5 = 7905.702847421
    distance from 11 to 6 = 16819.396702334
    distance from 11 to 7 = 8438.966484735
    distance from 11 to 8 = 3212.968853281
    distance from 11 to 9 = 1158.377782719
    distance from 11 to 10 = 390.965210663
    distance from 11 to 11 = 0

    regards


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 4.  Re: How to compute geodesic distance within OPL ?

    Posted 10/12/17 03:14 AM

    Originally posted by: gustavgans123


    Perfect, Thanks a lot Alex! Really appreciate your time and help!!

    BR


    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 5.  Re: How to compute geodesic distance within OPL ?

    Posted 10/12/17 03:36 AM