首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OR工具进行设施选址

使用OR工具进行设施选址
EN

Stack Overflow用户
提问于 2021-05-30 19:47:35
回答 1查看 112关注 0票数 2

我正在尝试用OR工具编写设施位置MIP解决方案。我翻译了一个Scip解决方案,如下所示:

https://scipbook.readthedocs.io/en/latest/flp.html但是我得到一个只有零的表意味着没有解决方案..问题的框架或者/和我在这里使用OR工具的方式是否应该起作用?

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

发布于 2021-06-05 00:29:41

在代码中的CreateSolver行之后添加solver.EnableOutput()。这将使您更深入地了解正在发生的事情。

下面的

是帮助求解器参数和状态。如果您需要更多详细信息,请单击此文档link

代码语言:javascript
复制
    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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67760793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档