No account yet?

You need to enable javascript in your browser to see this page working correcly!

Centers-of-Gravity Calculator

Centers-of-Gravity Calculator is an online supply chain network design tool that determines Centers-of-Gravity warehouse locations that come with minimal outbound and inbound transport costs*. Outcomes are displayed on a map that you can download. You can adjust outcomes by predefining warehouse locations, limiting movement ranges, limiting warehouse capacities, forcing customer assignments, or grouping customers. Multiple large companies - including DHL - have been using this calculator and its prior versions for several years.
* In fact, this calculator minimizes the sum of weighted as-the-crow-flies-distances. Its algorithms are described in full detail, below. It runs much faster than Excel Solver (test 2018) and Llamasoft (test 2017), producing equal results.

“We have been using this CoG Calculator for years. It’s better fit for purpose than the other tools we use(d) for this and we like the way Stelling Consulting is constantly improving the tool to make it even better.”

Jeroen Martens
Head of Transport Solutions Design MLE MEA &
Network Design & Supply Chain Consulting Global Practice Lead
DHL Supply Chain
Number of Centers-of-Gravity / warehouses 
Present best solution out of N runs, with N is
i
Show display settings
Apply constraints / optional data

Predefined warehouse locations

Capacity limits

Fixed customer-warehouse assignments

Fixed supplier-warehouse assignments

Customer groups

i

Supply

i

Optional inbound transport parameters
Supplier transport costs ratio
i
Help me calculate my supplier transport costs ratio
 
Each supplier delivers to its closest (or fixed) warehouse only (local-for-local)
i

Each supplier delivers to each warehouse
i

Each supplier delivers to each warehouse via its closest (or fixed) warehouse (2-echelon)

i

 
Screen view
Show login form, intro, info
Show settings
 
Calculate Centers-of-Gravity
Save
Load
 
About Save and Load: your data and settings will be saved in and loaded from local browser memory (not a server) if you press the button. You can reload if you log in again later. → not functional in demo mode.

Run

 

Current value

0
i

Best value

0

Run scores chart

i
 Distance (km)  Demand reached 
 


You have not logged in: demo mode activated
This demo version is fully functional, except for being able to enter your own supply chain data. Demo data, as shown below, has been loaded. Login or create a paid account via the top of this page, if you want to run with your own supply chain data.

About the demo data, and all run options
The case contains 590 customer locations throughout Europe. The demo starts with vife Centers-of-Gravity. There are two predefined warehouses, one in the UK (Birmingham, cannot move) and one in Spain (Madrid, may move within 200km range). Both locations can move freely if "predefined warehouse locations" is unchecked. They also have certain capacities, which are ignored if you uncheck "capacity limits". Customers in UK/Ireland have been assigned to the Birmingham warehouse, customers in Spain/Portugal to the Madrid warehouse. These assignments are ignored if you uncheck "fixed customer-warehouse assignments". All customers have a group set equal to their country 2-digit code, effectively meaning all customers of a country are assigned to a single warehouse only (no country is being delivered from multiple warehouses), unless you uncheck "customer groups". All supply in the demo case comes from harbour Rotterdam, The Netherlands, and from Bologna, Italy, so Centers-of-Gravity will tend to move into those directions. The higher the supplier transport costs ratio, the more they tend towards Rotterdam or Bologna. Unless you uncheck "supply", in which case the Centers-of-Gravity are based on demand only. The more freedom - initially zero in the demo case - the more solutions may start tot differ from each other, as depicted in the run score chart. You add more freedom, by simply unchecking constraints. Of course, you can also adjust the number of warehouses.

Though not mandatory, it is advised to express quantities as rounded numbers without thousands or decimal separators, and to filter out all records with a zero quantity beforehand.
Use decimal point - not decimal comma - as decimal separator. Any commas in your data will be removed automatically.
YOUR INPUT: CUSTOMER LOCATIONS (semicolon or tab separated)
Latitude;Longitude;Demand_quantity;Warehouse_ID (optional);Group (optional)
41.1533;20.1683;3430;;AL
46.6333;14.3128;4270;;AT
46.9894;15.5817;4200;;AT
47.252;11.42;4690;;AT
47.5784;12.7305;3550;;AT
47.9911;13.8878;11530;;AT
48.0671;13.1775;3300;;AT
48.2025;16.4186;4600;;AT
48.2049;16.2734;6100;;AT
48.2297;16.4692;2620;;AT
48.3656;13.9771;3340;;AT
43.3319;17.7513;5900;;BA
43.8784;18.3593;2460;;BA
50.2458;4.8519;2720;;BE
50.3753;4.3819;3420;;BE
50.4172;4.447;3220;;BE
50.4555;3.9662;3500;;BE
50.461;4.8498;2940;;BE
50.4797;4.1698;4600;;BE
50.588;5.8602;2840;;BE
50.5882;4.3253;3120;;BE
50.59;3.3922;2960;;BE
50.5942;5.4331;3200;;BE
50.5978;6.1325;3280;;BE
50.6473;5.5832;6550;;BE
50.7237;4.5543;3140;;BE
50.7416;3.2238;2420;;BE
50.7886;4.8612;2980;;BE
50.8137;5.2089;2460;;BE
50.8185;3.2785;2440;;BE
50.849;4.4297;5360;;BE
50.8521;5.6878;3520;;BE
50.8832;4.3551;9200;;BE
50.8903;4.7381;8200;;BE
50.8989;4.391;3200;;BE
50.9316;5.3368;4880;;BE
50.9406;3.1181;6900;;BE
50.9439;4.0442;2920;;BE
50.9676;5.4886;3160;;BE
50.9836;4.821;3280;;BE
50.9894;3.5106;3380;;BE
51.0077;3.368;3080;;BE
51.0293;4.094;2540;;BE
51.0353;4.4665;3280;;BE
51.0532;3.6307;9480;;BE
51.12;4.5734;2780;;BE
51.1462;4.3383;4120;;BE
51.16;4.8277;3440;;BE
51.1695;4.1647;4240;;BE
51.2062;5.3798;2480;;BE
51.212;4.4686;3670;;BE
51.2147;2.919;3280;;BE
51.2211;4.3664;3130;;BE
51.2329;3.2118;3610;;BE
51.2384;5.1949;3280;;BE
51.2706;4.5028;4450;;BE
51.3369;3.3234;3850;;BE
51.3531;4.771;2780;;BE
42.687;23.3273;4660;;BG
42.7266;23.3158;18640;;BG
53.1232;26.5796;7000;;BY
46.0338;8.9719;2940;;CH
46.1258;7.2274;2620;;CH
46.3407;6.1974;3670;;CH
46.5902;6.6716;4600;;CH
46.9374;7.4345;2700;;CH
46.96;9.0552;5800;;CH
46.9652;8.2183;2640;;CH
47.1921;7.5615;3360;;CH
47.3092;7.6031;4560;;CH
47.3475;9.4081;2520;;CH
47.3776;8.5381;5900;;CH
47.4036;8.0374;2820;;CH
47.5567;7.5979;3730;;CH
47.5777;9.0899;3340;;CH
35.0309;33.1374;5960;;CY
49.1812;16.6769;2520;;CZ
49.8397;18.3248;2800;;CZ
49.886;16.471;12610;;CZ
49.8879;14.6555;5000;;CZ
50.0446;14.5616;7790;;CZ
50.1368;14.4601;3000;;CZ
50.224;14.0776;2840;;CZ
47.7487;10.464;2420;;DE
47.8441;12.2004;4060;;DE
47.8484;11.2849;4480;;DE
47.8948;8.0721;3700;;DE
47.9083;9.5446;2560;;DE
47.9821;8.6801;3240;;DE
48.125;11.6005;7370;;DE
48.1827;11.5495;6400;;DE
48.3254;8.9595;2620;;DE
48.3371;10.8477;4870;;DE
48.4342;12.4117;3240;;DE
48.4461;10.1133;3880;;DE
48.4891;11.5684;3560;;DE
48.7264;13.0673;2800;;DE
48.7557;9.1817;3520;;DE
48.7875;9.8422;4630;;DE
48.8183;9.3529;4300;;DE
48.9686;8.2909;6120;;DE
49.0929;12.3527;7240;;DE
49.2842;9.5062;4300;;DE
49.341;7.1115;3370;;DE
49.3578;10.9545;5520;;DE
49.4069;10.9999;5080;;DE
49.425;11.961;3380;;DE
49.4288;8.9278;2440;;DE
49.4619;8.5093;4750;;DE
49.5131;7.989;4630;;DE
49.7477;8.7663;3260;;DE
49.8457;7.7122;5360;;DE
49.9622;10.0166;15520;;DE
50.0564;9.0616;8740;;DE
50.0891;11.9207;2960;;DE
50.113;11.0084;2500;;DE
50.1152;8.6563;4800;;DE
50.2084;8.1902;4600;;DE
50.3019;7.5317;4840;;DE
50.5261;10.6956;3180;;DE
50.5498;12.4075;2980;;DE
50.6064;6.9274;4900;;DE
50.6781;9.7457;2800;;DE
50.7328;11.7088;4840;;DE
50.7774;13.1232;3940;;DE
50.7986;8.6866;3480;;DE
50.8085;6.2872;4160;;DE
50.9001;6.7587;5900;;DE
50.9315;7.9958;2860;;DE
50.9609;7.3826;5360;;DE
51.1753;6.4773;3520;;DE
51.1773;13.7897;5600;;DE
51.1868;10.8303;4840;;DE
51.2019;14.5207;3280;;DE
51.214;6.8136;4280;;DE
51.2161;9.1977;4360;;DE
51.3013;7.5981;3100;;DE
51.3441;12.9357;3840;;DE
51.4942;8.0154;4630;;DE
51.4967;12.0202;4360;;DE
51.5245;9.9208;3520;;DE
51.532;7.3695;5800;;DE
51.5434;6.3875;7500;;DE
51.5557;7.1372;8980;;DE
51.717;6.5946;2400;;DE
51.7568;14.0347;2780;;DE
51.7898;8.6824;5400;;DE
52.1235;7.4302;4200;;DE
52.1595;8.8232;2760;;DE
52.1875;10.683;4420;;DE
52.2455;14.0142;3250;;DE
52.3179;12.7886;2740;;DE
52.3235;10.099;4060;;DE
52.3851;11.6495;2560;;DE
52.4013;9.6957;5000;;DE
52.4594;13.4892;3220;;DE
52.5117;13.4079;3370;;DE
52.5316;7.7278;5700;;DE
52.5878;13.3392;8560;;DE
52.9493;13.1648;3280;;DE
53.0899;8.8441;3060;;DE
53.2082;9.3574;2500;;DE
53.2934;7.7666;4900;;DE
53.3574;11.4806;3360;;DE
53.456;9.808;3520;;DE
53.5625;9.9914;4540;;DE
53.59;13.3337;3060;;DE
53.6327;10.0874;7780;;DE
53.955;10.956;6050;;DE
54.0318;12.4273;4570;;DE
54.3167;9.8918;3550;;DE
54.3256;9.1257;3340;;DE
55.6147;12.3188;7300;;DK
55.6689;12.55;3250;;DK
59.2217;24.187;6810;;EE
35.2931;-2.9492;2420;Madrid;ES
35.8917;-5.3305;3000;Madrid;ES
36.1408;-5.3536;2440;Madrid;ES
36.5295;-5.7554;11200;Madrid;ES
36.8099;-4.6632;12760;Madrid;ES
37.3103;-2.3428;6040;Madrid;ES
37.3968;-3.23;11000;Madrid;ES
37.5034;-6.7991;5800;Madrid;ES
37.5264;-5.5807;14280;Madrid;ES
37.9667;-3.3442;5800;Madrid;ES
37.9718;-4.7691;7300;Madrid;ES
38.073;-1.4702;12160;Madrid;ES
38.3649;-0.4237;18480;Madrid;ES
38.7208;-5.9683;8840;Madrid;ES
38.7359;-1.865;6000;Madrid;ES
38.979;-3.7994;5700;Madrid;ES
39.3672;-0.7361;25920;Madrid;ES
39.6178;2.9067;6920;Madrid;ES
39.7771;-6.2981;4800;Madrid;ES
39.8069;-4.1161;5000;Madrid;ES
39.9488;-2.1217;2880;Madrid;ES
40.2532;-0.1381;5300;Madrid;ES
40.5295;-3.7669;77840;Madrid;ES
40.6066;-0.7299;3320;Madrid;ES
40.6391;-4.9062;2540;Madrid;ES
40.7418;-2.5093;5250;Madrid;ES
40.7762;-6.0096;4690;Madrid;ES
41.0536;0.9218;5000;Madrid;ES
41.1183;-3.9573;3340;Madrid;ES
41.693;-6.1506;3160;Madrid;ES
41.7153;-4.6488;4600;Madrid;ES
41.747;2.0723;57700;Madrid;ES
41.8449;-0.8662;12800;Madrid;ES
42.0671;1.0973;4720;Madrid;ES
42.0734;2.5063;9820;Madrid;ES
42.1097;-0.0637;2960;Madrid;ES
42.1882;-7.5237;5000;Madrid;ES
42.2716;-2.4001;6040;Madrid;ES
42.3387;-3.5794;4520;Madrid;ES
42.3728;-8.3689;8020;Madrid;ES
42.4117;-4.4814;3480;Madrid;ES
42.6085;-1.6054;11160;Madrid;ES
42.63;-5.8945;6850;Madrid;ES
42.8386;-2.7489;4840;Madrid;ES
43.0522;-7.3717;5800;Madrid;ES
43.1264;-3.9952;6100;Madrid;ES
43.1369;-8.4757;15040;Madrid;ES
43.1534;-2.1568;4600;Madrid;ES
43.2274;-2.9412;7930;Madrid;ES
43.254;-5.8255;7320;Madrid;ES
60.1616;24.4844;27040;;FI
42.17;9.0596;2400;;FR
42.6311;2.4388;3520;;FR
43.0339;2.4754;3340;;FR
43.1379;0.164;2700;;FR
43.1855;-0.8778;7150;;FR
43.3118;1.2479;11440;;FR
43.4189;6.295;5440;;FR
43.5424;5.0287;7510;;FR
43.5903;3.363;6760;;FR
43.7836;2.2493;2440;;FR
43.9002;7.1858;10900;;FR
43.951;4.0774;3520;;FR
43.9988;5.216;3790;;FR
44.0016;-0.6842;3300;;FR
44.0659;1.3696;2520;;FR
44.2961;2.6416;2920;;FR
44.3561;0.4815;3240;;FR
44.7237;5.2495;2480;;FR
44.8705;-0.4731;15430;;FR
45.1283;0.7113;2760;;FR
45.2843;5.5725;4600;;FR
45.3313;1.8835;3520;;FR
45.4821;6.4061;2960;;FR
45.6645;0.251;2400;;FR
45.707;-0.6045;3160;;FR
45.7517;4.2417;5480;;FR
45.7648;3.1922;7250;;FR
45.8667;4.7158;8040;;FR
45.9005;1.2659;3640;;FR
46.0596;5.4672;2520;;FR
46.0701;6.4298;3160;;FR
46.3615;3.1238;2760;;FR
46.475;-0.3132;3220;;FR
46.5871;0.5476;3140;;FR
46.6602;4.5432;2800;;FR
46.6798;-1.3315;3400;;FR
46.7656;5.7251;3080;;FR
46.8094;1.5497;3520;;FR
47.0122;2.4347;2680;;FR
47.0558;6.3897;3080;;FR
47.2181;0.7264;4360;;FR
47.3432;-1.7285;6680;;FR
47.3935;-0.5369;3730;;FR
47.4617;4.8003;4840;;FR
47.6285;6.9587;2760;;FR
47.6607;1.4362;2400;;FR
47.8153;-2.8675;3430;;FR
47.8505;3.6084;3460;;FR
47.867;7.2316;3280;;FR
47.9159;2.2866;4090;;FR
48.0176;0.2363;4330;;FR
48.142;-0.6382;3580;;FR
48.1548;6.3145;3240;;FR
48.1559;-1.6391;9960;;FR
48.2314;-4.069;5840;;FR
48.3211;4.147;3440;;FR
48.4526;-2.7761;4090;;FR
48.4557;1.3917;3020;;FR
48.5286;2.2616;7000;;FR
48.5721;0.0739;2920;;FR
48.5815;7.5971;6350;;FR
48.6138;2.9691;5050;;FR
48.763;1.8421;7840;;FR
48.7731;2.4515;6700;;FR
48.8409;2.235;34540;;FR
48.8608;2.3273;8740;;FR
48.9057;2.4519;10500;;FR
48.9459;5.9818;5760;;FR
48.9684;4.2424;6850;;FR
49.0086;5.3814;3340;;FR
49.0145;6.7953;3250;;FR
49.0663;1.0732;2500;;FR
49.0729;2.1066;6200;;FR
49.0903;-1.3387;3580;;FR
49.0927;-0.3537;3910;;FR
49.4129;2.4279;4600;;FR
49.4657;3.6021;3400;;FR
49.6714;0.9306;5650;;FR
49.9746;2.3059;2980;;FR
50.531;3.1643;14560;;FR
50.5375;2.3571;4750;;FR
41.9186;44.3628;2940;;GE
35.3225;25.0298;3490;;GR
37.5319;23.3407;4760;;GR
37.8935;23.7765;2640;;GR
37.938;23.7179;3360;;GR
37.9867;23.7207;6160;;GR
37.9894;23.7376;9750;;GR
38.0038;23.636;6160;;GR
38.0182;23.8641;4640;;GR
38.0829;23.8314;3300;;GR
38.2264;21.8153;3340;;GR
39.5679;20.8495;3520;;GR
39.5716;22.4681;3020;;GR
40.5811;23.0107;3480;;GR
40.6752;22.9383;3340;;GR
40.6986;23.2985;3700;;GR
40.7725;22.9897;3580;;GR
45.7921;16.0251;4600;;HR
47.4768;19.1392;6220;;HU
47.5492;19.0032;3700;;HU
47.6316;19.3811;4360;;HU
51.8969;-8.4863;7960;Birmingham;IE
52.2523;-7.1272;3520;Birmingham;IE
52.2713;-9.6999;2800;Birmingham;IE
52.6541;-7.2448;2640;Birmingham;IE
52.668;-8.6305;4390;Birmingham;IE
53.2706;-9.0567;4150;Birmingham;IE
53.3498;-6.2603;25990;Birmingham;IE
53.7179;-6.3561;3200;Birmingham;IE
54.2766;-8.4761;2880;Birmingham;IE
36.9078;14.6821;2600;;IT
37.0372;15.0897;3520;;IT
37.4942;14.8494;9080;;IT
37.8751;12.7816;3260;;IT
37.8969;13.6601;3920;;IT
38.0551;14.913;4600;;IT
38.3917;16.1125;2860;;IT
38.9736;16.6502;4560;;IT
39.5872;16.3783;3370;;IT
39.6113;9.0092;6530;;IT
40.164;18.1712;3960;;IT
40.2283;9.0985;2460;;IT
40.4187;15.151;4510;;IT
40.5298;15.8913;3120;;IT
40.5583;17.2642;4090;;IT
40.6411;17.7568;2680;;IT
40.7877;14.4594;9910;;IT
40.8184;8.9029;4390;;IT
40.99;15.0829;2860;;IT
41.0328;16.6632;7930;;IT
41.2059;14.142;2420;;IT
41.2296;14.7779;2540;;IT
41.4621;13.1919;2460;;IT
41.5281;15.5969;4280;;IT
41.6198;13.4899;3320;;IT
41.7225;14.5424;3380;;IT
41.8548;12.5014;27680;;IT
42.1057;14.4617;3480;;IT
42.1738;13.6418;2820;;IT
42.3187;14.0083;3240;;IT
42.5055;11.9724;3500;;IT
42.6706;12.4041;2820;;IT
42.6787;13.7479;3600;;IT
42.7657;11.2306;2960;;IT
43.0065;13.5481;3480;;IT
43.1048;12.6;4440;;IT
43.163;11.4531;4060;;IT
43.1698;13.2772;3360;;IT
43.4761;10.622;9560;;IT
43.4872;13.2056;2460;;IT
43.5243;11.919;3520;;IT
43.6923;12.6369;3120;;IT
43.8281;11.2139;5400;;IT
43.9536;7.8298;3200;;IT
44.0325;12.1991;7100;;IT
44.2232;9.7594;2920;;IT
44.2582;8.3252;3380;;IT
44.3448;11.9549;4000;;IT
44.442;11.2898;5760;;IT
44.451;9.0572;4640;;IT
44.4667;7.5591;4600;;IT
44.542;10.9065;4330;;IT
44.6048;10.5067;3670;;IT
44.6927;9.9567;3910;;IT
44.7542;11.7822;2560;;IT
44.8288;9.5974;3380;;IT
44.8353;8.1888;2720;;IT
44.8537;8.647;3100;;IT
44.9671;11.8537;3600;;IT
45.0264;9.0348;4850;;IT
45.1356;10.8501;3260;;IT
45.1736;7.379;12700;;IT
45.1926;9.8936;4270;;IT
45.3923;11.7787;6550;;IT
45.422;11.0567;8620;;IT
45.4588;12.4754;4870;;IT
45.4808;9.1197;23500;;IT
45.5522;8.196;4540;;IT
45.6177;11.4649;3820;;IT
45.7362;9.8421;4720;;IT
45.7573;10.3516;7930;;IT
45.7798;13.6245;3120;;IT
45.8094;12.2113;3940;;IT
45.8571;8.7999;4840;;IT
45.8655;8.3388;4760;;IT
45.9305;9.1572;3610;;IT
46.1299;11.202;2760;;IT
46.1357;9.9182;3180;;IT
46.1933;13.0143;7150;;IT
46.2907;12.1646;2780;;IT
46.6645;11.3893;3380;;IT
48.0196;66.9237;6350;;KZ
54.8917;23.9221;2620;;LT
55.1508;22.955;3220;;LT
55.1694;23.8813;4750;;LT
55.9302;25.3559;3480;;LT
56.9874;24.1059;4750;;LV
49.8153;6.1296;3940;;LX
47.0252;28.8509;3440;;MD
41.9876;21.4902;3480;;MK
35.9375;14.3754;6120;;MT
50.8866;5.9619;3440;;NL
51.1076;5.8626;5720;;NL
51.3712;6.1711;2420;;NL
51.4204;5.401;3420;;NL
51.4375;5.4817;3160;;NL
51.4924;4.0378;3120;;NL
51.5886;4.7813;2900;;NL
51.598;5.0923;2440;;NL
51.686;5.3027;13100;;NL
51.8064;5.2585;12640;;NL
51.8471;5.8635;4450;;NL
51.9176;4.4887;3790;;NL
51.9805;5.9059;2680;;NL
52.023;5.0361;4920;;NL
52.024;5.557;2840;;NL
52.0787;4.3172;4870;;NL
52.0879;5.1162;2680;;NL
52.1326;5.2913;13740;;NL
52.1518;5.0451;2700;;NL
52.1554;4.4916;2760;;NL
52.2208;6.8993;2800;;NL
52.2244;5.1764;7900;;NL
52.3081;4.9442;4600;;NL
52.3728;4.9067;6700;;NL
52.5113;6.0903;2760;;NL
52.6307;4.7505;3120;;NL
52.7308;6.4723;5740;;NL
52.7847;6.9009;2860;;NL
53.218;6.5707;2620;;NL
59.7326;10.7913;6450;;NO
59.9342;10.7994;7780;;NO
50.218;19.002;4160;;PL
51.8135;19.445;10450;;PL
52.1077;21.0815;29210;;PL
52.2658;17.6252;2860;;PL
52.282;21.0386;3000;;PL
37.0213;-7.9338;2680;Madrid;PT
38.525;-8.8986;6120;Madrid;PT
38.7367;-9.1339;19060;Madrid;PT
39.2322;-8.686;2620;Madrid;PT
39.3999;-8.2245;2720;Madrid;PT
39.7425;-8.8064;2760;Madrid;PT
40.2108;-8.4221;5640;Madrid;PT
40.6266;-8.6479;2840;Madrid;PT
40.6447;-7.3044;2780;Madrid;PT
40.6592;-7.9147;3460;Madrid;PT
41.1515;-8.6051;10180;Madrid;PT
41.5453;-8.4199;3940;Madrid;PT
44.3902;26.1161;26080;;RO
44.4403;26.0342;5960;;RO
44.4531;26.1286;7580;;RO
44.5207;26.1358;9080;;RO
45.7945;25.2265;3040;;RO
45.9303;24.3044;18170;;RO
44.0165;21.0059;20720;;RS
44.8262;20.4571;9300;;RS
55.8168;37.4999;145900;;RU
57.387;12.2792;22750;;SE
46.0563;14.5047;10090;;SI
46.5565;15.6499;4900;;SI
48.0498;18.2532;3140;;SK
48.0665;17.155;3490;;SK
48.1976;17.1478;4570;;SK
48.674;20.7849;3120;;SK
48.7536;19.2941;5640;;SK
49.1356;21.1867;3190;;SK
36.7307;31.0436;2780;;TR
37.0369;37.2875;2620;;TR
37.2867;35.7333;3040;;TR
37.8698;32.3994;4320;;TR
38.489;27.2261;22280;;TR
38.7097;35.8409;6160;;TR
39.6242;37.3257;2440;;TR
39.9191;32.753;8560;;TR
40.1914;29.0555;2460;;TR
40.3689;36.5431;3260;;TR
40.9071;39.8005;2480;;TR
41.0105;29.0025;55600;;TR
41.2007;36.1377;2900;;TR
48.3794;31.1656;24400;;UA
48.4371;34.9045;4900;;UA
50.4424;30.5221;7780;;UA
49.2044;-2.137;2860;Birmingham;UK
50.4536;-3.7099;2960;Birmingham;UK
50.4769;-4.4283;4040;Birmingham;UK
50.8499;-0.9419;19360;Birmingham;UK
50.8647;-0.1239;2940;Birmingham;UK
50.9034;-3.7971;2820;Birmingham;UK
50.9553;-1.3683;4090;Birmingham;UK
51.0893;-0.2995;3180;Birmingham;UK
51.097;0.5201;2840;Birmingham;UK
51.1703;-0.7554;6450;Birmingham;UK
51.3326;-0.3905;3440;Birmingham;UK
51.3775;0.0853;9240;Birmingham;UK
51.4156;0.2693;2480;Birmingham;UK
51.4249;-2.6571;3160;Birmingham;UK
51.4389;-0.4269;3460;Birmingham;UK
51.4477;0.0123;2800;Birmingham;UK
51.4535;-0.1893;4960;Birmingham;UK
51.5144;-0.1785;3140;Birmingham;UK
51.5168;-0.1805;3020;Birmingham;UK
51.5313;-0.0258;3100;Birmingham;UK
51.5491;-0.3638;3580;Birmingham;UK
51.5559;-0.1155;2600;Birmingham;UK
51.5678;0.2725;3280;Birmingham;UK
51.5699;-0.1035;3280;Birmingham;UK
51.5805;-0.2073;3910;Birmingham;UK
51.5844;-0.3479;4120;Birmingham;UK
51.6029;0.0771;3360;Birmingham;UK
51.622;-3.3992;8700;Birmingham;UK
51.6633;-0.3879;2740;Birmingham;UK
51.7784;-0.3156;8840;Birmingham;UK
51.7924;0.4802;3440;Birmingham;UK
51.8347;-1.2995;3910;Birmingham;UK
51.8808;-4.4348;2780;Birmingham;UK
51.9679;0.8749;2560;Birmingham;UK
51.9687;-0.153;2660;Birmingham;UK
52.0941;-0.6851;48300;Birmingham;UK
52.2252;0.2378;2400;Birmingham;UK
52.273;-0.8661;3060;Birmingham;UK
52.3304;-1.4821;2800;Birmingham;UK
52.3767;-1.8368;3520;Birmingham;UK
52.4658;-1.9879;3420;Birmingham;UK
52.4664;-1.8886;32500;Birmingham;UK
52.6388;-1.0236;4720;Birmingham;UK
52.6639;1.2331;14430;Birmingham;UK
52.7268;0.128;3260;Birmingham;UK
52.9482;-3.8144;12840;Birmingham;UK
53.0054;-0.801;3100;Birmingham;UK
53.2034;-3.0312;3340;Birmingham;UK
53.2582;-1.4047;2800;Birmingham;UK
53.3608;-1.4674;2600;Birmingham;UK
53.374;-2.5496;2720;Birmingham;UK
53.4236;-1.4576;3260;Birmingham;UK
53.4301;-1.4092;2420;Birmingham;UK
53.4669;-2.2238;3460;Birmingham;UK
53.51;-2.2427;3280;Birmingham;UK
53.5178;-1.4647;2940;Birmingham;UK
53.5278;-0.6153;2440;Birmingham;UK
53.5478;-2.6538;3400;Birmingham;UK
53.6686;-1.458;11700;Birmingham;UK
53.7526;-0.3007;2760;Birmingham;UK
53.7726;-2.7852;2900;Birmingham;UK
53.8316;-2.9804;3340;Birmingham;UK
53.8482;-2.3786;7000;Birmingham;UK
53.859;-1.5386;3130;Birmingham;UK
53.9762;-2.0178;5920;Birmingham;UK
54.1184;-0.7891;3220;Birmingham;UK
54.5486;-1.1267;5760;Birmingham;UK
54.7576;-2.9054;6200;Birmingham;UK
54.8088;-1.7722;2820;Birmingham;UK
54.8533;-1.394;2760;Birmingham;UK
55.2237;-2.0276;6250;Birmingham;UK
55.3781;-3.436;16000;Birmingham;UK
55.4331;-4.509;3020;Birmingham;UK
55.6095;-3.7723;3360;Birmingham;UK
55.7945;-4.2076;6600;Birmingham;UK
55.8453;-4.3112;6500;Birmingham;UK
56.7077;-2.7597;3040;Birmingham;UK
57.2367;-2.7821;2780;Birmingham;UK
57.8682;-4.4448;2620;Birmingham;UK
41.3775;64.5853;2440;;UZ
YOUR OPTIONAL INPUT: SUPPLIER LOCATIONS (semicolon or tab separated)
Latitude;Longitude;Supply_quantity;Warehouse_ID (optional)
YOUR OPTIONAL INPUT: PREDEFINED WAREHOUSE LOCATIONS (semicolon or tab separated)
Warehouse_ID;Latitude;Longitude;Move_limit (km);Capacity (optional)
 

Customer locations: optional fields Warehouse_ID and Group

  • Warehouse_ID: free format, e.g. "Birmingham". To assign a customer permanently to a warehouse enter the Warehouse_ID of a predefined warehouse location.
  • Group: free format, e.g. "UK". All customers with the same Group will be assigned to the same warehouse that comes with the lowest sum of weighted distance for this group of customers.
  • If you specify Warehouse_ID, the customer will be assigned to that warehouse, regardless Group. Leave Warehouse_ID empty if you want to specify Group only.

Supplier locations: optional field Warehouse_ID

  • Warehouse_ID: free format, e.g. "Birmingham". To assign a supplier permanently to a warehouse enter the Warehouse_ID of a predefined warehouse location. It also means this supplier will not assign pro rata customer demand to all warehouses - it overrules that option for this particular supplier.

Predefined warehouse locations: optional

  • You can predefine warehouse locations as fixed locations or as seed locations.
    • Fixed location: set Move_limit to 0 (km). A fixed location cannot move.
    • Seed location: set Move_limit > 0 (km). A seed location may move within its Move_limit (around its specified coordinates).
  • Give each warehouse a Warehouse_ID and use this Warehouse_ID in the customer table if you want to assign customers to a warehouse.
  • Warehouse capacity: limits the amount of demand that can be assigned to a warehouse. Adhering to capacity constraints may ignore customer groupings. Fast greedy algorithm implemented.

Combining both options you can replicate your current network structure, and compare costs of the current structure to costs of alternative structures. Or determine the optimal location of a warehouse given its current customers.


OUTPUT: CENTERS-OF-GRAVITY
Center-of-Gravity_ID;Latitude;Longitude;Demand_quantity_assigned;%_total_demand;Capacity_%
OUTPUT: CUSTOMER ASSIGNMENTS
Latitude;Longitude;Demand_quantity;Warehouse_ID;Group;Center-of-Gravity_ID;Distance (km)
OUTPUT: SUPPLIER ASSIGNMENTS
Latitude;Longitude;Supply_quantity;Warehouse_ID;Center-of-Gravity_ID;Distance (km)


Remarks


  • If you already know you will operate a single warehouse in UK to deliver UK customers only, split your data into 'UK data' and 'mainland Europe data' and run the model for both sets separately.
  • Outcomes may vary, due to initial random locations. Run several times to check if a solution reappears and/or to see alternatives.
  • No restrictions apply in the 'warehouse-moving-process': warehouses may end up in the middle of the sea.


Minimizing transport costs by locating warehouses in demand Centers-of-Gravity


Demand Centers-of-Gravity are those locations that minimize the sum of weighted distances. Weighted distance is the as-the-crow-flies-distance from warehouse to customer multiplied by demand. E.g. if customer A has a demand of 10 and is located 25 km from its warehouse the weighted distance is 250 km. Summing over all customers gives the sum of weighted distances as an indicator for transport costs. It is a relative figure, not an absolute cost figure. The Centers-of-Gravity algorithm minimizes its value by moving warehouses.

Implicit assumption: transport cost = rate/km × distance. So minimal transport kilometers come with minimal transport costs (and minimal Green House Gas emissions). This assumption is partly valid. E.g. parcel rates are distance independent within a country, FTL pallet rate/km is lower than LTL pallet rate (you may adjust demands for this in your input), macro-economic imbalance cause direction-dependent rates, et cetera.

The sum of weighted distances belonging to the current warehouse setup and customer assignments can be compared to the sum of weighted distances of alternative setups. The ratio between those indicators combined with a current customer transport costs figure will provide a rough estimation of how much can be saved on customer transport by changing the supply chain network structure.


Broader Supply Chain Network Design perspective


  • Customer transportation costs are only a (substantial) part of total costs.
  • The optimal number of warehouses and locations are driven by many quantitative and qualitative factors: (future) transport and warehouse rates, tax, demand, lead time requirements, inventories, supply chain risk, law (e.g. in some European countries the warehouse of medical supplies has to be located in the customer country itself).
  • Nevertheless, it is standard practice to run a Centers-of-Gravity-analysis to get an indication how many and what warehouse locations to consider, when doing a supply chain network design project.


How to determine multiple demand Centers-of-Gravity? The multiple Centers-of-Gravity algorithm


Step 1: locate warehouses at a random location (randomly selected customer location)
Step 2: (re)assign each customer to the closest warehouse
Step 3: move each warehouse to the Center-of-Gravity, given its customers (= apply single Center-of-Gravity algorithm as described further below)
Repeat steps 2 and 3 until the goal value does not improve anymore.

Goal value = ∑i Di.Qi
where
Qi is the demand of customer i
Di is the distance between customer i and the warehouse this customer is assigned to.


How to determine a single demand Center-of-Gravity? The single Center-of-Gravity algorithm in full detail (step 3 of the multiple Centers-of-Gravity algorithm)


Initial Center-of-Gravity position
The Center-of-Gravity is initially positioned at:
X_cog = ∑i Xi .Qi / ∑i Qi
Y_cog = ∑i Yi .Qi / ∑i Qi
where
Xi = x-coordinate of customer i
Yi = y-coordinate of customer i
Qi = Demand quantity of customer i

This inital Center-of-Gravity is often presented as optimal, but this is not true! Imagine there are only two customers, customer A with demand 10 at position (0 , 0) and B with demand 1 at position (100 , 0). If the Center-of-Gravity moves a distance d towards customer A the goal value improves 10 × d (closer to A) − 1 × d (further from B) = 9 × d. So the optimal position is on top of customer A, not at (9.09 , 0) as given by the formula. The optimal Center-of-Gravity has a goal value of (0×10+100×1) = 100, whereas the initial Center-of-Gravity at (9.09 , 0) has a much higher value of (9.09×10+90.91×1)=182, so 82% higher costs.
In realistic situations with multiple customers, the relative difference will be much smaller - more like 5% - as can be seen in the visual simulation further below.

Though the goal function contains distances, these are irrelevant when determining the optimal Center-of-Gravity. To optimize 'demand forces' pulling the Center-of-Gravity need to be calculated:
FX = force in x-direction = ∑i (Qi.(X_cog − Xi)/Di) on a flat surface, or ∑i (Qi.cosinus(anglei)) in general
FY = force in y-direction = ∑i (Qi.(Y_cog − Yi)/Di) on a flat surface, or ∑i (Qi.sinus(anglei)) in general.


The above applies for a flat surface. The Earth is a globe. The geographical translation is as follows:
  • Xi = longitude (expressed in radians when used in formula)
  • Yi = latitude (expressed in radians when used in formula)
  • Di is the as-the-crow-flies-distance, the shortest distance over the earth's surface. It is calculated using the Haversine formula (in 3 steps):
    • a = sinus2((latitudei - latitude_cog) /2) + cos(latitude_cog).cos(latitudei).sinus2( (longitudei - longitude_cog) /2)
    • c = 2.atan2(√a, √(1-a))
    • Di = 6371.c  (Earth's mean radius is 6,371 km.)
  • Anglei becomes a spherical angle, called bearing, calculated as
    • bearingi = atan2( sinus(longitudei - longitude_cog).cosinus(latitudei) , cosinus(latitude_cog).sinus(latitudei) - sinus(latitude_cog).cosinus(latitudei).cosinus(lontitudei - longitude_cog)
  • Because bearing compares to an angle between a line and the Y-axis, instead of X-axis:
    • Flat = ∑i (Qi.sinus(bearingi))
    • Flon = ∑i (Qi.cosinus(bearingi))

Moving the Center-of-Gravity in force direction will decrease the sum of weighted distances, if moved the right distance
Moving the warehouse in the x and y direction of the force - first normalized by dividing it by its own length - lowers the goal value. The distance to move in that direction - initiated at a large value - is halved each time the new position would result in a worse goal value (a case of 'overtargetting').

Single Center-of-Gravity algorithm
Step 1: locate Center-of-Gravity at its initial position, and initialize step_distance at a large value (e.g. 100km)
Step 2: update Latitudecog to Latitudecog + Flat / √(Flat2 +Flon2) .step_distance, and update Longitudecog to Longitudecog + Flon / √(Flat2 +Flon2) .step_distance
Step 3: calculate the goal value. If it increases, then move back to the previous position, and update step_distance to step_distance/2.
Repeat steps 2 and 3 until step_distance has become sufficiently small (e.g. 1 meter - in most cases the force will then be close to zero).

This algorithm resembles the gradient descent method with force replacing the gradient.

Visual simulation of the single demand Center-of-Gravity algorithm

Quality of algorithms


The quality of the algorithms of this Centers-of-Gravity Calculator equals that of Excel Solver and Llamasoft.