Assignment-dependent resource allocation method5077661Abstract An iterative, assignment-dependent, method of allocating manufacturing resources to perform operations required in the manufacture of multiple products provides for improved conformance with actual manufacturing situations and for solutions which approximate optimal allocation while requiring only modest computational power and time. The first step involves attributing complex costs to potential assignments of operations to resources. Complex costs include two components, combined money-costs and combined times. Combined cost is an assignment dependent variable which can equal operational cost or the sum of operation cost and set-up cost depending on assignments that have already been made. Combined time is likewise assignment dependent. In a second step, combined cost is selected as a parameter to evaluate each potential operation-resource pair. In a third step, a lowest cost and a second lowest cost resource are determined for each unassigned operation. In a fourth step, a maximum penalty operation is identified by finding the maximum difference between lowest and second lowest costs. In a fifth step, the maximum penalty operation is assigned to its lowest cost resource. In a sixth step, combined costs are re-evaluated to take the most recent assignment into account. In a seventh step, iteration is continued by returning to the third step until all operations have been assigned to resources. Once all operations have been assigned, the assignments are reported as a solution to the allocation problem. The inventive method readily handles capacity constrained resource allocation problems, which are difficult or impossible to solve with conventional techniques. Claims What is claimed is: Description BACKGROUND OF THE INVENTION
______________________________________
Set-up and Operational Costs for P.sub.1 and P.sub.2
Product P.sub.1 Product P.sub.2
P.sub.1 Q.sub.11
Q.sub.12 Q.sub.13
P.sub.2
Q.sub.21
Q.sub.22
______________________________________
R.sub.1
10 4 3 6 20 6 8
R.sub.2
30 X 4 3 20 5 2
R.sub.3
30 4 1 4 10 2 X
______________________________________
X denotes that an operation cannot be performed on a resource. Set-up costs are listed in columns with the headings P.sub.1 and P.sub.2, while operational costs are listed in the "Q" columns. This table provides the attribution of complex cost required in first step 11. Note that it is not necessary to calculate the complex cost to have it attributed. All that is required is that the data and procedure for calculating complex cost be defined. The "complex cost" table can be used to generate a table for combined money-cost M.sub.pqr for each assignment map. In this example, combined money-cost is the parameter V referred to in second step 12. The table V.sub.0 for parameter V given the initial assignment map A.sub.0 is:
TABLE V.sub.0
______________________________________
Product P.sub.1 Product P.sub.2
Q.sub.11 Q.sub.12
Q.sub.13 Q.sub.21
Q.sub.22
______________________________________
R.sub.1
14 13 16 26 28
R.sub.2
X 34 33 25 22
R.sub.3
34 31 34 12 X
D 20 18 17 13 6
______________________________________
where the initial assignment map is:
______________________________________
Assignment Map A.sub.0
______________________________________
Q.sub.11 unassigned
Q.sub.12 unassigned
Q.sub.13 unassigned
Q.sub.21 unassigned
Q.sub.22 unassigned
______________________________________
In accordance with third step 13, operation Q.sub.11 can be performed at the lowest combined money cost of 14 dollars on resource R.sub.1. Not performing Q.sub.11 on R.sub.1 would incur require a performance money-cost of at least 34 dollars on R.sub.3. The penalty for not assigning Q.sub.11 to its lowest cost resource is 20 dollars, as indicated by difference D in the above table for assignment map A.sub.0. The penalties for each of the operations are listed. The twenty-dollar penalty associated with operation Q.sub.11 is the largest of the penalties associated with the operations. Thus, Q.sub.11 is the maximum penalty operation of fourth step 14. Minimizing penalty means, in effect, avoiding the largest penalties. The minimum penalty heuristic thus assigns the greatest penalty operation Q.sub.11 to its lowest cost resource R.sub.1. The assignment of operation Q.sub.11 to resource R.sub.1 creates a new assignment map A.sub.1 which contains this assignment as its sole element. This assignment also necessitates a revision of the table for combined money cost:
TABLE V.sub.1
______________________________________
Product P.sub.1 Product P.sub.2
Q.sub.12
Q.sub.13 Q.sub.21
Q.sub.22
______________________________________
R.sub.1 3 6 26 28
R.sub.2 34 33 25 22
R.sub.3 31 34 12 X
D 28 27 13 6
______________________________________
where the corresponding assignment map A.sub.1 is:
______________________________________
Assignment Map A.sub.1
______________________________________
Q.sub.11 R.sub.1
Q.sub.12 unassigned
Q.sub.13 unassigned
Q.sub.21 unassigned
Q.sub.22 unassigned
______________________________________
Table V.sub.1 differs from Table V.sub.0 in two significant respects. First, there is no column for Q.sub.11, which has been assigned and therefore cannot be considered for the next assignment. Second, the combined costs associated with the assignments of Q.sub.12 and Q.sub.13 to resource R.sub.1 have been re-evaluated, in accordance with sixth step 16, to take into account the assignment represented in map A.sub.1. In particular, set-up times have been subtracted from the corresponding table entries. Seventh step 17 then initiates iterative loop 18. New assignment map A.sub.1 and the corresponding combined costs are then used in the second iteration of third step 13. The changes in combined costs greatly increase the favorability of assigning a product P.sub.1 operation to resource R.sub.1 to avoid additional set-up time. Examination of the difference row D indicates an assignment of Q.sub.12 to resource R.sub.1 to incur minimum penalty. Assignment of Q.sub.12 to R.sub.1 causes the column corresponding to Q.sub.12 to be removed in the table for map A.sub.2. No entries in row R.sub.1 are changed. The row R.sub.1 column Q.sub.13 is not changed because set-up time is not included in this entry. Row R.sub.1 columns Q.sub.21 and Q.sub.22 are not changed because they represent operations of product P.sub.2 rather than product P.sub.1 to which assigned operation Q.sub.12 belongs. Thus, no recalculation is required at this iteration. While the invention requires value adjustments for at least one step, adjustments are not required at every step. Table V2 represents the results after two iterations of the heuristic.
TABLE V.sub.2
______________________________________
Product P.sub.1 Product P.sub.2
Q.sub.13 Q.sub.21
Q.sub.22
______________________________________
R.sub.1 6 26 28
R.sub.2 33 25 22
R.sub.3 34 12 X
D 27 13 6
______________________________________
The corresponding assignment map A.sub.2 is:
______________________________________
Assignment Map A.sub.2
______________________________________
Q.sub.11 R.sub.1
Q.sub.12 R.sub.1
Q.sub.13 unassigned
Q.sub.21 unassigned
Q.sub.22 unassigned
______________________________________
Heretofore, the sample case has been treated as though there were no time constraints. In a capacitated resource allocation problem, there are time constraints. R.sub.1 may be a resource which is only available part time due to maintenance or other consideration. If Q.sub.11 and Q.sub.12 have consumed too much of the time available on R.sub.1, then Q.sub.13 would become incompatible with R.sub.1. This is indicated in the revised Table V.sub.2' below:
TABLE V.sub.2'
______________________________________
Product P.sub.1 Product P.sub.2
Q.sub.13 Q.sub.21
Q.sub.22
______________________________________
R.sub.1 X 26 28
R.sub.2 33 25 22
R.sub.3 34 12 X
D 1 13 6
______________________________________
This table dictates an assignment of Q.sub.21 to R.sub.3, resulting in Table V.sub.3 :
TABLE V.sub.3
______________________________________
Product P.sub.1
Product P.sub.2
Q.sub.13
Q.sub.22
______________________________________
R.sub.1 X 28
R.sub.2 33 22
R.sub.3 34 X
D 1 6
______________________________________
with the corresponding assignment map A.sub.3 :
______________________________________
Assignment Map A.sub.3
______________________________________
Q.sub.11 R.sub.1
Q.sub.12 R.sub.1
Q.sub.13 unassigned
Q.sub.21 R.sub.3
Q.sub.22 unassigned
______________________________________
These is no recalculation since Q.sub.22 is incompatible with the resource to which Q.sub.21 was assigned. On this fourth iteration, Q.sub.22 is assigned to its lowest cost resource R.sub.2, resulting in assignment map A.sub.4.
______________________________________
Assignment Map A.sub.4
______________________________________
Q.sub.11 R.sub.1
Q.sub.12 R.sub.1
Q.sub.13 unassigned
Q.sub.21 R.sub.3
Q.sub.22 R.sub.2
______________________________________
On the fifth iteration, Q.sub.13 is assigned to R.sub.2. The solution is the final map A.sub.5 :
______________________________________
Assignment Map A.sub.5
Operation Resource Cost
______________________________________
Q.sub.11 R.sub.1 14
Q.sub.12 R.sub.1 3
Q.sub.13 R.sub.2 33
Q.sub.21 R.sub.3 12
Q.sub.22 R.sub.2 22
Total 84
______________________________________
In accordance with seventh step 17, assignment map A.sub.5 is reported. The total cost of manufacturing products P.sub.1 and P.sub.2 is $84. While the foregoing example is illustrative of certain of its facets, the present invention is most advantageously used with problems involving many more variables. In the preferred embodiment of the present invention, both time and cost are tracked through each assignment. Time serves to define capacity limitations for the resources. The minimum penalty heuristic is applied multiple times using different parameters, and the results are compared. FORMALIZATION: CAPACITATED PROBLEM WITH SET-UP A preferred formalization for a capacitated manufacturing resource problem defines an optimal resource allocation as one that minimizes total money-cost, while observing capacity limitations on resources and taking set-up costs and times into account along with operational costs and times. In other words, the objective is to minimize V, where: ##EQU1## subject to: ##EQU2## Expression 1 describes the total production cost including operational costs and set-up costs. The symbols of expression 1 are used as follows: p is the product index; P is the total number of products; q is the operation index; a term with this index is zero when q exceeds the number of operations associated with the product; Q is the maximum number of operations associated with any product; r is the resource index; R is the number of resources; M.sup.o.sub.pqr is the operational money-cost associated with the performance of the q.sup.th operation of product p on resource r. M.sup.s.sub.pr is the set-up money-cost associated with the set-up of product p on resource r. This is an assignment-dependent variable and is distinguished from a set-up cost component of operational money cost, which is not assignment dependent. X.sub.pqr is the operation-resource allocation integer variable which assumes a value of 1 when operation q of product p is assigned to resource r and assumes a value of 0 otherwise; the binary character of this variable is defined in expression 5; and Y.sub.pr is the product-resource allocation integer variable which assumes a value of 1 when any operation of product p is assigned to resource r and assumes a value of 0 otherwise; the binary character of this variable is defined in expression 6. Expression 2 requires that resource capacity constraints be met. While listed as an equation, it is preferable to treat the relationship as greater than ".gtoreq." in an optimal iterative solution procedure. Variables included in expression 2, other than those just defined, are defined as follows: T.sup.o.sub.pqr is the operational time associated with performance of the q.sup.th operation of product p on resource r; T.sup.s.sub.pr is the set-up time associated with performance of any operation of product p on resource r; and B.sub.r is the total production time available for resource r. Expression 3 requires that all operations be performed. Expression 4 requires that set-up costs be attributed when a product is first assigned to a resource. Note that while complex cost is not made explicit in this formalization, it is implicit in the use of its components: money-cost and time. However, as the heuristics make clear, the assignment dependence appears in the form of the recalculations after each assignment is made. As indicated above, ADRAM requires selection of a parameter (i.e., cost, time, cost-time product) to evaluate possible operation-resource pairings. Since it may be difficult to determine a priori which parameter will result in the best solution, five different parameters are provided. The heuristic can be applied to the same data using each of the parameters to obtain different results. The results can be compared to select a best result. The five parameters respectively represent: money-cost, time, a cost-time quotient, a cost-time product, and cost-and-remaining-capacity. The application of these parameters is described below. V=Cost The cost-based heuristic attempts to minimize total money-cost of production, as defined in expression 1, by assigning operations to resources seriatim. The first operation assigned is the one for which a failure to be assigned to its most cost-effective resource would incur the largest penalty. Once this first assignment is made, a second assignment is made from the remaining operations and resources. This assignment and re-evaluation process is iterated until all operations are assigned, with cost-effectiveness being re-evaluated as necessary after each assignment. This cost-based heuristic can be described more formally as follows. Step 1. Attribute an operational cost and an operational time to each operation-resource pair; likewise, attribute a set-up cost and a set-up time to each product-resource pair. This is equivalent to attributing a complex cost to each potential operation-resource pair. The complex cost is the vector sum of a combined cost and a combined time for each operation-resource pair. The combined cost is equal to the operational cost plus the set-up cost for a given operation-resource pair when no other same-product operation has been previously assigned to the same resource. Otherwise, combined cost is equal to operational cost. Thus, combined cost is assignment dependent, even though operational cost and set-up cost are not. A similar relationship holds for combined time. Thus, the vector sum of combined cost and combined time, which is complex cost, is assignment dependent. Step 2M. Evaluate an initial combined cost by adding the set-up cost to operational cost for all compatible operation-resource pairs: M.sub.pqr =M.sub.pqr.sup.o +M.sub.pr.sup.s and assign infinite (very large) cost to incompatible operation-resource and product-resource pairs. Step 2T. Evaluate an initial combined time by adding the set-up time to operational time for all compatible operation-resource pairs: T.sub.pqr =T.sub.pqr.sup.o +T.sub.pr.sup.s and assign infinite (very large) time to incompatible operation-resource and product-resource pairs. In a capacitated resource allocation problem, i.e., one in which there are time limitations on resource availability, combined cost is a function of time as well as of cost. Thus, the requirement of step 2T. Prior assignments affect the time available on a given resource. When this time falls below that required for a given unassigned operation to be performed on that resource, the resulting incopatibility affects the next assignment. The heuristic can represent the incompatibility by an incompatibility status flag, e.g., "X" in table A.sub.o above, or by setting combined cost a infinity or some very large number. In a capacity-constrained problem, the parameter really has three potential components, an operation cost, a set-up cost and a cost tied to available capacity. The parameter can be considered a capacity-qualified combined cost. The last cost can be zero or infinite depending on whether capacity is available. Intermediate values can also be provided for where a formula is provided for equating time and money. Step 3. Determine the most effective and second most effective resources for each unassigned operation. In this case, most effective is equivalent to lowest cost. Step 4. Find the cost difference (M.sub.pq2 -M.sub.pq1) between the minimum cost resource and the second minimum cost resource for all operations. Find the maximum difference over all operattions from step 3. This is the maximum penalty, and the associated operation is the maximum penalty operation. "M.sub.pq1 " designates the money-cost associated with the lowest cost resource for operation q of product p. Likewise, "M.sub.pq2 " designates the money-cost associated with the second-lowest cost resource for operation q of product p. Step 5. Assign the maximum penalty operation to its maximum effectiveness, i.e., minimum cost, resource. Step 6. For all other operations which pertain to the product to which the assigned operation belongs and which can be performed on the assigned resource, set combined cost equal to operational cost and set combined time equal to operational time. Reduce the available capacity for the assigned resource by the amount of time taken by the assigned operation. Check for capacity shortage for all remaining operations of all products which are compatible with this resource. Assign infinite (or very large) cost and time to operation-resource pairs for operations that can no longer be performed within the capacity constraints of this resource. Remove the assigned operation from further consideration for assignment in the iterative process. Step 7. Repeat steps 3-6 until all operations are assigned or until an infeasibility is detected, i.e., no resource is available to perform a given operation. In the latter case, the heuristic has failed to provide a solution. In the former case, all operations have been assigned to resources and capacity constraints. The solution should be near minimum cost. A failure to reach a solution due to lack of resource capacity indicates that a parameter should be selected which is more sensitive to capacity constraints. Of course, no parameter will result in a solution is the problem is truly infeasible. V=Time Using time as the parameter tends to minimize manufacturing time. Thus, time is a better parameter than money for problems with tight capacity constraints. Operations are assigned to resources seriatim, as with the cost-based heuristic. However, the objective of each assignment is to avoid time penalties rather than cost penalties. The time based heuristic can be described more formally as follows. Step 1. Present set-up and operational data that can be used to attribute complex cost. This is the same as for the V=cost embodiment and the three following embodiments. Step 2. Add the set-up time to operational time for all compatible operation resource pairs and set-up cost to operational cost as in the costbased heuristic. The parameter of interest is capacity-qualified combined time, with the capacity qualification being implicit in the term "compatible". Step 3. Determine the shortest time (most-effective) and second shortest time resource for each unassigned operation. Step 4. Find the time difference (T.sub.pq2 -T.sub.pq1) between minimum time resource and second minimum time resource for all operations. Find the maximum difference to determine the maximum penalty operation. Step 5. Assign the maximum penalty operation to its minimum time resource. Step 6. For all other operations which pertain to the product to which the assigned operation belongs and which can be performed on the assigned resource, set combined cost equal to operational cost and set combined time equal to operational time. Reduce the available capacity for the assigned resource by the amount of time taken by the assigned operation. Check for capacity shortage for all remaining operations of all products which are compatible with this resource. Assign infinite time to operation-resource pairs for operations that can no longer be performed within the capacity constraints of this resource. Remove the assigned operation from further consideration for assignment in the iterative process. Step 7. Repeat steps 3-6 until all operations are assigned or until an infeasibility is detected, i.e., no resource is available to perform a given operation. In the latter case, the heuristic has failed to provide a solution, probably because the problem is infeasible. In the former case, all operations have been assigned to resources and capacity constraints. The solution should be near minimum time. V=Cost Time Quotient The cost-based and time-based heuristics described above are, in a sense, extremes. In the first case, cost is considered without much sensitivity to time and, in the second case, time is considered without regard to cost. In many situations, both time and cost must be considered in finding an optimal production solution. Selecting a parameter which takes both time and money into account can provide an optimal solution when capacity constraints are of intermediate severity. Accordingly, a cost-time-quotient heuristic can be formalized as follows. Step 1. Presentation of set-up and operational cost and time data from which complex cost can be attributed. Step 2. Calculate combined money-cost and combined time for all operations. Once again, the complex parameter is capacity qualified. Step 3. Determine the lowest combined cost resource for each operation. Step 4. Calculate the comparison D.sub.pq =(M.sub.pq2 -M.sub.pq1)/T.sub.pq1 for all operations. T.sub.pq1 is the operational time associated with operation q of product p and the lowest combined-cost resource for operations belonging to product p. Find the maximum difference D.sub.pq ; the associated operation is the maximum penalty operation. Step 5. Assign the maximum penalty operation to its minimum combined money-cost resource. Step 6. For all other operations which pertain to the product to which the assigned operation belongs and which can be performed on the assigned resource, set combined cost equal to operational cost and set combined time equal to operational time. Reduce the available capacity for the assigned resource by the amount of time taken by the assigned operation. Check for capacity shortage for all remaining operations of all products which are compatible with this resource. Set an incompatibility flag or assign infinite or a very long time to operation-resource pairs for operations that can no longer be performed within the capacity constraints of this resource. Remove the assigned operation from further consideration for assignment in the iterative process. Step 7. Repeat steps 3-6 until all operations are assigned or until an infeasibility is detected, i.e., no resource is available to perform a given operation. In the latter case, the heuristic has failed to provide a solution. In the former case, all operations have been assigned to resources and capacity constraints. The final assignment map is reported. V=Cost Time Product As with the cost-time-quotient heuristic, the cost-time-product heuristic takes both time and cost into account, but with increased emphasis on time. Hence, in practice, the cost-and-time-product-based heuristic is more similar to the time-based heuristic than to the cost-based heuristic, and is best suited for situations with very tight capacity constraints. Formally, this heuristic is the same as the cost-time-quotient heuristic except that the comparison D generated in step 4 is (M.sub.pq2 .times.T.sub.pq2)-(M.sub.pq1 .times.T.sub.pq1) for all operations, where the subtrahend is the second minimum capacity-qualified product and the minuend is the minimum capacity-qualified product for each operation. V=Cost Qualified by Remaining Capacity In the cost-capacity heuristic, cost differences are weighted by capacity constraints, which vary as assignments are made. The results of this heuristic come closer to minimum cost than to minimum time. Since this heuristic considers both cost and time (capacity), it is procedurally similar to the cost-time-quotient heuristic. The difference is in the comparison applied in step four: ##EQU3## B.sub.1 represents the initial capacity of the lowest cost resource for operation a of product p. The double sum in the numerator represents the total time taken by other operations assigned to this lowest cost resource. Thus, the right-hand expression in the numerator represents the remaining capacity available to the lowest cost resource. Note that the indices p and q in the double summation are in italics to distinguish them from the indices p and q outside the double summation. Combining Results Generally, the five parameters and heuristics described above generate five different solutions. Since some of the heuristics may fail to find a existing solution, the use of multiple parameters increases the probability that at least one solution will be found. Of course, if the problem is infeasible, none of the heuristics will yield a solution. In addition, the use of multiple heuristics increases the likelihood that a near optimal solution will be found. Each solution will result in an associated total money cost and a total time, making selection of a best result among the five rather straightforward. No ad hoc juggling of results is required to make this selection. Generalized ADRAM Heuristic The foregoing heuristics are formalized in the form that is best suited for the objective of minimizing expression 1. However, a different formalization is required to provide the full generality of the ADRAM. The first step is to divide all operations into two sets, assigned operations and unassigned operations. Each of these sets has a whole number of elements at any given time. Each assignment of an operation to a resource transfers one operation from the unassigned set to the assigned set. The assigned set corresponds to an assignment map A.sub.a of operation-resource pairs A.sub.pqr. The assignment of a given unassigned operation to a resource has an associated complex cost C.sub.apqr, which is a function of the current assignment map A.sub.a, the q.sup.th operation of product p, and the resource r to which the operation is assigned. Complex cost, as indicated above, is a two-dimensional construct encompassing money-cost and time-cost. Thus, an equivalent formalization can address complex cost implicitly by referring to simple cost and time. In the examples given above, the assigned sets and the assignment maps have been unordered. In other words, the dependence of the effectiveness-related parameter depends only on the contents of the assignment map. The invention also provides for assignment dependence where the parameter is a function not only of the contents of the assignment map but also on the order in which the operation-resource pairs were entered into the assignment map. The optimization achieved by ADRAM is dependent on the parameter selected to evaluate operation-resource pairs, the intra-operation comparison function used to measure differences between pairs associated with the same operation, and the inter-operation comparison function used to select a "worst" penalty to avoid. The parameter is selected to be a function of complex cost. As such, it can be a function of money-cost alone, time alone, or a combination of time and money. Furthermore, the parameter should be selected so that a best and a second best value can be identified. In all the foregoing examples, the lowest value was the best value. However, ADRAM works just as well by taking the inverse of each value and selecting the highest value as the best. More generally, the best, or most "profitable" value can assume positions other than highest or lowest. In any case, any parameter for which best values can be determined can be converted to a parameter in which the best values are the lowest. Hence, it is sufficient to require that the parameter be selected so that best is lowest, requiring alternative formalizations be mathematically equivalent. Parameter selection determines which resource is the best resource and which is the second best resource. Selection of the comparison function determines how the worst penalty is determined. The first comparison is an intra-operation comparison function used to measure the penalty involved in selecting the second best resource instead of the best resource for a given operation. Subtraction is used above in conjunction with the time, cost, and time-cost-product parameters discussed above. While subtraction is usually considered an operation rather than a function, it can be considered a function of the form z=f(x,y) where y is the minuend, x the subtrahend, and z the difference. The comparison functions for the cost over set-up time and the cost-and-remaining capacity heuristics were used with more complex intra-operation comparison functions. Once the intra-operation comparisons are made, it is necessary to select the inter-operation comparison corresponding to the greatest penalty. With proper selection of the parameter and the intra-operation comparison, this will simply be the greatest intra-operation comparison value. On the other hand, it is possible to use inter-operation comparisons other than a maximum to determine worst penalty. However, formulations using such inter-operation comparisons can be shown to be mathematically equivalent to the claimed formalizations using only maximums. The methods described above are applied to resource allocation. The can be applied for any planning period or set of jobs. The speed and economy with which solution can be attained permits their application to short-term planning problems which could not be solved previously using conventional methods. In addition, longer term problems which where too expensive to solve can be addressed economically by ADRAM. The present invention can also be used for several other related purposes. For example, the methods are useful for determining which resources should be purchased. Capital purchase decisions can be implemented by including in the initial cost associated with an operation-resource pair the purchase price of a resource, e.g., machine. Once that resource has had an operation assigned to it, the purchase price of the resource is eliminated from consideration in determining maximum penalties in the assignment of other operations. Thus, ADRAM accommodates "fixed-cost" considerations, as well as set-up cost. On a larger scale, ADRAM can be used for factory design. In addition, ADRAM can be used to choose between making and buying certain products. In addition to handling relatively conventional formalizations where cost is to be minimized subject to time-capacity constraints, the invention also handles different problem definitions. For example, time can be minimized subject to cost limitations on the use of particular resources. The foregoing embodiments, modifications thereto, and variations thereupon are provided for by the present invention, the scope of which is limited only by the following claims.
|
Same subclass Same class Consider this |
||||||||||
