Integer Linear Programming CONTACT@ADAMFURMANEK.PL - - PowerPoint PPT Presentation

integer linear
SMART_READER_LITE
LIVE PREVIEW

Integer Linear Programming CONTACT@ADAMFURMANEK.PL - - PowerPoint PPT Presentation

Integer Linear Programming CONTACT@ADAMFURMANEK.PL HTTP://BLOG.ADAMFURMANEK.PL FURMANEKADAM 1 25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK About me Experienced with backend, frontend, mobile, desktop, ML, databases. Blogger,


slide-1
SLIDE 1

Integer Linear Programming

CONTACT@ADAMFURMANEK.PL HTTP://BLOG.ADAMFURMANEK.PL FURMANEKADAM

INTEGER LINEAR PROGRAMMING - ADAM FURMANEK 25.07.2020

1

slide-2
SLIDE 2

About me

Experienced with backend, frontend, mobile, desktop, ML, databases. Blogger, public speaker. Author of .NET Internals Cookbook. http://blog.adamfurmanek.pl contact@adamfurmanek.pl furmanekadam

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

2

slide-3
SLIDE 3

Agenda

Declarative programming at a glance. Some theory. Real life example. Implementation consideration. Summary.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

3

slide-4
SLIDE 4

Declarative programming

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

4

slide-5
SLIDE 5

Declarative programming

Paradigm that expresses the logic of a computation without describing its control flow. Declarative programming often considers programs as theories of a formal logic, and computations as deductions in that logic space. A high-level program that describes what a computation should perform. SELECT * FROM Orders

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

5

slide-6
SLIDE 6

Declarative programming — why?

Decouples problem formulation from solving process. Solving part can be replaced without modifying the formulation. Easier to optimise algorithms for because „the goal” is understandable for the machine. Can be used with little to no programming skills. Sometimes we don’t know how to solve it.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

6

slide-7
SLIDE 7

Example — RTS game

We are playing RTS game. We are allowed to hire footmen and archers. Every footman costs 10 gold and 30 food. Every archer costs 20 gold, 25 food, and 10 wood. Footman’s attack is equal to 5, archer’s attack is equal to 7. Our population limit is set to 200 units. Every footman „costs” 1 unit, every archer „costs” 2 units. We have 1000 gold, 1000 food, and 200 wood. We want to get strongest possible army.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

7

slide-8
SLIDE 8

Units

Gold Food Wood Footman 10 30 Archer 20 25 10

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

8

Attack Unit count Footman 5 1 Archer 7 2 Available gold Available food Available wood Max units count Constraint 1000 1000 200 200

slide-9
SLIDE 9

Variables

Variables: 𝑔 − 𝑔𝑝𝑝𝑢𝑛𝑓𝑜 𝑏 − 𝑏𝑠𝑑ℎ𝑓𝑠𝑡 Constraints: 𝑔 + 2 ⋅ 𝑏 ≤ 200 // population 10 ⋅ 𝑔 + 20 ⋅ 𝑏 ≤ 1000 // gold 30 ⋅ 𝑔 + 25 ⋅ 𝑏 ≤ 1000 // food 10 ⋅ 𝑏 ≤ 200 // wood Target value: 5 ⋅ 𝑔 + 7 ⋅ 𝑏

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

9

slide-10
SLIDE 10

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

10

slide-11
SLIDE 11

Example

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

11

slide-12
SLIDE 12

Example

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

12

slide-13
SLIDE 13

Example

Variables: 𝑇, 𝐹, 𝑂, 𝐸, 𝑁, 𝑃, 𝑆, 𝑍 ∈ 0, … , 9 and all different Constraints: 1000𝑇 + 100𝐹 + 10𝑂 + 𝐸 + 1000𝑁 + 100𝑃 + 10𝑆 + 𝐹 = 10000𝑁 + 1000𝑃 + 100𝑂 + 10𝐹 + 𝑍

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

13

slide-14
SLIDE 14

Example

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

14

slide-15
SLIDE 15

Real life examples

RTS game = factory production allocation:

  • We have available resources
  • We have facitilies
  • We want to plan work to maximize the production

Send more money = pattern recognition:

  • We know structure of a problem but doesn’t understand the latent factors

Floor tiling = microchip transistor layout:

  • We have transistors and gates of given size
  • We want to minimize heat emission and the board size

Others: BTS placement, power plant rooms layout, scheduling systems, items personalization and many more.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

15

slide-16
SLIDE 16

Some theory

MIXED INTEGER LINEAR PROGRAMMING

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

16

slide-17
SLIDE 17

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

17

slide-18
SLIDE 18

Mixed Integer Linear Programming

Programming in mathematics means finding a solution to

  • ptimization problem.

Linear Programming is a class of a problems with only linear constraints and with linear cost function. Mixed Integer Linear Programming is a class of a problems with integer constraint for some of variables.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

18

slide-19
SLIDE 19

Constraints

We can add two variables: 𝑏 + 𝑐 We can multiply variable by constant: 5 ⋅ 𝑏 We can constrain variable with lower/upper bound: 𝑏 ≤ 7 We cannot multiply variables: 𝑏 ⋅ 𝑐 We cannot use strict constraings (greater than, less than, not equal) 𝑏 < 10

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

19

slide-20
SLIDE 20

Cost function

Notice that not hiring anyone was also a solution! Problem may have zero, one, multiple or infinitely many solutions. We need to compare them. We use cost function to specify which one of them is the best.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

20

slide-21
SLIDE 21

Cutting plane method

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

21

slide-22
SLIDE 22

Algorithms

Basic algorithms:

  • Cutting plane methods – we solve the problem without integer constraints

(continuous version of the problem), and next we cut the plane to get smaller problem

  • Branch and bound – we solve the problem without integer constraints, and

next we bound some variables and perform next iteration

MILP is NP-complete and we sometimes use heuristics:

  • Tabu search
  • Simulated annealing
  • Ant colony optimization

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

22

slide-23
SLIDE 23

What can we do?

WE WILL IMPLEMENT

Boole’s logic. Multiplication. Comparison

  • perators.

WE WILL NOT IMPLEMENT

Arithmetic: division, remainder, exponentation, roots. Comparisons: min, max, absolute value. Number theory: factorial, GCD. Algorithms: if condition, sorting, loops, lexicographical comparisons, Gray’s code, linear regression. Set operators: SOS type 1 and 2, approximation. Graph operators: MST, vertex/edge cover, max flow, connectivity, shortest path, TSP. Turing machine.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

23

slide-24
SLIDE 24

Conjunction — AND operator (&&)

We have two variables: 𝑏, 𝑐. We want to create variable 𝑦 which is 𝑦 = 𝑏 && 𝑐. Formula: 0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

24

slide-25
SLIDE 25

Conjunction — AND operator (&&)

If both 𝑏 and 𝑐 are 1 then 𝑦 must be 1. If 𝑦 was 0: 0 ≤ 1 + 1 − 2 ⋅ 0 ≤ 1 0 ≤ 2 − 0 ≤ 1 0 ≤ 2 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

25

0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

slide-26
SLIDE 26

Conjunction — AND operator (&&)

If both 𝑏 and 𝑐 are 1 then 𝑦 must be 1. If 𝑦 is 1: 0 ≤ 1 + 1 − 2 ⋅ 1 ≤ 1 0 ≤ 2 − 2 ≤ 1 0 ≤ 0 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

26

0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

slide-27
SLIDE 27

Conjunction — AND operator (&&)

If either 𝑏 or 𝑐 is 1 then 𝑦 must be 0. If 𝑦 was 1: 0 ≤ 1 + 0 − 2 ⋅ 1 ≤ 1 0 ≤ 1 − 2 ≤ 1 0 ≤ −1 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

27

0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

slide-28
SLIDE 28

Conjunction — AND operator (&&)

If either 𝑏 or 𝑐 is 1 then 𝑦 must be 0. If 𝑦 is 0: 0 ≤ 1 + 0 − 2 ⋅ 0 ≤ 1 0 ≤ 1 − 0 ≤ 1 0 ≤ 1 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

28

0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

slide-29
SLIDE 29

Conjunction — AND operator (&&)

If both 𝑏 or 𝑐 are 0 then 𝑦 must be 0. If 𝑦 was 1: 0 ≤ 0 + 0 − 2 ⋅ 1 ≤ 1 0 ≤ 0 − 2 ≤ 1 0 ≤ −2 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

29

0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

slide-30
SLIDE 30

Conjunction — AND operator (&&)

If both 𝑏 or 𝑐 are 0 then 𝑦 must be 0. If 𝑦 is 0: 0 ≤ 0 + 0 − 2 ⋅ 0 ≤ 1 0 ≤ 0 − 0 ≤ 1 0 ≤ 0 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

30

0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

slide-31
SLIDE 31

Conjunction — AND operator (&&)

If both 𝑏 and 𝑐 are 1 then 𝑦 must be 1. If either 𝑏 or 𝑐 is 1 then 𝑦 must be 0. If both 𝑏 or 𝑐 are 0 then 𝑦 must be 0.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

31

0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1

slide-32
SLIDE 32

Conjunction & Disjunction

Two variables conjunction: 0 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 1 𝑜 variables conjunction: 0 ≤ 𝑏1 + 𝑏2 + 𝑏3 + … + 𝑏𝑜 − 𝑜𝑦 ≤ 𝑜 − 1 Two variables disjunction: −1 ≤ 𝑏 + 𝑐 − 2𝑦 ≤ 0 𝑜 variables disjunction goes the same way

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

32

slide-33
SLIDE 33

Negation, exclusive or, implication

Negation: 𝑦 = 1 − 𝑏 Implication: 𝑏 ⇒ 𝑐 ≡ ~𝑏 ∨ 𝑐 Exclusive or: ~𝑏 ∧ 𝑐 ∨ (𝑏 ∧ ~𝑐)

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

33

slide-34
SLIDE 34

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

34

Multiplication of two binary variables is their conjunction. 𝑏 ⋅ 𝑐 ≡ 𝑏 ∧ 𝑐

slide-35
SLIDE 35

Multiplication of integer variables

Multiplication is possible when we know the maximum possible value of a variable. We set the upper bound and perform the long multiplication. It is rather slow approach, it requires 𝑃(𝑜2) temporary variables.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

35

slide-36
SLIDE 36

Value decomposition

We decompose the variable to extract digits. We assume the maximum possible value, because we need to know the number of digits. Decomposition is straghtforward: 𝑐 = 𝑐0 + 2 ⋅ 𝑐1 + 4 ⋅ 𝑐2 + 8 ⋅ 𝑐3 + … + 2𝑜−1 ⋅ 𝑐𝑜−1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

36

slide-37
SLIDE 37

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

37

slide-38
SLIDE 38

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

38

slide-39
SLIDE 39

Multiplication

𝑏 ⋅ 𝑐 = 𝑏0 ∧ 𝑐0 + 2 ⋅ 𝑏0 ∧ b1 + 4 ⋅ a0 ∧ 𝑐2 + … + 2𝑜−1 ⋅ 𝑏0 ∧ 𝑐𝑜−1 +2 ⋅ 𝑏1 ∧ 𝑐0 + 2 ⋅ 𝑏1 ∧ 𝑐1 + 4 ⋅ 𝑏1 ∧ 𝑐2 + ⋯ 2𝑜−1 ⋅ (𝑏1 ∧ 𝑐𝑜−1) +4 ⋅ 𝑏2 ∧ 𝑐0 + 2 ⋅ 𝑏2 ∧ 𝑐1 + 4 ⋅ 𝑏2 ∧ 𝑐2 + … + 2𝑜−1 ⋅ 𝑏2 ∧ bn−1 + ⋯ + 2𝑜−1( 𝑏𝑜−1 ∧ 𝑐0 + 2 ⋅ 𝑏𝑜−1 ∧ 𝑐1 + 4 ⋅ 𝑏𝑜−1 ∧ 𝑐2 + … + 2𝑜−1 ⋅ 𝑏𝑜−1 ∧ 𝑐𝑜−1 ) It can be represented as: 𝑏 ⋅ 𝑐 = ෍

𝑗=0 𝑜−1

2𝑗 ෍

𝑘=0 𝑜−1

2𝑘𝑏𝑗 ∧ 𝑐

𝑘

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

39

slide-40
SLIDE 40

Comparison operators To calculate whether 𝑏 > 𝑐 we can use: 0 ≤ 𝑐 − 𝑏 + 2𝑜−1𝑦 ≤ 2𝑜−1 − 1 To check whether numbers differ: 𝑦 = 𝑏 > 𝑐 ∨ (𝑐 > 𝑏)

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

40

slide-41
SLIDE 41

There are libraries doing that!

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

41

https://github.com/afish/MilpManager

slide-42
SLIDE 42

Scheduling System

REAL LIFE EXAMPLE

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

42

slide-43
SLIDE 43

Idea

At the beginning of every term students must be assigned to classes. It is hard to make them happy because some of them work, some of them prefer to sleep long, some of them prefer to have lots of days off. We can try to represent the requirements as a MILP program and find the optimal solution.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

43

slide-44
SLIDE 44

Usage

We ask students to assign preferences points to every possible class. The more points assigned the more student wants to be assigned to that class. We need to take care of rooms occupancy limits, collisions etc.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

44

slide-45
SLIDE 45

Schedule

We are given a schedule of classes in courses Every class has associated day (Monday – Friday), hour (e.g., 9:30 AM) and duration (e.g., 1:30 hrs). Every class has associated room with occupancy limit.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

45

slide-46
SLIDE 46

Constraints

Variables. Exactly one class in one course. Collisions. Rooms occupancy limits. Cost function.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

46

slide-47
SLIDE 47

Variables

For every person, every course, every class we declare binary variable. Value 1 means that the student is assigned to this class. We define: 𝑦𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡,𝑡𝑢𝑣𝑒𝑓𝑜𝑢

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

47

slide-48
SLIDE 48

Exactly one class for a student

Every student must attend exactly one class in course. For every course we need to assign student to exactly

  • ne class.

𝑑𝑝𝑣𝑠𝑡𝑓,𝑡𝑢𝑣𝑒𝑓𝑜𝑢

𝑑𝑚𝑏𝑡𝑡

𝑦𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡,𝑡𝑢𝑣𝑒𝑓𝑜𝑢 = 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

48

slide-49
SLIDE 49

Collisions

Student cannot be in two places at the same time. ሥ 𝑑𝑝𝑣𝑠𝑡𝑓1, 𝑑𝑚𝑏𝑡𝑡1 , 𝑑𝑝𝑣𝑠𝑡𝑓2, 𝑑𝑚𝑏𝑡𝑡2 𝑑𝑝𝑚𝑚𝑗𝑒𝑗𝑜𝑕 ሥ

𝑡𝑢𝑣𝑒𝑓𝑜𝑢

𝑦𝑑𝑝𝑣𝑠𝑡𝑓1,𝑑𝑚𝑏𝑡𝑡1,𝑡𝑢𝑣𝑒𝑓𝑜𝑢 + 𝑦𝑑𝑝𝑣𝑠𝑡𝑓2,𝑑𝑚𝑏𝑡𝑡2,𝑡𝑢𝑣𝑒𝑓𝑜𝑢 ≤ 1

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

49

slide-50
SLIDE 50

Room occupancy limit

Every room has an occupancy limit. ሥ

𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡

𝑡𝑢𝑣𝑒𝑓𝑜𝑢

𝑦𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡,𝑡𝑢𝑣𝑒𝑓𝑜𝑢 ≤ 𝑡𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡 where 𝑡𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡 means the size of the room

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

50

slide-51
SLIDE 51

Preferences cost function

Every student assigned points to classes. We want to maximize the sum of those points. ෍

𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡,𝑡𝑢𝑣𝑒𝑓𝑜𝑢

𝑞𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡,𝑡𝑢𝑣𝑒𝑓𝑜𝑢 ⋅ 𝑦𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡,𝑡𝑢𝑣𝑒𝑓𝑜𝑢 where 𝑞𝑑𝑝𝑣𝑠𝑡𝑓,𝑑𝑚𝑏𝑡𝑡,𝑡𝑢𝑣𝑒𝑓𝑜𝑢 means number of points

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

51

slide-52
SLIDE 52

What now?

Students: 150 Courses: 15 Classes: 9 per course Problem size: ~40 000 variables. Solving time: 2 seconds. This solution is optimal, we won’t get any better than that!

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

52

slide-53
SLIDE 53

Implementation consideration

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

53

slide-54
SLIDE 54

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

54

slide-55
SLIDE 55

Licenses

Various approaches:

  • License per workstation
  • License per person
  • Licensing server with tickets

Licenses for universities and research work. Licenses for students.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

55

slide-56
SLIDE 56

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

56

slide-57
SLIDE 57

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

57

https://neos-server.org/neos/solvers/index.html

slide-58
SLIDE 58

Beyond MILP

SAT/SMT. Quadratic programming. Prolog. Specialized models for various problems.

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

58

slide-59
SLIDE 59

Autopromotion

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

59

slide-60
SLIDE 60

Summary

Declarative programming allows you to focus on a problem, not on an algorithm! If something is slow — just replace the solver. There are many models, choose as powerful as you can (to make modelling easy) and as primitive as possible (to make solving fast).

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

60

slide-61
SLIDE 61

Q&A

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

61

slide-62
SLIDE 62

References

Alexander Schrijver — „Theory of Linear and Integer Programming” Dennis Yurichev — „SAT/SMT by example” Adam Furmanek – „.NET Internals Cookbook” http://blog.adamfurmanek.pl/2015/08/22/ilp-part-1/ — a lot about ILP https://github.com/afish/MilpManager — library for modelling https://neos-server.org/neos/solvers/index.html — NEOS cloud for solving problems https://tore.tuhh.de/bitstream/11420/2548/1/201905-scopes-oehlert.pdf — Practical usage of ILP versus QP

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

62

slide-63
SLIDE 63

Thanks!

CONTACT@ADAMFURMANEK.PL HTTP://BLOG.ADAMFURMANEK.PL FURMANEKADAM

25.07.2020 INTEGER LINEAR PROGRAMMING - ADAM FURMANEK

63