By LinLin Yang, Principal Data Scientist, Aimpoint Digital, A Gurobi Alliance Premier Service Partner
Effective communication is crucial in business interactions, especially when explaining complex technical ideas to non-technical decision-makers. However, there is often a disconnect between the languages spoken, with technical jargon incomprehensible to those without the same background and training. This results in unproductive meetings and hinders business decision-making.
One particularly challenging communication area is modeling decision-making under uncertainty in operations research. Ironically, most business decisions involve varying degrees of uncertainty in demand, cost, and disruptions. Stochastic programming (SP) is a modeling approach that optimizes decision-making based on quantified probability distributions of uncertainties.
However, explaining stochastic programming to a non-technical audience, who may prefer more deterministic approaches, can take time and effort. Additionally, solving stochastic programming models mathematically is a complex task. After investing significant effort in data collection, model development, and solution analysis to align with business goals, effective communication with stakeholders is crucial to gain support.
Consider the audience when preparing communication, focusing on what will resonate and motivate them. In academia, most people follow a specific sequence for presenting research work and writing journal papers (as depicted in Figure 1). This may involve starting with a literature review, followed by providing the model background, introducing a novel algorithm for solving the model, showcasing its performance improvement, and concluding.
However, in business communications (oral or written), the sequence of narration should be revised and instead focus on the recommendation and the why (Figure 2). Let’s break it down. First, we would begin with the recommendation. Many factors could distract the audience on any given day, and placing key recommendations in the body of communication risks burying them.
Then we need to build trust with our audience. We should consider other models or heuristics that the audience might believe to be promising approaches and explain why our approach is better. The goal here is to help the audience build intuition for the recommendation without having to explain the mathematics behind the model.Â
Once the recommendation is deemed sensible, the last step is understanding the factors driving the solution. By pinpointing parameters with the most significant impact on decision-making, we can better focus the discussion on these parameters.
Depending on the audience’s background and meeting cadence, we expect some variation in the delivery sequence, but in general, it’s better to start with the business recipe outline.
Let’s explore how we can utilize the two sequences to explain a stochastic programming solution to a non-technical audience.
We have an online chocolatier who relies on 3rd party carriers to deliver their online orders. The vendor expects a large order quantity in February and wants to secure a more favorable pre-order delivery contract with the carrier in January. The major decision for the vendor to make is the pre-order delivery quantity.
If the vendor waits until demand is known in February, the retail delivery cost will be $8 per box. On the other hand, the pre-order delivery contract follows a tiered pricing scheme, as shown in Table 1. As the pre-order quantity increases, the marginal quantity gets a further delivery discount per item. If the order quantity is <5 M boxes, the price is the same as the retail cost, and there’s no incentive to pre-order. The downside to the pre-order contract is that it’s use-it-or-lose-it, meaning if the actual demand is lower than the pre-order quantity, there is no refund for the chocolate vendor.
The vendor’s demand forecast for online sales in February follows a normal distribution with expected demand of 10 M boxes and a standard deviation of 2 M boxes (Figure 3).
You can solve the problem with a two-stage stochastic programming model; we generated 100 scenarios based on demand distribution. The result indicates that a pre-order quantity of 7.7 M boxes is optimal.
How would an optimization modeler typically present the solution?
A two-stage stochastic programming model is a mathematical optimization model used to solve decision-making problems under uncertainty. The model consists of two stages: the first stage involves making a near-term decision before knowing the realization of the uncertain parameter, while the second stage involves adjusting the decision based on the actual realization of the uncertain parameter.
Stochastic programming has the benefit that it results in a single solution for the first stage decision instead of a different decision with each scenario (as one would if scenarios with varying quantities of demand are solved independently).
In this case, the first-stage decision is the pre-order contract quantity, and the uncertain parameter is the actual demand. The model takes a general form, as shown in Equation 1.
Where the objective is to minimize the summation of [Equation] – the first stage cost (contract cost) and [Equation]– the expected cost of all 2nd stage scenarios.
The recommendation is to pre-order a delivery contract of 7.7 M boxes.
When comparing the solution against pre-purchasing 10M boxes for delivery, several demand scenarios yield a significant saving of > \$1 per item (as shown in Figure 5), with an expected total saving across all scenarios being \$2.6 M.
There are two main issues with this version of result delivery. First, by starting the communication with an explanation of how stochastic programming works, the modeler risks losing the audience. The assumption of introduction stochastic programming concepts includes:
These assumptions don’t typically hold in business settings.
The second issue is the chart presented to demonstrate stochastic programming benefits is severely underselling the result. While the expected saving is a large positive number, the chart visually tells a different story. The large bar in the [-0.3-0] $/box interval is so much taller than the other bars that the audience would immediately fixate on the significant “negative cost savings.”
This sequence of narration only works well with a technical audience.
Now let’s go through an explanation of the solution the way we would in a business setting.
We recommend purchasing a pre-order contract with 7.7 M boxes. It’s the best solution, as can be seen in Figure 6. Our solution offers a significant cost saving compared to using the average demand as the pre-order quantity. We would not recommend pre-ordering more than 9 M boxes because that would result in a higher cost than waiting for February to pay the retail delivery price after demand is known.
We can take it a step further and examine the sensitivity of the solution. We assume a demand forecast with a standard deviation of 2 M boxes. Figure 7 shows how the confidence level in the forecast (i.e., change in the standard deviation) influences the decision.
In the current scenario, the expected cost with 2 M boxes of standard deviation is not very sensitive to pre-purchase quantity (areas around the dotted line). A slightly higher pre-order quantity will yield a similar expected cost if the forecast has more confidence.
Let’s also get a sense of the extremities. The graph’s left side represents absolute confidence in the demand forecast. In this case, we recommend pre-ordering 10 M boxes (since we’re confident that the demand will be 10 M) to reap the maximum benefit of the pre-order contract discount.
On the other hand, if there’s no confidence in the forecast, we recommend not pre-ordering the delivery contract. The reason for that is the risk is asymmetric – the cost of over-purchasing pre-order quantity (\$8/box) is significantly higher than any discount (<\$2.5/box) from under-purchasing pre-order quantity.
Note that we don’t mention stochastic programming at all in this version of the explanation. Skipping the explanation of how SP works allows the audience to be better focused on the main priority – the pre-order quantity decision. In addition, the explanation of sensitivity gives the audience a better understanding of the forecast assumption’s impact on the decision.
The goal that we aim for is to improve business decision-making with technology. Letting the audience dictate the storytelling and rethinking the communication sequence could simplify and expedite technology adoption.
As we’ve discussed, mathematical optimization is a powerful technology for a wide range of practical use cases. While it is over 70 years old, many organizations are still learning to make the most of its capabilities. That is why Gurobi established the Value Accelerator Program. We want you to be successful with optimization, so start with 12 free hours of guidance with Aimpoint Digital at no cost.
Please check out the Value Accelerator Program to learn more and visit Aimpoint Digital if you want to learn more about how they can support your business. Aimpoint Digital is a Gurobi Alliance Premier Service Partner.
GUROBI NEWSLETTER
Latest news and releases
Choose the evaluation license that fits you best, and start working with our Expert Team for technical guidance and support.
Request free trial hours, so you can see how quickly and easily a model can be solved on the cloud.
Cookie | Duration | Description |
---|---|---|
_biz_flagsA | 1 year | A Cloudflare cookie set to record users’ settings as well as for authentication and analytics. |
_biz_pendingA | 1 year | A Cloudflare cookie set to record users’ settings as well as for authentication and analytics. |
_biz_sid | 30 minutes | This cookie is set by Bizible, to store the user's session id. |
ARRAffinity | session | ARRAffinity cookie is set by Azure app service, and allows the service to choose the right instance established by a user to deliver subsequent requests made by that user. |
ARRAffinitySameSite | session | This cookie is set by Windows Azure cloud, and is used for load balancing to make sure the visitor page requests are routed to the same server in any browsing session. |
BIGipServersj02web-nginx-app_https | session | NGINX cookie |
cookielawinfo-checkbox-advertisement | 1 year | Set by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Advertisement" category . |
cookielawinfo-checkbox-analytics | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics". |
cookielawinfo-checkbox-functional | 11 months | The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional". |
cookielawinfo-checkbox-necessary | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary". |
cookielawinfo-checkbox-others | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other. |
cookielawinfo-checkbox-performance | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance". |
CookieLawInfoConsent | 1 year | Records the default button state of the corresponding category & the status of CCPA. It works only in coordination with the primary cookie. |
elementor | never | This cookie is used by the website's WordPress theme. It allows the website owner to implement or change the website's content in real-time. |
JSESSIONID | session | New Relic uses this cookie to store a session identifier so that New Relic can monitor session counts for an application. |
viewed_cookie_policy | 11 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data. |
Cookie | Duration | Description |
---|---|---|
__cf_bm | 30 minutes | This cookie, set by Cloudflare, is used to support Cloudflare Bot Management. |
_biz_nA | 1 year | Bizible sets this cookie to remember users’ settings as well as for authentication and analytics. |
_biz_uid | 1 year | This cookie is set by Bizible, to store user id on the current domain. |
_hjAbsoluteSessionInProgress | 30 minutes | Hotjar sets this cookie to detect a user's first pageview session, which is a True/False flag set by the cookie. |
_mkto_trk | 2 years | This cookie is set by Marketo. This allows a website to track visitor behavior on the sites on which the cookie is installed and to link a visitor to the recipient of an email marketing campaign, to measure campaign effectiveness. Tracking is performed anonymously until a user self-identifies by submitting a form. |
bcookie | 1 year | LinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser ID. |
bscookie | 1 year | LinkedIn sets this cookie to store performed actions on the website. |
doc_langsBB | 1 year | Documentation system cookie |
doc_version | 1 year | Documentation system cookie |
lang | session | LinkedIn sets this cookie to remember a user's language setting. |
lidc | 1 day | LinkedIn sets the lidc cookie to facilitate data center selection. |
UserMatchHistory | 1 month | LinkedIn sets this cookie for LinkedIn Ads ID syncing. |
whova_client_id | 10 years | Event agenda system cookie |
Cookie | Duration | Description |
---|---|---|
_gat_UA-5909815-1 | 1 minute | A variation of the _gat cookie set by Google Analytics and Google Tag Manager to allow website owners to track visitor behaviour and measure site performance. The pattern element in the name contains the unique identity number of the account or website it relates to. |
Cookie | Duration | Description |
---|---|---|
_an_uid | 7 days | 6Sense Cookie |
_BUID | 1 year | This cookie, set by Bizible, is a universal user id to identify the same user across multiple clients’ domains. |
_ga | 2 years | The _ga cookie, installed by Google Analytics, calculates visitor, session and campaign data and also keeps track of site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognize unique visitors. |
_ga_* | 1 year 1 month 4 days | Google Analytics sets this cookie to store and count page views. |
_gat_UA-* | 1 minute | Google Analytics sets this cookie for user behaviour tracking. |
_gcl_au | 3 months | Provided by Google Tag Manager to experiment advertisement efficiency of websites using their services. |
_gd_session | 4 hours | This cookie is used for collecting information on users visit to the website. It collects data such as total number of visits, average time spent on the website and the pages loaded. |
_gd_visitor | 2 years | This cookie is used for collecting information on the users visit such as number of visits, average time spent on the website and the pages loaded for displaying targeted ads. |
_gid | 1 day | Installed by Google Analytics, _gid cookie stores information on how visitors use a website, while also creating an analytics report of the website's performance. Some of the data that are collected include the number of visitors, their source, and the pages they visit anonymously. |
_hjFirstSeen | 30 minutes | Hotjar sets this cookie to identify a new user’s first session. It stores the true/false value, indicating whether it was the first time Hotjar saw this user. |
_hjIncludedInSessionSample_* | 2 minutes | Hotjar cookie that is set to determine if a user is included in the data sampling defined by a site's daily session limit. |
_hjRecordingEnabled | never | Hotjar sets this cookie when a Recording starts and is read when the recording module is initialized, to see if the user is already in a recording in a particular session. |
_hjRecordingLastActivity | never | Hotjar sets this cookie when a user recording starts and when data is sent through the WebSocket. |
_hjSession_* | 30 minutes | Hotjar cookie that is set when a user first lands on a page with the Hotjar script. It is used to persist the Hotjar User ID, unique to that site on the browser. This ensures that behavior in subsequent visits to the same site will be attributed to the same user ID. |
_hjSessionUser_* | 1 year | Hotjar cookie that is set when a user first lands on a page with the Hotjar script. It is used to persist the Hotjar User ID, unique to that site on the browser. This ensures that behavior in subsequent visits to the same site will be attributed to the same user ID. |
_hjTLDTest | session | To determine the most generic cookie path that has to be used instead of the page hostname, Hotjar sets the _hjTLDTest cookie to store different URL substring alternatives until it fails. |
6suuid | 2 years | 6Sense Cookie |
AnalyticsSyncHistory | 1 month | LinkedIn cookie |
BE_CLA3 | 1 year 1 month 4 days | BrightEdge sets this cookie to enable data aggregation, analysis and report creation to assess marketing effectiveness and provide solutions for SEO, SEM and website performance. |
CONSENT | 2 years | YouTube sets this cookie via embedded youtube-videos and registers anonymous statistical data. |
dj | 10 years | DemandJump cookie |
djaimid.a28e | 2 years | DemandJump cookiean |
djaimses.a28e | 30 minutes | DemandJump cookie |
li_gc | 5 months 27 days | LinkedIn Cookie |
ln_or | 1 day | LinkedIn Cookie |
vuid | 2 years | Vimeo installs this cookie to collect tracking information by setting a unique ID to embed videos to the website. |
Cookie | Duration | Description |
---|---|---|
__adroll | 1 year 1 month | This cookie is set by AdRoll to identify users across visits and devices. It is used by real-time bidding for advertisers to display relevant advertisements. |
__adroll_fpc | 1 year | AdRoll sets this cookie to target users with advertisements based on their browsing behaviour. |
__adroll_shared | 1 year 1 month | Adroll sets this cookie to collect information on users across different websites for relevant advertising. |
__ar_v4 | 1 year | This cookie is set under the domain DoubleClick, to place ads that point to the website in Google search results and to track conversion rates for these ads. |
_fbp | 3 months | This cookie is set by Facebook to display advertisements when either on Facebook or on a digital platform powered by Facebook advertising, after visiting the website. |
_te_ | session | Adroll cookie |
fr | 3 months | Facebook sets this cookie to show relevant advertisements to users by tracking user behaviour across the web, on sites that have Facebook pixel or Facebook social plugin. |
IDE | 1 year 24 days | Google DoubleClick IDE cookies are used to store information about how the user uses the website to present them with relevant ads and according to the user profile. |
li_sugr | 3 months | LinkedIn sets this cookie to collect user behaviour data to optimise the website and make advertisements on the website more relevant. |
test_cookie | 15 minutes | The test_cookie is set by doubleclick.net and is used to determine if the user's browser supports cookies. |
VISITOR_INFO1_LIVE | 5 months 27 days | A cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface. |
YSC | session | YSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages. |
yt-remote-connected-devices | never | YouTube sets this cookie to store the video preferences of the user using embedded YouTube video. |
yt-remote-device-id | never | YouTube sets this cookie to store the video preferences of the user using embedded YouTube video. |
yt.innertube::nextId | never | This cookie, set by YouTube, registers a unique ID to store data on what videos from YouTube the user has seen. |
yt.innertube::requests | never | This cookie, set by YouTube, registers a unique ID to store data on what videos from YouTube the user has seen. |