chink
chink

Reputation: 1643

optimization a linear objective function with linear constraints and binary variables in python

I am new to optimizations and trying to solve a problem, which I feel falls in the umbrella of optimization.

I have an ojective function that needs to be maximized

def objective(bat1,bat2,bat3,bat4,bat5,bat6,bat7,wk1,wk2,ar1,ar2,ar3,ar4,ar5,bowl1,bowl2,bowl3,bowl4,bowl5,bowl6):
    total_score_batsman =  bat1*60 + bat2*40 + bat3*36 + bat4*35 + bat5*25 + bat6*22 +bat7*9
    total_score_wks = wk1*24 + wk2* 14 
    total_score_ar = ar1*45 + ar2*24 + ar3*15 + ar4*1
    total_score_bowler = bowl1*64 + bowl2*47 + bowl3*16 + bowl4*7 + bowl5*5 + bowl6*4
    return total_score_batsman + total_score_wks + total_score_ar + total_score_bowler #needs to be maximized

constraints

#budget constraint

def budget(bat1,bat2,bat3,bat4,bat5,bat6,bat7,wk1,wk2,ar1,ar2,ar3,ar4,ar5,bowl1,bowl2,bowl3,bowl4,bowl5,bowl6):
    batsman_budget = bat1*10.5 + bat2*8.5 + bat3*10.5 + bat4*8.5 + bat5*9.5 + bat6*9 +bat7*9
    wk_budget = wk1*8.5 + wk2*8
    ar_budget = ar1*8.5 + ar2*9 + ar3*8.5 + ar4*8
    bowler_budget = bowl1*9 + bowl2*8.5 + bowl3*8.5 + bowl4*8.5 + bowl5*9 + bowl6*9
    total_budget = batsman_budget + wk_budget + ar_budget + bowler_budget
    return total_budget

total_budget <= 100 #constraint
#player_role constraints

bat1 + bat2 + bat3 + bat4 + bat5 + bat6 + bat7 >= 3
bat1 + bat2 + bat3 + bat4 + bat5 + bat6 + bat7 <= 5

wk1 + wk2 = 1

ar1 + ar2 + ar3 + ar4 + ar5 >= 1
ar1 + ar2 + ar3 + ar4 + ar5 <= 3

bowl1 + bowl2 + bowl3 + bowl4 + bowl5 + bowl6 >= 3
bowl1 + bowl2 + bowl3 + bowl4 + bowl5 + bowl6 <= 5

# no of players in a team constraint
bat1 + bat2 + bat3 + bat4 + bat5 + bat6 + bat7 + wk1 + wk2 + ar1 + ar2 + ar3 + ar4 + ar5 + bowl1 + bowl2 + bowl3 + bowl4 + bowl5 + bowl6 = 11

where bat1,bat2,bat3.....bowl5,bowl6 are 0 or 1

Its completely a linear problem, and there is no requirement of non linear optimization techniques.Can some one help me with how to solve such problems or are there any libraries in python which will help me solving this?

Thanks

Upvotes: 0

Views: 85

Answers (1)

9mat
9mat

Reputation: 1234

You can use PuLP

from pulp import *

prob = LpProblem("The Whiskas Problem",LpMaximize)

bat1 = LpVariable("bat1", cat=LpBinary)
bat2 = LpVariable("bat2", cat=LpBinary)
bat3 = LpVariable("bat3", cat=LpBinary)
bat4 = LpVariable("bat4", cat=LpBinary)
bat5 = LpVariable("bat5", cat=LpBinary)
bat6 = LpVariable("bat6", cat=LpBinary)
bat7 = LpVariable("bat7", cat=LpBinary)

wk1 = LpVariable("wk1", cat=LpBinary)
wk2 = LpVariable("wk2", cat=LpBinary)

ar1 = LpVariable("ar1", cat=LpBinary)
ar2 = LpVariable("ar2", cat=LpBinary)
ar3 = LpVariable("ar3", cat=LpBinary)
ar4 = LpVariable("ar4", cat=LpBinary)
ar5 = LpVariable("ar5", cat=LpBinary)

bowl1 = LpVariable("bowl1", cat=LpBinary)
bowl2 = LpVariable("bowl2", cat=LpBinary)
bowl3 = LpVariable("bowl3", cat=LpBinary)
bowl4 = LpVariable("bowl4", cat=LpBinary)
bowl5 = LpVariable("bowl5", cat=LpBinary)
bowl6 = LpVariable("bowl6", cat=LpBinary)

total_score_batsman = LpVariable("total_score_batsman")
total_score_wks = LpVariable("total_score_wks")
total_score_ar = LpVariable("total_score_ar")
total_score_bowler = LpVariable("total_score_bowler")

batsman_budget = LpVariable("batsman_budget")
wk_budget = LpVariable("wk_budget")
ar_budget = LpVariable("ar_budget")
bowler_budget = LpVariable("bowler_budget")

prob += total_score_batsman + total_score_wks + total_score_ar + total_score_bowler, "Objective"

prob += total_score_batsman ==  bat1*60 + bat2*40 + bat3*36 + bat4*35 + bat5*25 + bat6*22 +bat7*9
prob += total_score_wks == wk1*24 + wk2* 14 
prob += total_score_ar == ar1*45 + ar2*24 + ar3*15 + ar4*1
prob += total_score_bowler == bowl1*64 + bowl2*47 + bowl3*16 + bowl4*7 + bowl5*5 + bowl6*4

prob += batsman_budget == bat1*10.5 + bat2*8.5 + bat3*10.5 + bat4*8.5 + bat5*9.5 + bat6*9 +bat7*9
prob += wk_budget == wk1*8.5 + wk2*8
prob += ar_budget == ar1*8.5 + ar2*9 + ar3*8.5 + ar4*8
prob += bowler_budget == bowl1*9 + bowl2*8.5 + bowl3*8.5 + bowl4*8.5 + bowl5*9 + bowl6*9

prob += batsman_budget + wk_budget + ar_budget + bowler_budget <= 100


prob += bat1 + bat2 + bat3 + bat4 + bat5 + bat6 + bat7 >= 3
prob += bat1 + bat2 + bat3 + bat4 + bat5 + bat6 + bat7 <= 5

prob += wk1 + wk2 == 1

prob += ar1 + ar2 + ar3 + ar4 + ar5 >= 1
prob += ar1 + ar2 + ar3 + ar4 + ar5 <= 3

prob += bowl1 + bowl2 + bowl3 + bowl4 + bowl5 + bowl6 >= 3
prob += bowl1 + bowl2 + bowl3 + bowl4 + bowl5 + bowl6 <= 5

prob += bat1 + bat2 + bat3 + bat4 + bat5 + bat6 + bat7 + wk1 + wk2 + ar1 + ar2 + ar3 + ar4 + ar5 + bowl1 + bowl2 + bowl3 + bowl4 + bowl5 + bowl6 == 11


status = prob.solve()

print("Status:", LpStatus[status])
print("Object = {}".format(prob.objective.value()))
for i, x in enumerate(prob.variables()[1:]):
    print("{} = {}".format(x.name, x.varValue))

Results:

Status: Optimal
Object = 416.0
ar2 = 1.0
ar3 = 0.0
ar4 = 0.0
ar5 = 0.0
ar_budget = 17.5
bat1 = 1.0
bat2 = 1.0
bat3 = 1.0
bat4 = 1.0
bat5 = 1.0
bat6 = 0.0
bat7 = 0.0
batsman_budget = 47.5
bowl1 = 1.0
bowl2 = 1.0
bowl3 = 1.0
bowl4 = 0.0
bowl5 = 0.0
bowl6 = 0.0
bowler_budget = 26.0
total_score_ar = 69.0
total_score_batsman = 196.0
total_score_bowler = 127.0
total_score_wks = 24.0
wk1 = 1.0
wk2 = 0.0
wk_budget = 8.5

Upvotes: 1

Related Questions