17
$\begingroup$

My background is a bachelor in mathematics. I learned basics OR on my own using the following :

  • Introduction to Operations Research by F. Hillier and G. Lieberman
  • Integer programming by l. Wolsey
  • How to Solve It: Modern Heuristics by D. Fogel and Z. Michalewicz
  • Constraint programming online courses available at Coursera

I learned to use some open-source solvers (Clp, CBC, etc.)

Now I want to learn skills that are useful for deploying solutions and doing end-to-end projects. I don't know where to start. How about a course in software engineering such as CS169 at Berkeley? Is it useful? Any suggestions for other skills that may be useful?

P.S: I know how to code using Python, C++, and Java

$\endgroup$
  • 2
    $\begingroup$ Hmm, maybe you could start by setting up a Web API in your favourite language? Eg: Flask (Python), Spring (Java) $\endgroup$ – Stradivari Jul 31 at 21:44
  • $\begingroup$ @Stradivari I tried to describe a full application flow (or.stackexchange.com/a/1322/858) using Flask but I am not sure about it. I will be glad if you could check it. Thank you $\endgroup$ – Amira Zarglayoun Aug 17 at 23:05
11
$\begingroup$

(I focus on the skills rather than suggesting specific courses).

If you want to deploy something, I assume you need a GUI. With that in mind:

  • If you want to host it somewhere, as Stradivari suggested, you can work on Web API. If you want to have it as an executable, well, the software development courses (such as the one you mentioned yourself) can be useful.
  • Do you intend to show some reports or maybe some visualization? If so, you need to know how to do that in the language of your choice.
  • Depending on how you are thinking about your application and how it should work, how it should read the data (from somewhere online, from users, etc), you may need to acquire database management knowledge.
  • Assuming you are familiar with LP and MIP and some open-source solvers, you may want to learn (if you don't know it already) how to solve your desired problem using one of the well-known commercial solvers as well. Because you may hit the wall of the open-source solvers' abilities pretty soon when you try to solve harder problem instances.
  • You can also learn about heuristics and meta-heuristic algorithms for solving difficult problems in case the solvers cannot provide you with an optimal (or even feasible) solution as fast as you like (even after tweaking their parameters). In those cases, you may consider the trade-off between quality and speed and knowing how to develop heuristic algorithms can be your only option.
  • After developing your application, you may find it useful knowing how to gather and process the analytics you collect from the users (such as how many times it's being used? Are there any additional feature requests? How to handle those or answer users' questions? Are there going to be bots involved for the users to interact with and get the answers to some of their basic questions? etc.)
$\endgroup$
  • $\begingroup$ do you have some ressources to learn each of the mentioned points ? (except for the commercial solvers) $\endgroup$ – Amira Zarglayoun Jul 31 at 22:42
  • 1
    $\begingroup$ I don't necessarily go after any course. Since I know Python, anything I want to search regarding the above points is around Python. For example, for visualization, I prefer plotly and I read their own website and tutorials. w.r.t to hosting on cloud: I look at the service providers and read their materials.The same thing for the database. What DBMS I'm using? Reading their specific documentation. $\endgroup$ – EhsanK Jul 31 at 23:50
  • $\begingroup$ I tried to describe a full application flow based using Flask+PuLp. I am not sure about it. I will be glad if you could check it.Thank you. $\endgroup$ – Amira Zarglayoun Aug 17 at 23:09
9
$\begingroup$

Gurobi has a series on Adopting Optimization in Your Organization.

Recently they showcased a state-of-the-art architecture for optimization applications that you can try out on their website. You can even get your hands on the source code. Here is the accompanying webinar: https://www.gurobi.com/resource/gurobi-optimization-application-demos/

$\endgroup$
9
$\begingroup$

I think the best way to learn, is to start by building small prototypes for OR tools, and slowly build something bigger. You might already know someone who is struggling with a planning problem where you can help! Maybe a local business, club or organization.

If you start doing that, I think you will obtain the following skills I think are required to build an OR solution end-to-end:

OR skills (find better decisions)

  • Formulate a problem into a mathematical model
  • Coding an algorithm or use a mathematical solver on your model
  • Present your result in a compelling way

I think the only way to obtain these skills is by solving many different kinds of OR problems.

Full-stack engineering skills (building stuff)

  • Creating a user interface
  • Load and save data from API-calls, databases etc.
  • Creating a maintainable infrastructure by separating your code into smaller modules
  • Ensure your code is robust and have unit tests

A way to obtain these by start building some smaller projects yourself or contribute to open-source projects.

Product management skills (figuring out what to build)

  • Talking to users to understand their needs and requirements
  • Deciding which features to build
  • Testing the product which users to obtain feedback

I can recommend the following two books: "Dan Olsen - The Lean Playbook" and "Eric Ries - The Lean Startup"

Good luck. The world needs more OR solutions!

$\endgroup$
6
$\begingroup$

Maybe it's because people take them for granted, but we're forgetting some fundamentals here. No matter what you develop, what solvers you use, what 3rd-party libraries you incorporate,... put your projects in version control. And then learn how to use version control effectively. This helps everyone from developers to end-users to salespeople.

Yes it's subjective, but in my experience the most difficult part of deploying a solution is not developing the software, it's tracking all the moving parts and expeditiously identifying root causes of problems. This is especially true in multi-developer/team environments. So in addition to version control, let me also throw in documentation, unit testing, code coverage, build automation, and all those types of tools and practices that target code quality and comprehension. They can be boring to learn at times, but they will save you countless hours in the long run.

And always keep track of the use cases. :)

$\endgroup$
  • $\begingroup$ How can I contact you ? Unfortunately, I didn't found an email adresse on your website. $\endgroup$ – Amira Zarglayoun Aug 3 at 9:03
  • $\begingroup$ @AmiraZarglayoun I have been procrastinating the task for a while, so thanks for prompting me. There is now a "Contact Me" menu on my site with Email and LinkedIn options for connecting. $\endgroup$ – brentertainer Aug 3 at 14:37
4
$\begingroup$

How about creating a small end-to-end program (GUI, data stored, OR, business logic). It could be a program with GUI that lets the user solve sudoku. What sets your program apart from various other solutions is a "Solve by MIP" where you then solve it by a MIP like this https://www.mathworks.com/help/optim/examples/solve-sudoku-puzzles-via-integer-programming.html

You could also make a reverse Sudoku game where you start with a solved game and then make the user remove numbers while keeping a unique solution to the instance. This is somewhat like a game of finding the longest path (very loosy speaking)

Of course you dont really need a MIP for this problem...

$\endgroup$
  • $\begingroup$ This is a good suggestion. I guess we could do the same thing using a jupyter notebook. $\endgroup$ – Amira Zarglayoun Aug 17 at 23:10
4
$\begingroup$

Very interesting question.

I think that it is more general than OR: how can I deploy a solution for my customer? It seems to be a software engineering question.

I imagine different scenarios depending of the problem context and the customer:

  • Deploy as a web service: there is an endpoint that the customer can GET/POST to get solutions
  • Provide ONE solution: you are asked to solve a particular instance and you just provide the solution to that instance of the problem in a file
  • Build an offline tool that solves the problem for your customer: it could be something like a jupyter notebook that guides you through the solving process, or just an executable file that takes input.txt and gives you solution.txt
  • Deploy as a backoffice where your customer can upload the input and get the solution in a self-service manner
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.