0

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

1
  • You may want to learn about arrays/vectors. Commented Dec 20, 2019 at 12:12

1 Answer 1

1

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.