Tải bản đầy đủ - 0 (trang)
9 OS-3: Minimum Total Capacity with Limited Oversubscription

# 9 OS-3: Minimum Total Capacity with Limited Oversubscription

Tải bản đầy đủ - 0trang

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

The edge reduction guideline of Equation 9.45 can also be viewed simply as an initial criterion that can be followed by any further

limitations necessary or warranted. For instance with k=4, dmax = 5 the edge space of a 26 node problem is reduced from 190 candidate

edges to 76. Using heuristic methods that follow we may be able to work with 76-edge candidates, but often that will still be too many to be

practical. Seventy-six candidate edges corresponds, however, to an actual ratio of candidate edges to nodes of 7.6. Even though we used

dmax = 5, the large number of extra candidates are admitted by thek=4 criterion, so k=3 could be asserted instead. Ultimately of course,

case by case inspection of the edges for "plausible appearance" in an optimal solution can be used to further reduce the edge set.

Additional criteria for acceptance or rejection can be based on absolute properties of each edge candidate. All edges below a certain low

absolute distance or cost may be considered worthwhile exceptions to the basic rule. Conversely, if the maximum geographic diameter of

a network region was say 1,000 km, or the average nodal distance to a nearest neighbor was (say) 200 km, then one might assert that in

addition to any eliminations by the basic dmax criterion, any single prospective edge over 800 km will not be considered.

[ Team LiB ]

.

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

[ Team LiB ]

9.12 Successive Inclusion Heuristic

The Successive Inclusion (SI) heuristic (initially called Iterative Sampling in [Ezema03]) offers a way to check or partially guard against

greediness effects from edge limiting and/or to permit more aggressive initial edge limiting as may be necessary on larger problems. The

idea is to provide an initial set of candidate edges and solve for the optimum topology within that edge set to start. Then, each edge that

was part of the true universe of edges for the problem but was not included in the initial design is readmitted for consideration in a series

relatively fast subsequent runs of the topology design problem. The overall process is still suboptimal but, in practice, it performs quite

anything if you had this edge to work with too?" Of course this misses the possibility that edgex would only be chosen in the presence of

edge y, both of which were initially excluded edges, but it does "mop up" on any first order opportunities to include good edges that were

initially omitted. To the extent that certain elements or choices tend to be "good ideas" in combinatorial problems, this heuristic will be

effective. What we mean by this is that if an edge tends to be a "good idea"—in and of itself, set in almost any backdrop of other edge

combinations—then Successive Inclusion will work well to backstop or improve on the quality of edge-limited designs, because it makes

sure that the edge limiting process did not exclude any really important (i.e., useful) edge.

Successive Inclusion can actually use any initial (biconnected) topology design and universe of edges. We assume that MTRS with

reduced edge sets, or the 3-step heuristic for MTRS are used as the basic solution technique in conjunction with Successive Inclusion.

First, let us define:

Euniv = the set of all candidate edges for the problem.

Elim = the edge-limited set of edge candidates. Obviously Elim

Euniv .

th

Eopt(n) = the set of edges included in the n iteration.

MTRS(E) = the MTRS solution procedure given edge set E, returns Eopt

E.

Then the procedure is:

Successive Inclusion:

n:=1; Eopt(n):= MTRS(Elim);

for every edge i in {Euniv -Elim): {

Eopt(n+1):= MTRS(Eopt(n)

n:=n+1}

i);

The reason this works well is the understanding that an edge solution found from an edge set E can never worsen when presented with a

larger edge set {E+i}; it can only improve. Thus, in the first step above, an initial topology is found within the reduced edge set. In the main

loop that follows, each edge that was initially excluded is individually reintroduced. The new edge could be included if its effect is to reduce

capacity costs more than its own cost, or MTRS may revise its prior edge choices given the opportunity to consider {Eopt +i} and adopt the

new edge i, while dropping one or more other edges from the prior solution. If edgei is not adopted we can be satisfied that its addition

(individually) to the initial edge set would also not have had any effect because the solution cost of MTRS(E) is always

Any improvements found in the main loop are implicitly retained in Eopt(n).

MTRS(E+i).

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks.

To use Successive Inclusion it is still always best to solve the initial MTRS problem on the largest reduced edge set that is practicable. But

SI allows us to approach larger overall problems than we otherwise could tackle at the same solution quality. For instance an 11-node

problem with its universe of 55 edges might be edge-limited to 28 edges. Twenty-eight edges is equivalent to the universal edge set for an

eight-node problem, which we can solve directly with MTRS in about a minute. Say this results in selection of an initial topology with 20

edges (i.e.,

~3.6). The initial MTRS run is then followed by 55-28 = 27 further runs of MTRS with (nominally) 21 edges (in principle the

number of edges could go either back up or down). Assuming the average edge size of subsequent runs stays about 21, these MTRS

(28-21) 7

problems are roughly 2

= 2 times faster than the initial MTRS run. The overall procedure is thus vastly faster than the initial

55

problem involving 2 edge combinations. And although strictly suboptimal, in practice it often does match the fully optimal MTRS solution

where the latter are available.

Note that there are several options for the initial design step in SI. It could be a full MTRS solution on the reduced edge set, or, an

application for the 3-step heuristic for MTRS in which case a larger reduced edge set can usually be handled at the initial stage. Ezema

used a minimum spanning tree, repaired for biconnectivity, with addition of a set of further candidate edges selected from edge-limiting as

the Eopt(1) initial edge set and observed SI to accumulate the added edges and make other revisions to the solution topology as needed

to reach the optimal solution. Figure 9-25 shows two selected results for the COST-239 network of 11 nodes and universe of all 55

possible edges. The problem uses the published COST-239 demand matrix, Euclidean distances as edge costs and

=25. A set of 26

candidate edges was assembled from a repaired MST graph (17 edges, d =3.09) plus 9 edges from the universal edge set for this

problem, chosen by edge-limiting. The topology shown at the end in Figure 9-25 is the optimal topology with final d = 2.91 (16 edges).

Topology changes occur only when a new edge inclusion is used in the solution or the new edge permits removal of some existing edges,

as in Figure 9-25(c), (d). The broken lines indicate edges that were part of a prior solution but were deleted following addition of a new

edge. Several different sets of 26 edges were tested and all quickly converged to the 16-edge topology that we believe is actually optimal

at the total cost shown based on separate runs of the 3-step heuristic on 39 edges out of the entire edge-set of 55.

Figure 9-25. Trajectories of SI runs on COST-239 11 node problem starting from repaired MST.

[ Team LiB ]

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

[ Team LiB ]

9.13 Graph Sifting and Graph Repair for Topology Search

The edge-limiting heuristic can be applied ahead of time to any MTRS-type problem. Whatever solution method is used, the inherent

problem complexity is reduced, benefitting runtime for any type of subsequent solver. Indeed edge set reductions alone can be combined

with the 3-stage heuristic to obtain high quality solutions to MTRS problems of up to around 20 nodes in practice, or 30 nodes if more

aggressive edge set reduction is applied. But what if we want to solve even larger topology problems and/or we want a separate method

to use as a cross-check on larger designs? To go to larger problem sizes it is quite clear that we have to entirely remove the topology

search subproblem from the sphere of the MIP solver. In this section we explain a procedure to generate "qualified" random graphs to

drive a search on topology in which the MIP is used only to evaluate the capacity costs associated with each candidate graph. The

important difference is that our search will be over the space of qualified graph candidates directly, not single-edge decision variables. By

no longer operating on the space of edge candidates we avoid the vast number of edge vectors that do not even specify a qualified graph,

but which ultimately completely defeat the 1/0 MIP at larger problem sizes.

The basic idea is called "graph sifting." It is based on the realization that among the space of all possible free edge decision vectors, only a

small fraction of these are even plausible or qualified for detailed consideration as the basis for a cost minimal transport network. More

specifically we know that simply to be qualified, a candidate graph must be biconnected or two-connected. We also know that to be even

plausible as the basis for an optimal solution in practice, the graph must be relatively lightweight. The initial sifter idea is thus to implement

a series of extremely fast and simple procedures to apply increasingly targeted but easily implemented sifting criteria, so that all that falls

out at the bottom of the sifter are plausible topologies for detailed routing and capacity design. The graph sifter can work directly to

enumerate and discover all qualified graphs directly by sifting on suitably sized problems. At larger problems, however, so much sifting

time can be spent before finding even one qualified graph that a better strategy is to "repair" unqualified graphs, thereby producing a

series of candidate graphs. The edge cost of each candidate is trivial to evaluate and the MIP solver can quickly assess the capacity cost

of any given candidate graph. The concept of the sifter alone is portrayed in Figure 9-26. The logic of the graph sifter coupled with a graph

repair process is illustrated in Figure 9-27.

Figure 9-26. Concept and architecture of graph sifter approach to optimizing topology.

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

Figure 9-27. The graph sifter with repair process to enumerate graph candidates [Ezem03].

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

9.13.1 Graph Generation

The output of the graph generator is a binary word of width equal to the number of edge decision variables. Existing edges are

represented as hard wired bits (set to 1) in the "counter." Each time the binary counter advances, its' word is processed by the graph

sieve. In this role a binary counter has the property that it would enumerate every graph combination, although at sizes of interest this may

be impossible in practice. A binary counter also tends to specify graphs with high average weight. If exhaustion of the graph space is not

the aim, then a large random sample of edge combinations is more desirable and bit-wise random generation is preferable.

For bit-wise generation each edge is considered individually and set to one with a probability p. For each slot in the edge vector, a random

number in the range [0, 1] is generated. If the number is less than or equal to p, the slot is set to 1, otherwise it is set to 0. The function

used to determine p leads to the different models for generating random graphs.

In a pure random model p can be set based on plausible maximum nodal degree considerations, so as to directly generate edge vectors

with weight biased into the region of interest. If we want graphs of average nodal degree of 5 for a 10-node network (i.e., 10 nodes with 25

edges on average) out of a possible maximum of 45 edges, we would set p = 25/45 = 0.56. The fixed probability model does not, however,

reflect the structure of real network topologies because any two nodes are as likely as others to become connected.

Other random graph generation methods include Waxman's model [ZeCa96],

Equation 9.46

where d is the Euclidean distance between nodes u and v, L is the network diameter (maximum Euclidean distance between any two

nodes) and a >0 and b <1 are model parameters. Increasing a raises the number of edges. Increasing b raises the probability of a long

edge. If we set b=(L-d)/L we get a pure exponential random graph model where the probability of a diameter-long edge goes to zero. One

problem with these random models is that unless biased to high average edge probabilities, they are unlikely to produce a connected

graph. For instance at a =0.2 and b = 0.15, graphs with d~ 3.5 result but are almost never connected. This is one of the reasons for

considering algorithmic graph generation methods.

Algorithmic graph generation methods provide a way for us to generate graphs that are at least connected. Some such methods are

described below.

A vertex n is selected at random from all nodes in the graph as the start node and is added to the record of nodes visited. At

n, the shortest

candidate edge is added to an adjacent node v. Node v becomes the next node to be visited and is added to the record. Atv, the shortest

candidate edge not yet in the graph is added. This process is continued until the record of nodes visited contains all nodes in the graph, at

which time a random connected graph has been produced. A tie occurs if the edge selected from a vertex v has its other vertex n already

"linked" in the graph or vertex n has all its candidate adjacent neighbors already linked. To break a tie, we choose another vertexu

randomly from the linked vertices such that u has a candidate adjacent node w that is not yet linked. From vertex w, the nodal linking

process continues.

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

Two Trees

This graph generation method is the only graph generation method that directly produces a qualified graph candidate without the need for

applying a repair heuristic. It is a variant of the Two Trees Dense graph construction heuristic described in [MoSh89]. The method involves

combining two trees formed on graph G=(V,E) to form a graph G'=(V,E'). The first tree is a minimum cost spanning treeT=(V,E'). The

second tree T' is formed on graph G'=(V,E-E'). Where all nodes have the same survivability requirements (i.e., biconnectivity or two-node

connectivity), we choose the second tree as a minimum cost spanning tree formed on the graph G'=(V,E-E') with no edge of T reused.

This method generates two-node connected (but dense) networks and is illustrated in Figure 9-28. In Figure 9-28(a), the solid lines show a

minimum spanning tree T for the 7-node, 21-span network.Figure 9-28(b) shows a minimum spanning treeT' for the graph after the edges

of T are removed. Figure 9-28(c) shows the resultant graph G'=(V,T

T').

Figure 9-28. Example of two-trees method of random generation of biconnected graphs.

To obtain random biconnected graphs using the two trees method, each tree need not be a minimum spanning tree for its subgraph. Any

tree-forming procedure, including one based on simple node linking can find a first tree T. Numerous complementary T' can then be found

for each T. Note that in most actual transport graphs if we find and remove one treeT, a second tree T' is often not feasible as removal ofT

would often disconnect the graph. It is important, therefore, to realize that when used in our context the initial graph G=(V,E) is based on

the universal set of edges, or, more generally, E at least contains all candidate edges for the problem.

9.13.2 Graph Testing

The principle for ordering the sieve tests is to apply the simplest to execute first, so that by the time required in the more complex

qualification tests, such as for biconnectivity, is invested only for a small fraction of all graph candidates. When a qualified graph is

identified it is passed to a separate process for routing and capacity cost evaluation. We first describe the basic sifting criteria, then

comment on the repair strategy for each criterion if it is failed.

Tests for Minimum and Maximum Edge Count

A graph that is either biconnected or two-connected always contains at least N edges. This tells us that the minimum number of edges a

qualified graph has should be N. So any edge vector containing fewer thanN logic ones is rejected. There is also a maximum edge weight

disqualifier. Based on knowledge that no real network (that we know of) has a physical-layer

> 4.6 or so, we can fairly safely assert, let

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

us say,

= 6. We can be confident of this requirement having no deleterious effect on the solution quality but it sieves out an

enormous fraction of graphs. Moreover it is in the nature of the problem that if this limit was having any effect, we would notice solutions

coming out around

and could then shift the search window up accordingly. Once a view of

Smax =

· N/2 as the maximum number of ones in the edge vector. In an evolutionary planning context the

be set with the complete network of both old and new portions in mind as a whole.

criterion would

Tests for Individual Nodal Degree

In a two-connected or biconnected graph every node will individually be of at least degree 2. Otherwise it is a singly-connected stub node

and their is no point bothering with the later more complex tests. If all nodes in the graph formed of the existing edge set, any added

nodes, and the current variable edge vector have degree 2 or more, the edge vector goes on to the next sifting stage. Otherwise it is

discarded and the graph generator is incremented, or repair is effected before continuing.

Test for Edge Cost Above Best Bound

The next simplest test on the candidate edge set is to ask if the sum of the fixed costs of the edges it embodies already exceeds the

lowest cost yet seen for a complete design. This test is available after the sifter solver system has evaluated a number of candidate edge

sets but it takes advantage of the fact that if the fixed charges of the current edge set exceed the lowest cost of any complete design yet

seen, then the candidate vector can be rejected because it cannot possibly be the basis of a lower-cost complete design solution.

Test for a Connected Graph

At this stage we know the candidate edge vector has a reasonable number of edges, each node is individually degree 2 or more, and the

sum of fixed edge costs is not above bounds. These tests get rid of many candidates and are extremely fast as they involve nothing more

than counting and comparison tests. But we do not yet know if the edge vector is describing a connected graph in its own right (for green

fields use) or describes a connected graph in conjunction with the existing network (for evolutionary planning). At this point we are forced

to start applying more complex disqualification tests and one could ask why not apply the test for two-connectedness or biconnectivity (as

desired) right at this stage. The test for simple connectivity is still quite fast, however, and rejects many candidates. In addition, the

subsequent tests for biconnectivity or two-connectedness are based on algorithms that look for bridge spans or nodes and therefore

requires a confirmation of basic connectivity before they can be properly applied. A rapid procedure to test if the graph G is a single

connected component is to start at any node as a root node, and step out to each of its adjacent nodes called its neighbors. Each span

traversed to reach a neighbor is marked. From each neighbor node, its own neighbors are visited also, but only unmarked edges are

traversed. A record is kept of all nodes visited. When all connected nodes have been visited, the visited node record is checked to ensure

that it contains all nodes in the graph. If it does, G has passed the test and goes on to be tested for two-connectivity. Otherwise it is

Only one of the final two tests need be implemented, depending on whether the design criterion is for two-connectivity (may contain a

bridge node) or biconnectivity (excludes bridge nodes). Each of the following tests can be implemented with space and time complexity of

O (n + m) where n = number of nodes and m = number of edges, using the algorithm for that purpose from BaGe00]

[

which was reviewed in

detail in Section 4.8.

Test for Two-connectivity or Biconnectivity

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

For a connected graph G, its edge connectivity l(G) is the size of the smallest cutset in G. In general G isk-edge connected if l(G)

k. A

graph that is not two-edge connected contains a cutset with only one edge, called a bridge. This test checks the graph G for the existence

of a bridge edge. If none exists, G has passed the test and is released as a qualified graph on which to solve the routing and capacity

design problem.

The concepts to test for biconnectivity are analogous, but using nodes instead of edges. If G is connected and not a complete graph, its

(node) connectivity K(G) is the size of the smallest separating set in G. A separating set in G is a set of nodes whose removal disconnects

G. If the separating set contains only one node, the node is called a cut vertex (or bridge node). We then say that G is k-connected if k(G)

k. A biconnected graph is one that is connected and contains no cut vertex. A graph that is not two-connected contains a separating

set with only one node, the cut vertex. This test checks the graph G for the existence of a cut vertex. The number of bi-components in G

signifies the presence or absence of a cut vertex. A bicomponent is defined as a maximally connected subgraph of G. If G has more than

one bicomponent, a cut vertex exists and G is discarded. Otherwise, G represents a valid graph that can be passed on to the final solver

for further optimization of routing and capacity.

9.13.3 Repair Procedures

If sifting with repair is implemented, the repair at each stage only corrects the "local" deficiency being tested for, and does not lead directly

to a fully qualified graph. For instance if a stub node is found, an edge is added to correct this deficiency, even though other flaws may

remain to be found by further criteria in the sifter. The repair heuristics are simple specific routines that deal with each particular graph

property. For example, if a graph fails the test for maximum or minimum span count, the routine to repair the graph would be to add or

remove edges to/from the graph respectively, until the weight of the graph is within the desirable range. If the graph fails the stub node test

we add an adjacent edge to each such node connecting it to a new nearby node. For the tests of connectivity and so on, the repair routine

first finds the components in the graph. Then an edge is added between nodes in different components. The respective test is repeated

and new components (if any) are identified. Edges are added between nodes in different components until the graph is connected,

two-edge or two-node connected as desired. For the best bound test on edge costs, the repair routine exchanges high cost edges with

lower cost edges until the graph cost is at least below the total cost of the best complete design yet seen.

[ Team LiB ]

.

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

[ Team LiB ]

9.14 A Tabu Search Extension of the Graph Sifter Architecture

Another tactic that can be applied within the graph-sifter framework draws from ideas of "tabu search" (Section 4.18.3) to accelerate the

process of eliminating candidate edge combinations. This is suggested by the block entitled edge decision frequency-quality metrics in

Figure 9-26 and the outer dashed loop suggesting how certain edges might gradually be pinned to either 1 or 0 as an increasing number

of complete solutions are observed. The basic principle is that in many combinatorial optimization problems, certain elements or choices

are frequently associated with being part of a good overall design. Here, the idea would be to keep a running count of how frequently

each edge appears in low cost designs and how often a high design cost correlates with its absence. A frequency quality metric for this

can be of the general form:

Equation 9.47

th

where dj(k) is the 1/0 decision outcome regarding edge j in the k complete design andC is just an arbitrary constant, characteristic of a

typical design cost. dj(k) values apply in evaluating M j(k) whether edge j is currently a free variable or if, as a result of the strategy below,

it has been forced to 1 or 0. In Equation 9.47 the merit of span j, Mj(k), is updated on every completed design. Either the edge was used

and it was part of a good design, in which case the first term weights it with the cost savings of that design relative to the bias constant C,

and vice-versa. Conversely, a judgment is made about the quality of the designs in which edge j is not employed, in the second term. If

there is no correlation either way with overall design quality and the employment of edge j in the design, M j(k) will bobble around close to

C. On the other hand if edge j is usually a good or a bad decision,M j(k) will drift up or down, away from C, respectively. Thus, a TS-like

policy could be implemented to structure the search as follows:

Equation 9.48

Under this policy the complete edge decision search space would be reduced and the search guided when there is no accumulating

evidence or experience of particular edges being either effective or not, they remain as free edges in the enumeration of graph

candidates. But some edges build a history and get firmly asserted or deleted from the graph candidates inspected in the ongoing

search. Note that the M j(k) values continue to evolve even after an edge crosses the threshold where it is forced in or out of the graph

generation, so a given edge may come in and be firmly held through a certain range of the enumeration space, then dropped out again

later. The thresholds of +/- 2C for forced inclusion or exclusion of an edge inEquation 9.48 is an arbitrary example of how the thresholds

could be set. More formally the thresholds should be set based on observing some criterion like the 1-s cost offset from the mean. Note

that while the basic sifter architecture, run to exhaustion of the free edge counting range, can claim optimality in its result, addition of the

outer loop of frequency-quality metrics and edge assertion thresholds, converts the entire procedure into a form of tabu search algorithm

which may find good solutions more quickly than the exhaustive sifter, but will no longer be an optimal solution algorithm.

[ Team LiB ]

.

This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks

[ Team LiB ]

9.15 Range Sweeping Topology Search

We close the chapter by describing a technique for searching systematically (rather than randomly) through a plausible region of nodal

degree for a detailed topology construction that yields minimum MTRS cost. Using the nodal degree and cost information derived from the

ongoing search, we adaptively narrow the search bracket to search even more closely over the region within which we believe an optimal

graph topology may lie. Called "Sweep Search," the idea exploits the fact that we know from first principles and preliminary studies that

there is a nearly continuous curve of total costs versus connectivity with a unique minimum basin seen in curves such as in Figure 9-6. If

we presume bounds on nodal degree dmin to dmax then sweep search can be used to traverse this region, for as many passes as desired,

enumerating detailed graph constructions within the plausible region.

The procedure has two main phases. One phase is the pare-down procedure already outlined in Section 9.4. In the previous pare-down the

edge with the least working flow crossing it is removed at each iteration, if its removal does not violate biconnectivity. Here, however,

random selection of an edge for removal is a preferred means to explore different graphs on each sweep. The process is repeated until no

edge can be removed from the graph without violating biconnectivity constraints or the average nodal degree of the graph is dmin. The

process reverses here and starts over with edge additions replacing edge removals. To the sparse graph we now have, we add an edge,

and pass the graph to the solver for routing and capacity design. We continue to do this until the graph has an average nodal degree of

dmax. Thus, we never lose biconnectivity throughout the search but are always evolving the actual graphs being considered, walking them

back and forth through the region where the optimum is thought to lie. The test for biconnectivity uses the O(m+n) algorithm of Section 4.8.

When we walk from a highly connected graph to a sparse graph, we call it "pare-down." Similarly, walking from a sparse graph and adding

spans is to "pare-up." A pare-down plus a pare-up sequence is called a "sweep." For each sweep, the nodal degree d of the graph that

produces the lowest edge plus capacity cost and its cost are noted. The search sweeps back and forth through the "plausible region" as

long as desired, constructing different detailed topologies and evaluating their total design cost. The overall search can be progressively

narrowed by adding an observer process that records the local_best_found solution at each d value in the sweep range and using this

information to periodically narrow the dmin to dmax search bracket. The idea is to observe the minimums of total design cost achieved at

each d value in the sweep range and pull in and re-center the actual search bounds as enough

local_best_found(d) data is observed to

produce sufficient monotonicity and contrast between the absolute best_found at the extreme values of the search ranged. Figure 9-29

illustrates the overall idea.

Figure 9-29. Concept of oscillating sweep search strategy for detailed topology construction

with adaptive narrowing of the search bracket. ### Tài liệu bạn tìm kiếm đã sẵn sàng tải về

9 OS-3: Minimum Total Capacity with Limited Oversubscription

Tải bản đầy đủ ngay(0 tr)

×