python - 使用 OR 工具的设施位置
问题描述
我正在尝试使用 OR 工具编写设施位置 MIP 解决方案。我从这里翻译了一个 Scip 解决方案:
https://scipbook.readthedocs.io/en/latest/flp.html 但我得到一个只有零的表意味着没有解决方案..是问题的框架或/和我在这里使用 OR-tools 的方式应该工作?
def or_tools_scip_mine(facilities, customers, time_limit=None):
import numpy
import datetime
if time_limit is None:
time_limit = 1000 * 60 # 1 minute
solver = pywraplp.Solver.CreateSolver('SCIP')
customer_count = range(len(customers))
facility_count = range(len(facilities))
x =[[] for _ in range(len(customers))]
y = []
facility_capacities=[facilities[i][2] for i in facility_count]
facility_setup_costs = [facilities[i][1] for i in facility_count]
demands=[customers[i][1] for i in customer_count]
c=dist_matrix(facilities,customers)
for j in facility_count:
y.append(solver.BoolVar("y(%s)" % j))
for i in customer_count:
x[i].append(solver.BoolVar("x(%s,%s)" % (i, j)))
for i in customer_count:
solver.Add(solver.Sum(x[i][j] for j in facility_count) <= demands[i])#, "Demand(%s)" % i
for j in facility_count:
solver.Add(solver.Sum(x[i][j] for i in customer_count) <= facility_capacities[j] * y[j])#, "Capacity(%s)" % j)
for j in facility_count:
for i in customer_count:
solver.Add(x[i][j] <= demands[i] * y[j])
a=solver.Sum((facility_setup_costs[j] * y[j] for j in facility_count))
b=solver.Sum((c[i, j] * x[i][j] for i in customer_count for j in facility_count))
func_=solver.Sum([a,b])
solver.Minimize(func_)
solver.set_time_limit(time_limit)
result_status = solver.Solve()
print(result_status)
val = solver.Objective().Value()
x_val = [[] for _ in range(len(customers))]
solution = []
for j in range(len(facilities)):
for i in range(len(customers)):
x_val[i].append(int(x[i][j].solution_value()))
x_val = numpy.array(x_val)
for j in range(len(customers)):
solution.append(numpy.where(x_val[:, j] == 1)[0][0])
return val, solution
the Error:
solution.append(numpy.where(x_val[:, j] == 1)[0][0])
IndexError: index 0 is out of bounds for axis 0 with size 0
解决方案
在代码中的 CreateSolver 行之后添加solver.EnableOutput()。这将使您更深入地了解正在发生的事情。
以下是帮助求解器参数和状态。如果您需要更多详细信息,请单击此文档链接
print('Number of variables = %d' % solver.NumVariables())
print('Number of constraints = %d' % solver.NumConstraints())
print('The Optimal Objective value =',solver.Objective().Value())
print('Total Iterations:',solver.iterations())
print('Total Nodes:',solver.nodes())
print('Total number of Variables:',solver.NumVariables())
print(pywraplp.Solver.FEASIBLE)
print(pywraplp.Solver.MODEL_INVALID)
print(pywraplp.Solver.OPTIMAL)
print(pywraplp.Solver.INFEASIBLE)
print(pywraplp.Solver.UNBOUNDED)
推荐阅读
- python - Pygame ValueError:无效的rectstyle对象
- dask - Dask - 删除重复索引 MemoryError
- python - 使用 ElementTree 解析 XML 中的子子项
- .net - Winforms 文档查看器组件
- c# - 如何强制方法参数来自特定参数类?
- c# - C# 双击 DataGridView 与滚动条问题打开重复记录
- web3swift - 无法导入 Web3。在 Xcode 项目中快速
- javascript - java脚本点击函数意外输出
- javascript - jQuery - 在不同的 div 级别中获取最接近的元素
- jquery - 花式树根尚未渲染