使用PULP在线性规划优化中添加约束

时间:2017-12-11 04:42:22

标签: python optimization linear-programming pulp operations-research

以下代码为我提供了度假的最佳地点,保持低成本:

from pulp import *
import numpy as np
import pandas as pd
import re 

#write a scaper before hand
data = pd.read_csv('clymb_adventures.csv')
problem_name = 'GoingOnVacation'
aval_vacation_days = 10

def optimize_vacation_schedule(aval_vacation_days):

# create the LP object, set up as a minimization problem --> since we 
want to minimize the costs 
prob = pulp.LpProblem(problem_name, pulp.LpMinimize)


#create decision variables
decision_variables = []
for rownum, row in data.iterrows():
    variable = str('x' + str(rownum))
    variable = pulp.LpVariable(str(variable), lowBound = 0, upBound = 1, cat= 'Integer') #make variables binary
    decision_variables.append(variable)

print ("Total number of decision_variables: " + str(len(decision_variables)))

#create objective Function -minimize the costs for the trip
total_cost = ""
for rownum, row in data.iterrows():
    for i, schedule in enumerate(decision_variables):
        if rownum == i:
            formula = row['cost']*schedule
            total_cost += formula

prob += total_cost
print ("Optimization function: " + str(total_cost)) 


#create constrains - total vacation days should be no more than 14
total_vacation_days = ""
for rownum, row in data.iterrows():
    for i, schedule in enumerate(decision_variables):
        if rownum == i:
            formula = row['duration']*schedule
            total_vacation_days += formula

prob += (total_vacation_days == aval_vacation_days)


#now run optimization
optimization_result = prob.solve()
assert optimization_result == pulp.LpStatusOptimal
prob.writeLP(problem_name + ".lp" )
print("Status:", LpStatus[prob.status])
print("Optimal Solution to the problem: ", value(prob.objective))
print ("Individual decision_variables: ")
for v in prob.variables():
    print(v.name, "=", v.varValue)

if __name__ == "__main__":
    optimize_vacation_schedule(aval_vacation_days)

示例数据集:

destination duration    cost    description                 location
0   Baja          7      899    Hike Bike                [31223,23123]
1   Nepal         11     899    culture of the Himalayas [91223,28123]
2   Spain         8      568    Sport climb              [66223,23123]
3   Yosemite      3      150    Guided hiking            [0223,23123]
4   Utah          6      156    Hike.                    [35523,23123]
5   Okla          1      136    Hike.                    [25523,23123]

我在数据集中添加了一个额外的字段“location”。

我想要实现的是,如果求解器给我三个3个位置作为最优解,那么它必须确保两个连续建议引用之间的最大曼哈顿距离使用位置坐标不大于3000

实施例: 如果优胜美地,犹他州和奥克拉是由解决者建议的。那么在建议他们之前必须检查从约塞米蒂到犹他州的距离是否低于3000 而犹他州到奥克拉的人数低于3000人。

这也使其成为路由问题。

那么如何添加约束,使用位置坐标将两个连续建议城市之间的距离保持在3000以下。 请帮忙

谢谢!!!!

1 个答案:

答案 0 :(得分:0)

如果要添加条件x(i,j)== 1作为约束,则将创建第二组决策变量。将键为元组(i,j),并且值为cat ='Binary'的LpVariable。然后,您必须设置一些其他约束。

注意:我假设x是一个字典,其中的键是一个位置,值是一个决策变量。我不确定您为什么在这里使用列表。需要进行一些修改以匹配您的结构。

maximumValue