2016-03-26 69 views
2

我已經使用PuLP庫編寫了以下Python代碼,用於使用Integer編程公式解決揹包問題。我使用字符串來生成LpVariable命令並添加約束,然後使用eval執行它們。有沒有辦法做到這一點,而不使用eval?如何在不使用exec的情況下生成PuLP變量和約束?

from pulp import * 

#Knapsack problem 

items = input ('Enter the number of items :') 

items = int(items) 

#print('Enter %d items one by one') 

print ('Enter {0} items profit one by one'.format(items)) 

obj = [] 
weight = [] 
knapweight = 0 


for i in range(0,items): 
    print('Enter {0} item profit : '.format(i+1)) 
    obj.append(input()) 

for i in range(0, items): 
    print('The profit at {0} is {1}'.format(i, obj[i])) 

print ('\nEnter {0} items weights one by one'.format(items)) 


for i in range(0, items): 
    print('Enter {0} item weight'.format(i+1)) 
    weight.append(input()) 

for i in range(0, items): 
    print('The profit at {0} is {1}'.format(i, weight[i])) 

print ('\nEnter the weight of the knapsack :') 
knapweight = input() 

print ('The weight of the knapsack is : {0}'.format(knapweight)) 


#generating variables 
for i in range(0, items): 
    str = 'x{0} = LpVariable("x{1}", cat=\'Binary\')'.format(i+1,i+1) 
    print (str) 
    exec(str) 

prob = LpProblem('Knapsack', LpMaximize) 

print ('\nDynamic Generaion\n') 

#weight constraint generation 
str = "prob += " 

for i in range(0, items): 
    if i == (items-1): 
     str = str + weight[i] + '*x{0}'.format(i+1) 
    else: 
     str = str + weight[i] + '*x{0}'.format(i+1) + '+' 

str = str + '<=' + knapweight 
exec(str) 
print(str) 

#objective function generation 
str = "prob += " 

for i in range(0, items): 
    if i == (items-1): 
     str = str + obj[i] + '*x{0}'.format(i+1) 
    else: 
     str = str + obj[i] + '*x{0}'.format(i+1) + '+' 

exec(str) 
print(str) 

status = prob.solve() 
print(LpStatus[status]) 

print ('\nThe values of the variables : \n') 

for i in range(0, items): 
    print('x{0} = {1}'.format(i+1, value(eval('x{0}'.format(i+1))))) 

回答

3

關鍵是認識到可以有一個對象 - 比如列表或字典中的一個 - 你沒有明確地綁定到名稱。您可以創建一個對象,將其附加到列表中,並且只能將其稱爲some_list[2]。一旦你允許自己的自由,你的代碼可以變得更簡單。

在這裏,我硬編碼的投入,因爲這並不重要:

from pulp import * 

objs = [2,3,2,5,3] 
weights = [1,2,2,1,3] 
knapweight = 5 

prob = LpProblem('Knapsack', LpMaximize) 
xs = [LpVariable("x{}".format(i+1), cat="Binary") for i in range(len(objs))] 

# add objective 
total_prof = sum(x * obj for x,obj in zip(xs, objs)) 
prob += total_prof 

# add constraint 
total_weight = sum(x * w for x,w in zip(xs, weights)) 
prob += total_weight <= knapweight 

status = prob.solve() 
print(LpStatus[status]) 
print("Objective value:", value(prob.objective)) 
print ('\nThe values of the variables : \n') 
for v in prob.variables(): 
    print(v.name, "=", v.varValue) 

這給了我

Optimal 
Objective value: 10.0 

The values of the variables : 

x1 = 1.0 
x2 = 1.0 
x3 = 0.0 
x4 = 1.0 
x5 = 0.0 

在這裏,我建立LpVariables列表理解

xs = [LpVariable("x{}".format(i+1), cat="Binary") for i in range(len(objs))] 

那裏的對象然後只是住在列表xs

>>> xs 
[x1, x2, x3, x4, x5] 
>>> xs[3] 
x4 
>>> type(xs[3]) 
<class 'pulp.pulp.LpVariable'> 
相關問題