{"id":568,"date":"2021-03-20T18:42:00","date_gmt":"2021-03-20T18:42:00","guid":{"rendered":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/?p=568"},"modified":"2021-04-30T09:53:23","modified_gmt":"2021-04-30T09:53:23","slug":"on-the-record-how-to-use-gurobi-to-solve-linear-programming-problems","status":"publish","type":"post","link":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/2021\/03\/20\/on-the-record-how-to-use-gurobi-to-solve-linear-programming-problems\/","title":{"rendered":"On the Record: How to Use Gurobi to Solve Linear Programming Problems!"},"content":{"rendered":"\n<p>I have recently learnt how to solve some mathematical programming problems using Gurobi, an optimisation solver, in Python. Before joining the STOR-i programme, I was a complete novice at programming in Python so getting to grips with it is really exciting! One of the problems Gurobi is especially useful for is a standard linear programme. In this blog post, I&#8217;m going to introduce how we can use Gurobi in Python to solve linear programming problems.<\/p>\n\n\n\n<p>A trope of a linear programming class is the furniture factory example. No doubt, if you&#8217;ve learnt anything before about linear programming you would&#8217;ve heard of it. It concerns a factory that makes chairs and tables, with specification on the materials and working hours needed to complete production as well as the profit generated from the production of a table and a chair. The question proposed is, with given constraints on material and working hours, how many chairs and how many tables should be made in order to maximise profit? Not that I&#8217;m bored of seeing this problem (I really, really am) but I thought I could illustrate how we can use Gurobi using an alternative example, one inspired by my family&#8217;s love of music and my Dad&#8217;s very real problem of buying the right boxes to store his extensive record collection. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/jukebox-890x1024.jpg\" alt=\"\" class=\"wp-image-601\" width=\"376\" height=\"432\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/jukebox-890x1024.jpg 890w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/jukebox-261x300.jpg 261w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/jukebox-768x883.jpg 768w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/jukebox-1336x1536.jpg 1336w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/jukebox-1781x2048.jpg 1781w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/jukebox-769x884.jpg 769w\" sizes=\"(max-width: 376px) 100vw, 376px\" \/><figcaption><sub><sup>My family&#8217;s jukebox. This one features all the classics including my favourite song to dance to as a kid: <em>Tutti Frutti <\/em>by Little Richard.<\/sup><\/sub><\/figcaption><\/figure><\/div>\n\n\n\n<p>I was brought up surrounded by music, in a house with multiple jukeboxes so my family has a lot of vinyl! They&#8217;re our pride and joy and so we want to store them safely in a way that allows us to access them easily (because let&#8217;s be honest you never know when you&#8217;ll just <em><strong>need <\/strong><\/em>to find <em>Spice <\/em>by the Spice Girls). We have done extensive research across the storage market (makes for thrilling weekend activity I must say) and we have two box contenders. The differences in the boxes are displayed in the table below:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record1-4-1024x193.png\" alt=\"\" class=\"wp-image-587\" width=\"614\" height=\"129\" \/><\/figure><\/div>\n\n\n\n<p>We need to make sure that all seven-hundred of our records are boxed and my Dad wants to buy at least eight boxes so that we have enough space for the records he keeps treating himself to in order to stay sane during the lockdown. As you may have realised, storage is big business, these boxes are expensive, so we want to minimse our cost as much as we can. <\/p>\n\n\n\n<p>Let&#8217;s solve this problem and figure out how many of each box to buy. Before you use Gurobi, you&#8217;ll have to install it and get a license, more information on that can be found <a href=\"https:\/\/www.gurobi.com\/downloads\/\">here<\/a>. When you&#8217;ve got Gurobi working fine and dandy on your computer the first thing we want to do is set up our model. Here we&#8217;ve called our model <em>f<\/em> and added a label <em>&#8220;Records&#8221;<\/em>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"316\" height=\"127\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record2.png\" alt=\"\" class=\"wp-image-577\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record2.png 316w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record2-300x121.png 300w\" sizes=\"(max-width: 316px) 100vw, 316px\" \/><\/figure><\/div>\n\n\n\n<p>We then create our variables. These are the two different boxes we can buy. As we can&#8217;t buy a fraction of a box, we specify that our variables are integers by using <em>vtype=GRB.INTEGER<\/em>. Other variable types are listed in the Gurobi documentation <a href=\"https:\/\/www.gurobi.com\/documentation\/9.1\/refman\/py_model_addvar.html\">here<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"585\" height=\"107\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/records3.png\" alt=\"\" class=\"wp-image-578\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/records3.png 585w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/records3-300x55.png 300w\" sizes=\"(max-width: 585px) 100vw, 585px\" \/><\/figure><\/div>\n\n\n\n<p>Our objective function is to minimise the cost of buying the boxes. We set the objective of our model <em>f<\/em> by using <em>.setObjective<\/em> and include <em>GRB.MINIMIZE<\/em> to specify that our problem is a minimisation problem. For a maximisation problem, we would alternatively write <em>GRB.MAXIMIZE<\/em>. Don&#8217;t forget to spell the American way!<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"80\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record4.png\" alt=\"\" class=\"wp-image-579\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record4.png 500w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record4-300x48.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/figure><\/div>\n\n\n\n<p>The constraints of our linear programming problem involve the requirement for all of our records to be placed in a box and that we order at least 8 boxes to ensure there&#8217;s room for purchases in the near future. We use<em> .addConstr<\/em> to add these considerations to our model <em>f<\/em>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"689\" height=\"103\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsconstraints.png\" alt=\"\" class=\"wp-image-582\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsconstraints.png 689w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsconstraints-300x45.png 300w\" sizes=\"(max-width: 689px) 100vw, 689px\" \/><\/figure><\/div>\n\n\n\n<p>To solve the problem we use the <em>.optimize() <\/em>command. To print the variable outcomes we use <em>.getvars()<\/em>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"406\" height=\"215\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record6.png\" alt=\"\" class=\"wp-image-581\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record6.png 406w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/record6-300x159.png 300w\" sizes=\"(max-width: 406px) 100vw, 406px\" \/><\/figure><\/div>\n\n\n\n<p>If we run all of this code in Python we get our solution! <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsoutput.png\" alt=\"\" class=\"wp-image-585\" width=\"760\" height=\"167\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsoutput.png 926w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsoutput-300x66.png 300w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsoutput-768x169.png 768w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/recordsoutput-769x169.png 769w\" sizes=\"(max-width: 760px) 100vw, 760px\" \/><\/figure><\/div>\n\n\n\n<p>In order to minimise cost, we should buy two of the smaller box, Box 1, and six of the larger box, Box 2. The total cost will be \u00a3130. It&#8217;s as easy as that!<\/p>\n\n\n\n<p>So what do you reckon? Is Gurobi a <em>sound <\/em>tool? I think so. This problem might be a simple example but it illustrates how we can use Gurobi to model and solve mathematical programming problems effectively. Be sure to check out the Gurobi tutorials in the <strong>Want to Know More<\/strong> section below.<\/p>\n\n\n\n<p>Before I go, I thought I&#8217;d share my family&#8217;s vinyl collection must-haves just in case you fancy starting your own. But, fair warning, before long you might end up having to spend \u00a3130 on some storage boxes!<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Dan Fogelber &#8211; Phoenix<\/li><li>David Bowie &#8211; Station to Station<\/li><li>HAIM &#8211; Something to Tell You<\/li><li>Buddy Holly &#8211; Buddy Holly<\/li><li>The Rolling Stones &#8211; Sticky Fingers<\/li><li>The Animals &#8211; The Animals<\/li><\/ul>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"299\" height=\"300\" src=\"http:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/Dan_Fogelberg_-_Phoenix-1.jpg\" alt=\"\" class=\"wp-image-597\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/Dan_Fogelberg_-_Phoenix-1.jpg 299w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/Dan_Fogelberg_-_Phoenix-1-150x150.jpg 150w\" sizes=\"(max-width: 299px) 100vw, 299px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/Station_to_Station_cover.jpg\" alt=\"\" class=\"wp-image-590\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/Station_to_Station_cover.jpg 300w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/Station_to_Station_cover-150x150.jpg 150w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"316\" height=\"316\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/haim.png\" alt=\"\" class=\"wp-image-599\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/haim.png 316w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/haim-300x300.png 300w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/haim-150x150.png 150w\" sizes=\"(max-width: 316px) 100vw, 316px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"293\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/buddyholly.jpg\" alt=\"\" class=\"wp-image-593\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/The_Rolling_Stones_-_Sticky_Fingers-1.png\" alt=\"\" class=\"wp-image-594\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/The_Rolling_Stones_-_Sticky_Fingers-1.png 300w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/The_Rolling_Stones_-_Sticky_Fingers-1-150x150.png 150w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/animals-1.jpg\" alt=\"\" class=\"wp-image-596\" width=\"263\" height=\"263\" srcset=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/animals-1.jpg 283w, https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-content\/uploads\/sites\/26\/2021\/03\/animals-1-150x150.jpg 150w\" sizes=\"(max-width: 263px) 100vw, 263px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>This week&#8217;s<strong><em> tweet of the week<\/em><\/strong> goes to <a href=\"https:\/\/twitter.com\/AverageAcademic\">@averageacademics<\/a> with an excellent reminder to step away from the screen once in a while.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"twitter-tweet\"><blockquote class=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">A very important call! (Artwork by <a href=\"https:\/\/twitter.com\/Jeremyville?ref_src=twsrc%5Etfw\">@Jeremyville<\/a>) <a href=\"https:\/\/t.co\/t6rHPXutpM\">pic.twitter.com\/t6rHPXutpM<\/a><\/p>&mdash; AverageAcademics (@AverageAcademic) <a href=\"https:\/\/twitter.com\/AverageAcademic\/status\/1373338898697441283?ref_src=twsrc%5Etfw\">March 20, 2021<\/a><\/blockquote><\/div>\n<\/div><\/figure>\n\n\n\n<p>Missed my last post? Check it out <a href=\"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/2021\/03\/03\/clustering\/\">here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Want to know more?<\/h2>\n\n\n\n<p>Gurobi offer a selection of tutorials to get to grips with the software for linear programming problems. You can find it all at the link below:<\/p>\n\n\n\n<p><a href=\"https:\/\/www.gurobi.com\/resource\/mathematical-programming-tutorial-linear-programming\/\">Tutorial: Linear Programming &#8211; Gurobi<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have recently learnt how to solve some mathematical programming problems using Gurobi, an optimisation solver, in Python. Before joining the STOR-i programme, I was a complete novice at programming in Python so getting to grips with it is really exciting! One of the problems Gurobi is especially useful for [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":601,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[18,1],"tags":[],"class_list":["post-568","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/posts\/568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/comments?post=568"}],"version-history":[{"count":26,"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/posts\/568\/revisions"}],"predecessor-version":[{"id":734,"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/posts\/568\/revisions\/734"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/media\/601"}],"wp:attachment":[{"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/media?parent=568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/categories?post=568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lancaster.ac.uk\/stor-i-student-sites\/robyn-goldsmith\/wp-json\/wp\/v2\/tags?post=568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}