 Hopefully I can type in now, maybe somebody can tell me how to fix this once and for all because it seems to be random. That's why the background here. All right, so let's see. So as I said, we're going to start talking about linear programming. We should get started. So the plan is to talk a little bit about the goal of optimizing optimization problems where the objective function is linear and also the constraints are given by linear equalities or inequalities. That's what linear programming is about. And that sounds fairly easy except when you have a large size problem, for instance, lots of variables and lots of constraints. You can run into, well, first of all by hand, it's totally out of the question when you have more than two or three variables. And so we'll talk about how this implementation, how the algorithm called simplex method does find the optimal value in most cases. And then we'll go to an example and talk about how the computer actually becomes efficient in implementing the simplex method and get the solution. So first, and I hope you've seen maybe, but if not, here's sort of a very simple setup. So I'll start with the baby example where you have to maximize, say the function f of x1, x2, two variables, x1 plus 2x2 subject to the constraints. So I'm going to use g for the constraints. So g1 of x1, x2 is 2x1 plus 3x2. And this can be at most six. And g2, x1, x2 is 3x1 plus x2. This can be at most three. And also, since most of our variables, well, sometimes we're going to assume this without even explicitly saying that the quantities are positive. So this is a very simple example of linear programming. You have objective function, which is linear function in x1, x2. And your constraints are also linear. Now, these are inequalities or other inequalities, right? But let's see what it looks like. So first thing, when we do an optimization with constraints, we want to look at what's the feasible region, right? What's the feasible set given by these constraints? And in two dimensions, so when we have two variables, linear inequalities lead to lines and half planes, right? So the equality leads to a line, and then inequality leads to one of the two half planes, right? So let's see, 2x1 plus 3x2 equals 6 looks something like this. You can see this, if I put x2, 0, then I get x1 to be 3, right? If I put x1 to be 0, I got x2 equals 2, right? So that's 2x1 plus 3x2 equals 6. And so how do we determine which half plane corresponds to the inequality less than or equal to, right? Is this half plane or this half plane? Bottom one, because we could take 0, 0 and verify that it actually satisfied the inequality. So that's the lower half plane. For this first one, and the second one is going to be, I use a different color. So the second one looks something like that, right? And I believe there is a one intersect and there is a three intersect here, right? So obviously it's chosen so that it looks fairly simple. And again, it's a lower half plane determined by that blue line. So when you look at the constraints being satisfied simultaneously, we get this region, right? So that would be the feasible region. So we're interested in the maximum value of our objective function within this region. Now let's remember, well, first of all, you could identify all the vertices of this region. As I said, this is 0, 2. This is 1, 0. Yeah, this is 0, 0. And the last one is obtained by solving the system 2x1 plus 3x2 equals 6, 3x1 plus x2 equals 3. And I think if you do the whatever method you choose comes out to be 3 seventh and 12 sevenths, right? So that's, of course, this is going to be very hard if not impossible when you have 7 constraints and 5 variables, right? But just to illustrate the idea here. So right now, how can we visually maximize this function? Or can we tell where the maximum is going to occur? Well, first of all, look at this objective function. And think about what it is that, like, where are the points where this function takes a certain value, C? So what are the level curves, right? Level curves of the objective functions. The objective function is, or are lines, right? Lines in the plane, parallel to themselves, right? And you can figure out the slope, right? The slope is with slope, what's the slope? Negative or half, right? Because x2 is, you can write x2 is minus a half x1 plus a half C or something like that, right? So the slope is negative or half. So now I'm about to draw that in this plane. And I have to make sure that I draw it correctly compared to these other two lines, right? So for instance, let's do the 1 through 0. So the 1 through 0 is x1 plus 2x2 equals 0. So it looks something like this, right? So this is where f is 0, okay? Now, as I said, the other curves are, I mean the actual, the other level curves, which are all lines parallel to themselves, are going to be either this way or that way, or the opposite way. But how do we know whether f is increasing or decreasing in this direction? So f is, what do you think? Is it increasing as we move this way or this way? As we move this way, it's going to be increasing because, well, because you can say f equals 2 happens, you know? So x1 plus 2x2 equals 2, right? Happens when x2 is 0 and x1 is 2. So that's, okay? So it happens when whatever, you know? You can find the intercept, right? So this would be 2, 0 and this would be 0, 1, right? But actually a better way to think about it is, what is the gradient of f? It's 1 and 2, right? So the gradient of f is this vector, and what do we know about the direction of the gradient? Is the direction in which f increases, right? Most, actually. So it's in the direction of the gradient that f is increasing, right? So if you want to look for the maximum of the values of f, then we want to basically see what level curve I can draw that still intersects that feasible set, right? And that corresponds to the maximum value of f. Well, maximum value of f is achieved by sliding this line sort of parallel to itself as much as possible, right? And still meeting that feasible region, right? So visually, to maximize f of x1, x2 on the feasible set, amounts to sliding the level or finding the level curve, finding the level curve which intersects the feasible set and corresponds to the maximum value of f, f equals c, okay? So you can imagine doing this, and because of the specific way the feasible set looks, like where do you think it's going to hit, where is that level set going to be? So it all depends on the slopes, right? It depends on the slopes of this line compared to the slopes of the constraints, right? If you look at the slopes of the green line, then you see the slope is negative two-thirds, right? And this one has slope, so this was 2x1 plus x2 equals 3. This is slope negative 3, right? So basically, if you compare the slopes, so what was negative two-thirds, negative 3, right? And you have to see where the negative one-half fits. Is it negative one-half? Yep. Well, negative one-half looks like it's here, isn't it? So, right, this looks like right, so yep. So you see the slope? I mean, the picture doesn't look very correct because I have one and two, so this means that when I'm going to hit 2 and 4, right? That line is going to be with slope less than the green line, right? So this means that you can slide it up all the way to where this value is achieved, right? So this means that the maximum occurs when x1 and x2 is 0 and 2. And the maximum will be, the maximum of f, the maximum of f is over the region, feasible region, let's call it s, is f at 0, 2 is 4, right? I mean, it's 0 plus 2 times 2, so that's 4. And you can verify this by the following reason, right? So the conclusion visually is that you have this maximum. Yep. Which one? This? Well, it won't have, well, these have predetermined slopes. So this has a slope of negative one-half, right? And that has a slope of negative two-thirds, right? So, well, it will intersect and the question is, when does it intersect this feasible set and achieve its maximum value, right? So by looking at the slopes, we kind of conclude that the maximum is going to occur when, I'm just going to draw this here, so, right? So that's going to be f equals 4, right? Now, you can verify this. So for instance, what's the value of f at the other vertex? At this vertex. Well, the other vertex was 3-7s and 12-7s, right? So this is, what is it? 3-7s plus 2 times 12-7s, that's 27 over 7. That's just slightly less than 4, right? But it is less than 4, okay? So the value here is f is whatever, 27 over 7, right? So this is the maximum point, okay? And it's achieved at a vertex rather than in the middle of an edge. And that's something that's going to happen for all linear programming problems like this. Because the objective function is linear, right? The worst thing that can happen is that that objective function could be parallel to one of the sides of these visible sets, in which case you'd have a maximum anywhere on that edge. But for certain, it's going to happen when you pick only the vertices, okay? So that's kind of one way to do it. And it's not very efficient when you think about, you know, variables and more because we don't even talk about slopes there. What would be another way of finding the maximum? Well, it could be as easy as looking at the vertices only and evaluate the function of the vertices. Like we did this kind of a priori, but a posterior after the fact, right? We computed the value of f here, we computed the value of f here, we didn't compute the value of f here, but here would have been 1, right? So here was 1, so obviously it was less than, and here it was 0, so, right? So, and then pick the maximum of all, right? Now what happens if you don't have this visual tool? So what happens when you have several variables, okay? So let me formulate a problem. So the linear programming problem in general says the following. Is that consider the objective function, a linear function, as far as f of x1, xn is basically a linear combination of x1. So let's c1 times x1 plus c2 times x2 plus cn times xn. And try to maximize it or minimize subject to the constraints, and you can have any number of them. So I'm going to use g1 of x1, xn, which is again a linear function of x1, xn. So it's a11x1 plus a1nxn less than or equal to b1, g2, and so forth, right? So g2 less than b2, and finally gm. So that's possibly a different number of constraints than the number of variables. You can have one constraint. You can have fewer constraints than a number of variables. You can have more constraints than a number of variables, right? Even in two dimensions you could have three constraints. Yep, and so forth. So a m1x1 plus a mnxn less than or equal to bm. And again, keep this in mind that for our applications there's going to be, if you want an additional number of constraints, but we're going to treat this separately, right? We're going to treat them as special constraints. Now, you can always make x1 being positive to be a constraint of that type, right? You could say minus x1 has to be less than or equal to zero, and that would be another g. But again, let's leave this separate, and you see the code is going to use them in separate ways. So just first to introduce this definition is that the feasible set corresponding to such constraints is called a simplex. A simplex and rn. So rn is the state space, right? You have n variables. In rn you have this region, which is basically obtained by taking each constraint and reducing that rn to half spaces, half spaces, and so forth. So you can think of it as some sort of like a diamond with lots of faces in rn. So quite hard to plot it, but this doesn't do justice here because this is in rn, right? But in the end, what's going to be is going to be a bunch of vertices, a bunch of edges, right? A bunch of faces, a bunch of faces of dimension 2, dimension 3, dimension so forth, up to dimension n minus 1, right? So in r2 it is easy. This really is a picture of r2, right, of a simplex in r2, but in r3 you already can have pyramids, all kinds of objects. So that is kind of a generic name for such a region. It's called a simplex. And the algorithm for finding the maximum for finding the optimal value of f is a vertex search. Note that because the objective function is linear, in rn what's the level curve of a linear function? It's a n minus 1 plane if you want, right? So it's a kind of a hyperplane if you want. Think about r3 and then you have a linear function, r3, level curves are planes, right? And then in more dimensions there's an analog. But when you have like a diamond shape region, right, and you're kind of sliding that plane parallel to itself, and you're trying to see where it hits that kind of simplex first or last, right? If you want to minimize, you want to slide from lower values, right, until it hits it first and then to find the maximum is where it hits last, right? Well those intersections will always happen either on vertices or as I said on edges, right? But it's fair enough to say that the maximum will occur at one of the vertices. So note that the optimal value is always going to be achieved at a vertex. Now it may not be an unique vertex because as I said, if you have a face or an edge that is parallel to that hyperplane that you're sliding, you're going to hit it along the whole edge rather than just a single vertex, right? But it's enough to kind of say, well if I'm able to evaluate that function at each vertex and find the maximum vertex where the function takes the maximum value, then we're done, right? The only problem is you may have lots of vertices that you don't know how to calculate. So evaluating at each vertex may not be feasible, be computationally feasible because there are too many and in fact you don't know what they are. I mean imagine you have five constraints in seven dimensions. Just to compute those vertices, all the vertices would be a huge task, right? And then knowing that the maximum only occurs on one or two vertices will say, well why do I have to compute all the vertices, right? Well I'm only interested in that optimal vertex, right? So this vertex search, so basically the idea of the simplex method is start with an initial vertex and move to neighboring ones, vertices where the function increases in value if it is to maximize or decreases in value if you have to minimize, right? So again it's impossible to draw but in more than two dimensions but if it's something like this, let's say this is, it's in two dimensions but I have one, two, three, four, five constraints, right? And let's say the maximum is occurring at this edge, at this vertex, excuse me, okay? Then the simplex would start somewhere, would start let's say, typically you start always at, well you can pick the point to start but typically you start at the vertex that you know, you don't have to do any computation. You start at zero and then you move to a neighboring vertex where the value of F increases, right? So probably, I mean to get in the shortest amount of time or computations to the optimal you should move to this vertex, right? And then from here you'll move to the, the next one will be maximum, right? Rather than moving to this one and then this one and then this one and this one, right? Okay, now there is an algorithm that actually is indicating how to, to choose the vertices, the vertices to move in the fastest way possible. So in the shortest number of iterations to get to a maximum, right? And there are actually different algorithms for, you know, some are actually professional grades so some are, I mean there, there are lots of them that are used in commercial products. MATLAB has one that's called, well, has an implementation of the simplex method called linprog. So in MATLAB, this is the command linprog for linear programming. Command is available as long as you have optimization toolbox. So we'll talk about that in a specific example but just to indicate here. Of course, there's going to be some syntax that we need to abide by. But the main thing to do when you run something on your computer is to make sure that you have optimization toolbox. And I think the student versions recently have started that. So if you're not sure, just type VR from version and you should see it in your list of toolboxes. Okay? If you don't, you're not going to be able to run this command. But anywhere on campus, anywhere, as I said, if you have a very old student version then you probably don't have this but check it before you start anything. Okay? So let me talk a little bit about this. Any questions about? Now there's a curse and a blessing of having this command available to us. Good thing about it is you can just, if you know how to feed in the data, the data of the problem in this command then you get the answer. You get everything like in one line, right? The bad thing is, well, it may not be as bad but you don't see actually that vertex search. It doesn't just show you any because it's all sort of hidden in the command, right? So is anybody seen linear programming before? Simple method? In discrete math? It wasn't in the school. American computation? Okay. With the top lows? Yes. Right, so you can do it by hand, right? But the point is, and I'll show you, I'll show you some of that, but it's not actually, well, you see it by hand, do it by hand, but then when you have to do a large-scale one, then you have to run a computer software. So this is quite well-optimized in Matlab, so I'll tell you how much you can rely on it, but there are different options to do it, and hopefully maybe Monday I'll talk a little bit about the algorithm by hand. But first of all, let's just see how it works on a specific problem. So the example I think it's called 3.3, or is it 3.4? It's 3.4 in our book, and it's about a farm problem. Okay. And it has three variables. So I think you should, I'll kind of do it a little bit shorter than the book does because the book actually goes through the five steps of modeling. So, but I'll just sort of just highlight what are the important ingredients in this model. So the problem is you have a certain amount of land available for planting, and you want to do three crops, corn, wheat, and oats. So you want to plan on how much of each to plant, say, in a given year. So the decision variables, or the variables, the state variables are acres of corn planted, or to be planted, acres of wheat, X2, and acres of oat. And now we have certain constraints, so we don't have, I mean, we have to stay within certain bounds. One of them is the sum of the X1, X2, X3 has to be, you know, at most 600, whatever it is, 25, right? Well, just because the code, the way I wrote the code is this comes as the last one, as the last constraint, but that's not, right? So this just says I don't have, this is how much I have available. And yes, 625, I think, yeah. All right, now, what are the other constraints? Well, it is anticipated that a thousand acre food of water will be available for irrigation. So you have a constraint on the total amount of water, acre food is volume, right? It's an amount of water that's available, and I think that's my first constraint here, so. And then you have a table of how much water it takes each crop, right? So you have corn takes three acre food, right? One acre of corn takes, so this is going to be three times X1, right? Plus one times X2 plus 1.5 times X3 cannot exceed a thousand, yeah. This will determine the feasible set, right? Basically what's possible among, you know, we still haven't defined what the objective is, right? But the objective will be to whatever some profit, right? Maximum profit. Find the amount of each crop that should be planted for maximum profit. And profit is basically, yeah, is about, is in terms of dollars of yield. Okay, and we have one more constraint that's the labor. There will be farmers available to devote 300 hours per labor per week. So I guess it's safe to say just do it per week, right? That would be time per week. 0.8 X1 plus 0.2 X2 plus 0.3 X3 at most 300, okay? So that's about it. And of course X1, X2, X3 have to be positive, right? And now the objective function is the profit or the total yield. So that's half equals 400 X1 plus 200 X2 plus 250 X3. And again, this is all given in a table. So, you know, it may take a little bit. I think one of the homework problems that I've signed, you're also given a table. So you just have to be able to extract information the right way from the table. So, okay, so the first thing to realize is this is exactly in the form that we had it earlier. Also called a standard form of linear programming in standard form. And it's also very kind of, well, it's almost, it's prepared to apply the lean proc command in MATLAB with only one small modification I'll tell you in a second. But if you think about it, what you have is you have an R3, you have three variables, right? You have the first octant, right? And then you have some of this, each constraint corresponds to a half space, right? So I don't know how you call that figure, that you cut the first octant in three with three planes. You see, it's pretty hard to even count the number of vertices, right? Let alone to actually find all the vertices. And then this will be actually a plane, right? That's trying to hit that simplex, okay? And we're trying to find where it hits, you know, what is that vertex? Or maybe two vertices or maybe a bunch of vertices, okay? So by hand it's kind of almost hopeless at this point, even with three variables. So let's see the code, how you would do this on the computer. So first of all, I just wrote this here, so all of this is common, so there's nothing. Notice that even the function, I don't have to define the function, it's just a comment, right? So we know what it is. In fact, that's an important thing to mention is at this stage we're not going to use any symbolic computation anymore. So we don't have to define x1, x2, x3 as symbolic, period. It just makes the display better when you publish. If you look at the published version you'll see this. I think it just itemizes them here, okay? But it's just common, right? So the code starts here basically, okay? So notice how simple, well, it's relatively simple to input this in linear programming. That is, you just have to make the metrics with the coefficients of the constraint and a column of the right-hand side of the constraint, right? No, I'm sorry. Actually, this one is the coefficients of the objective function, f. And b is the right-hand side of the constraints, okay? And keep in mind these are columns, right? So this is how you write a column in Matlab. It's column, column, and this is a matrix. 3 by 3 in this case, I have three constraints and three variables. Notice I don't have any x1 positive, x2 positive, x3 positive, right? So those are separate. Those are not treated as real constraints. Okay, so, and that's it basically. So, well, we'll see other a little bit more sophisticated way, but all you have to call is you have to call this linear program, the linprog function, and you have to give the inputs the following. The objective function by just the coefficients of that linear function, right? Now, the reason you need a minus is because linprog actually minimizes instead of maximizing. So the best way to see this is to look at the help here. So linprog actually minimizes objective function which is linear, so f times x, but f transpose, so f is a column, right? So f transpose is a row times the column of the x's. Subject two, you can have an equality constraint, you can have equality constraints, and you can have bounds for x, okay? So look at the syntax. So the first one is just the simple syntax where you have f, a, and b. So you have to specify f, the matrix coefficients, and the right-hand side of the constraints. So that's what we do here. Now, there's a bunch of output that, you know, the command gives you and you have to know how to harvest this output, how to get, you know. So we actually give the name x and x will stand for the vertex where the optimal occurs. f val is going to be the value of the objective function at the optimal vertex. This doesn't matter too much. I'm just going to say that it's successful. Optimization was successful. And there are two more things. The one that we're going to be interested in is this lambda. It will be some sort of shadow prices, the role of a shadow price. And the last thing I do is, notice I don't display anything in this lean probe because I don't want to see everything yet, but I just display x and I display the value of the function. Now, because I'm maximizing f, I need to put minus f and then the f max is minus f val. So I'm doing an undoing assign so that in effect I'm maximizing this. So if you run this, you'll just see the answer. It found the f max and it found this vertex of these values of x1, x2, x3. So, okay, if you're not sure about what. Now, lean probe always minimizes. Well, for our property, we need to know what to look for before we go to the computer. So we're looking for the max. Now, if you're looking for a min, you can ask for the min, right? But you will know what the min is. You will know that it's 0, 0, right? In this case, but in general, it's true. You won't know, in fact, here, by the way I actually typed in this is I didn't say that x1, x2, x3 has to be positive, okay? So because I didn't restrict to x1, x2, x3 is positive, you see what happens here. It actually goes to negative values and it doesn't find the minimum, right? So it gives me all of these errors which is consistent, right? It says that the minimum, right? Well, I call them what is the minimum, right? And at some point it just has to stop. So yeah, so you have to kind of watch what you're doing and kind of balance with what you expect to happen. Now, let me talk a little bit about any other questions on this. It's just a one-line command, right? Yeah. Well, yeah, so don't worry about these two things. You see, I don't even use them. The only thing is in order to harvest this lambda, which is going to be the Lagrange multiplier, the shadow price, that's what the command asks you to do. So I have to give names. I cannot just say lambda as a third output because that's not a third output. It's a fifth output. Yeah, but we don't use that. If you want to see what this is, and I run this again, you can, right, one stands for it's successful or something like that, right? Okay, so now, so you could say, okay, that's it. We're going to plan this many acres and this many and so forth and be done. Now, there is something that to be said about how far you are from actually fulfilling or satisfying those constraints. For instance, you might ask, well, have we used all the land? I mean, this optimal strategy, is it going to use all the land? Or is it going to use all the water? Or is it going to use all the hours, right? So how do you decide on that? Well, you just have to see how far you are from satisfying the equalities in the constraints. Okay, so those are called slack variables, which is nothing but taking the AX and comparing it with B, right? Remember, the constraints are AX less than or equal than B. So if I put the difference, I would know. So the difference between the left side and the right side of the constraints and equalities turned out to be for this maximum, for this optimal value, turned out to be 0, 74, and 0. What does it mean? We use all the land, and forget this minus, 0. We use all the water, but we don't use all the time, which is great, right? Because we care about people more than water, for instance. Yeah, okay, so 128, yeah. Okay, great. No, no, that's actually a good point. The section that comes up to this section is talks about, releases these problems, but talks about, you know, you have, it's called discrete optimization, so you have, your decision variables can only take discrete values, and then you have these other issues, right? But right now, let's not worry about those. In fact, I'll just say, discrete optimization is not going to be something we'll talk about in this class. So, or integer programming, right? Integer programming is a whole different, you know, whole different discussion. Okay, so, everybody kind of understands what the slack variables mean, is once you decide on the values of x1, x2, x3, what's the difference between the left side of the constraint and the right side of the constraint? Okay. And we just, we just computed this, and the meaning of that is, you know, the slack variable being zero means that the constraint is what's called binding. So you have maxed that constraint. There's nothing, you know, you can spare from that, right? You cannot have any, I mean, you cannot have more land, right? For instance, yeah. Well, that basically means, if you think about that simplex, it means that where the maximum occurs, right, is somewhere where it's different from the, where the labor is, so it's not on the face where the labor is reaches its maximum, it reaches its constraint. Now, and that's the visual picture, but I mean, in terms of, you know, field, you know, situation on the field, that's what turns out to be the maximum profit, right? In terms of, I mean, there's no cost to the labor here in the picture, but it just says that's what's going to give you the best decision for these variables. Is the difference, is the difference, right? Is the difference. Right, so let me say here, so the slack variables, and I use u rather than x is the following, is if I look at the constraints, then I say 3x1 plus x2 plus 1.5x3 plus u1 equals 1,000. So it's basically, I take the difference between the two and I insert it there, I like to be positive, so I put plus u3, u1, right? So I insert this u1 here. The other one is 0.8 times x1 plus 0.2x2 plus 0.3x3 plus u2 equals 300, right? And x1 plus x2 plus x3 plus u3 equals 625. So I have, for each constraint, I have a slack variable, right? And by requiring that these slack variables are also positive means that I put them here, right? Yeah, that's extreme, thank you, yeah. Okay, so when you do the difference between b and a times x, right? That's going to be u1 into u3, right? So u1, u2, u3, if you want a times x1, x2, x3 equals b, b1, b2, b3. And it's important that the inequalities are all less than or equal to, less than or equal to, right? What if one equality would be greater than or equal to? You would flip it around, put a negative in front, right? So put a negative in front and type in that matrix, maybe I'll show you an example in a second. Okay, so this is the slack variables and this has a meaning. And now the last thing is shadow prices. So we've talked about this. Let me just run this and then talk. So this is actually, that's the reason why we wanted the lambda to be outputted. So we want to compute this lambda and lambda is like a complicated thing because it can also take the lambda of the constraints, equality constraints and the other things. So this is just saying, show me the values of the lambdas for the inequality constraints, which in this case are all of them. And these are those numbers, okay? So what is the meaning of this? So if you think about lambda as a Lagrange multiplier or shadow price, for each of the constraints, so this is the first constraint, second constraint, third constraint. But the first constraint, what's the shadow price meaning? It means that if I allow one more unit of the irrigation of the water and redo the whole optimization again, what will be the optimal profit in that case? And it's going to be $100 more, okay? And that's because the optimal that occurred here was using all the water, okay? So because the first constraint was binding, so the slack was zero there, corresponding to a positive value for the shadow price. Now think about the second constraint. The second constraint says I have some hours to spare, right? Well, so now if I allow more hours and I redo the whole optimization again, is that going to change anything? No. So there's going to be no benefit for increasing the other constraint, for relaxing the second constraint. The third constraint was the amount of land, right? And that again corresponds to if I allow one more acre and redo the whole optimization, then what's going to happen, right? And you can convince yourselves of this, what you can think of sensitive analysis. So if you run this with $1,000, $325,000, okay? You run the same thing again and then look at the gain, the fmax minus the previous one. This is going to be exactly the shadow price, the $100,000, okay? So notice that here I'm not catching the lambda again, right? I don't want to read that. Also, so I can run this so you can see, oh, the only thing that I'm going to... So, okay, I jumped over something. So let me just say the following, that the first thing that we run this, we run it with what's called a large-scale method, which is typically used for large-scale problems, okay? And that is not using the simplex method that you know by hand. If you've done it by hand, that wasn't the actual simplex method. It was a different algorithm for this vertex search. If you want to use the simplex method that you've done it by hand and you love it and you want to see how it does, then there's this... You have to define options to just copy and paste this. And you see a large-scale off, simplex on. And then you run the same thing again, but you have to type it in here, right? And when you type it in here, remember last time we only used three inputs for the limb probe? Well, now you see we need... This would be for the equality constraints and we don't have any equality constraints. This is for the lower bound, so the lower bound is 0, 0, 0, right? And this is for the upper bound, and I forgot this one for what it is, but you can look in the limb probe for that and then run it again. Now, you remember those numbers, right? Let's run it again with this syntax. With this... Oh, yeah, of course I... Okay, let me run it again from the beginning. So I run it here. This is large-scale, right? Okay. And this is the slack and this is the shadow price, okay? Now, we do it with a simplex method. What do you notice? Different. Different strategy. So don't plan any of the other one, of the, whatever, the third crop, right? You're going to get the same maximum. How is that possible? This basically means that your plane hits that simplex, not in one point, one vertex alone, but in edge, at an edge, right? So there's not a single optimal value for x, right? It's the same value for f, same maximum for f, but there are at least two for x, right? And now here's the kicker here. Look at the slack. In this strategy, you have the same profit, but with less work to spare, right? Hours. So your people are going to work more, right? Get the same profit, right? So what's the conclusion of this? Depending on which method, which algorithm you use, sometimes you may pick a vertex, right? You may reach a vertex where the maximum occurs, right? But that's it. You stop, right? And that's what simplex does. The other algorithm actually does it a little bit better. It also maximizes the slack, okay? And it's the same shadow price. That doesn't change, right? If it's a binding constraint, you have a positive shadow price. If it's not binding, you have no shadow price, right? All right, so as I said, the sensitivity, and I'll stop here, but the sensitivity just shows you that if you run this with one more, the gain is 100. So it's exactly that shadow price. So pretty much the lambda is the Lagrange multicolors for each of the constraints, taken one at a time at the maximum point. And if your optimal point is not on a constraint, you don't have a constraint optimization. So there's lambda is zero, okay? There's a second example of 3.5, which I don't have a code to. But if you want, I can make it up. So there's an example of 3.5 in the book about dirt, something like that. But maybe I'll post it one of these days. Okay, but get started on the homework and let me know. I think I said the deadline for Wednesday, so a week from today. So get that started. Yeah. I watched the class and you were asking about the people taking it for graduate credit. Yeah. And I am taking it. Yes, you are the only person, the other person, yeah. I'm the other person. The other person, right. So you wanted to...