线性规划 - Google ortool - 错误的决策变量最终值

2023-12-04

我正在尝试解决线性规划问题。以下是问题的具体情况:

我有一个网络流问题已转换为线性规划问题。因此,所有流量约束,例如容量、流量守恒等,都必须强制执行。我的目标是最小化成本。

决策变量 - 我通过定义字典并在这 128 个位置中的每个位置添加决策变量来构建两个 8x8 矩阵。

约束 - 总共有 24 个约束,即: 1) 流程从源头开始。两个 8x8 矩阵都有 2 个约束。 2) 水流在水槽处结束。两个 8x8 矩阵都有 2 个约束。 3) 流量守恒有 12 个约束,两个矩阵各有 8 个。 4) 有 2 个约束来遵守容量约束,每个矩阵 1 个。 5)有6个约束以避免重复

所有变量都必须是二进制的。

目标 - 8x8 矩阵中的某些变量的总和需要最小化。

同样,所有变量都必须是二进制的。

我已经能够在 Google ORTOOLS 中编写解决方案,并且解决方案收敛并显示最小值。但是,当我查看变量时,有些变量具有非二进制值。另外,该解决方案是错误的(我有一个在 Excel 中运行的现有解决方案,它是正确的且不同)。

如果有人能指出我正确的方向,我将不胜感激。以下是用 Python 36 编写的代码。

    from ortools.linear_solver import pywraplp
import numpy as np

def configure_constraints(cfg, solver, variable_list):

    print(cfg)
    dest_convs = cfg['dest_convs']
    msize = cfg['lookback_win'] + 1 + 1
    rem_capacity = cfg['rem_caps']

    # Constraint 1 - Flow starts at the source
    for i in range(dest_convs):
        # print([(i, 0, c) for c in range(1, msize)])
        solver.Add(solver.Sum([variable_list[(i,0,c)] for c in range(1, msize)]) == 1)

    # Constraint 2 - Flow ends at the sink
    for i in range(dest_convs):
        # print([(i, r, msize - 1) for r in range(1, msize)])
        solver.Add(solver.Sum([variable_list[(i,r,msize - 1)] for r in range(1, msize)]) == 1)

    # Constraint 3 - Flow Conservation
    for i in range(dest_convs):
        for r in range(msize - 1):
            if r+1 == msize - 1:
                continue

            solver.Add(solver.Sum([variable_list[(i,rind, r+1)] for rind in range(r + 1)]) - solver.Sum([variable_list[(i,r+1, cind + 1)] for cind in range(r+1, msize - 1)]) == 0)
    #
    # # Constraint 4 - Capacity Constraint
    for i in range(dest_convs):
        solver.Add(solver.Sum([variable_list[(i, r, c)] for r in range(1, msize-1) for c in range(r+1, msize - 1)]) <= rem_capacity[i] - 1)

    #
    # # Constraint 5 - 1-vehicle, 1-conveyor
    dest_conv_list = []
    for i in range(dest_convs):
        dest_conv_list.append([])
        for r in range(1, msize - 1):
            dest_conv_list[i].append(sum([variable_list[(i,r,c)] for c in range(r+1, msize)]))

    for items in zip(*dest_conv_list):
        solver.Add(solver.Sum(items) == 1)



def configure_objective(solver, variable_list, cost_vars):
    # Objective
    solver.Minimize(solver.Sum([variable_list[items] for items in zip(*np.where(cost_vars))]))


def solve(solver):
    result_status = solver.Solve()
    return result_status

def configure_variables(cfg, solver):

    # identify variables for the objective function
    # print(cfg)
    nvehs = cfg['vehicles']
    dest_convs = cfg['dest_convs']
    color_vec = cfg['color_vec']
    cur_cars = cfg['cur_cars']
    msize = cfg['lookback_win'] + 1 + 1

    # objective_mat = np.zeros((msize, msize), dtype="int32")
    mat = [[[0] * msize for i in range(msize)] for j in range(dest_convs)]

    # source to vehicles
    for i in range(dest_convs):
        for j in range(nvehs):
            # print(color_vec[j], cur_cars[i])
            if color_vec[j] != cur_cars[i]:
                mat[i][0][j+1] = 1


    for h in range(dest_convs):
        for i in range(0, nvehs):
            for j in range(i+1, nvehs):
                # print(i+1,j+1)
                # print(color_vec[i+1], color_vec[j])
                if color_vec[i] != color_vec[j]:
                    mat[h][i+1][j + 1] = 1

    cost_vars = np.array(mat).reshape(dest_convs, msize, msize)
    print(np.array(mat).reshape(dest_convs,msize,msize))

    dvars = {}
    for i in range(dest_convs):
        for j in range(msize):
            for k in range(msize):
                dvars[i, j, k] = solver.BoolVar('x[%i,%i, %i]' % (i, j, k))


    return  dvars, cost_vars

def main(cfg, what):
    solver = pywraplp.Solver('SolveSimpleSystem', pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)

    dvars_list, cost_vars = configure_variables(cfg, solver)

    configure_constraints(cfg, solver, dvars_list)
    configure_objective(solver, dvars_list, cost_vars)

    result_status = solve(solver)

    print('Number of Variables:', solver.NumVariables())
    print('Number of Constraints:', solver.NumConstraints())
    # print('Constraints:',     solver.)

    if result_status == solver.OPTIMAL:
        print('Solution Found.')
        # The problem has an optimal solution.
        print(('Problem solved in %f milliseconds' % solver.wall_time()))
        # The objective value of the solution.
        print(('Optimal objective value = %f' % solver.Objective().Value()))

        var_sum = 0
        for variable in dvars_list:
            print(('%s = %f' % (dvars_list[variable].name(), dvars_list[variable].solution_value())))
            var_sum += dvars_list[variable].solution_value()

        print(('Variable sum = %f' % var_sum))

        # The value of each variable in the solution.
    elif result_status == solver.INFEASIBLE:
        print('No solution found.')
    elif result_status == solver.POSSIBLE_OVERFLOW:
        print('Some inputs are too large and may cause an integer overflow.')


if __name__ == '__main__':
    cfg = {'vehicles': 6,
           'dest_convs': 2,
           'cur_cars':['B', 'R'],
           'rem_caps': [3,3],
           'lookback_win':6,
           'color_vec': ['W', 'W', 'B', 'B', 'R', 'B'],
           }

    main(cfg, 'cost')

See: https://groups.google.com/forum/#!msg/or-tools-discuss/p5qVzZWIeIg/g77egaD-AAAJ

Glop 是一个纯粹的 LP。它只会解决mip问题的松弛。因此,错误检查器告诉您该解决方案不是完整的,这是正常的。

如果您的程序是纯布尔值,则可以将 GLOP_LINEAR_PROGRAMMING 更改为 BOP_INTEGER_PROGRAMMING。 或者你也可以留在 CBC

这就是为什么你应该使用:

  • pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING
  • pywraplp.Solver.BOP_INTEGER_PROGRAMMING
  • pywraplp.Solver.SAT_INTEGER_PROGRAMMING

代替pywraplp.Solver.GLOP_LINEAR_PROGRAMMING.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性规划 - Google ortool - 错误的决策变量最终值 的相关文章

随机推荐

  • 如何将 ObservableCollection 绑定到 WPF 中的复选框列表框

    让我先声明一下我对 C 和 WPF 都很陌生 我正在尝试连接一个集合Boolean值到包含 6 个复选框的容器 并在按下按钮时存储这些值的状态 我假设有一种简单的方法可以做到这一点 因为将复选框绑定到集合似乎是一件非常自然的事情 但到目前为
  • XSLT 将字段连接在一起

    我正在尝试过滤特定字段并连接另一个字段 Input
  • 如何使用Pivot_longer将宽类型数据重塑为具有多个变量的长类型数据

    我想问如何将以下数据框从宽类型重塑为长类型 宽类型数据如下 重塑前的宽类型数据 long 类型数据 即我想要获取的数据帧 如下所示 整形后的Long类型数据 如果您能给我使用更长的枢轴来完成此操作的提示 我将非常感激 我可以通过 BLS 和
  • 图表的中心

    给定一棵无向树 其无权边具有 N 个顶点和 N 1 个边 并且数量为 K 找到 K 个节点 以便树中的每个节点与 K 个节点中的至少一个节点的距离在 S 范围内 另外 S 必须是尽可能小的 S 因此 如果 S 我尝试解决这个问题 但是 我觉
  • 在现有 Java 7 代码中使用 Java 8 可选

    我有一项作业 需要将以下 Java 8 之前的代码转换为 Java 8 代码 以下只是一种让我很难完成的方法 public static List
  • 嵌套 mysql 查询的性能损失

    什么是性能损失SELECT FROM Table VS SELECT FROM SELECT FROM Table AS A AS B 我的问题是 首先 SELECT 是否涉及表中行的迭代 或者它只是将所有行作为一个块返回而不进行任何迭代
  • C 中是否有类似于 Java 字符串 'charAt()' 方法?

    我正在尝试将一段代码从 Java 转换为 C 但我被困在这里 试图在每个位置获取一个字符 char ch line while pos lt line length ch line charAt pos C 中有没有类似的东西可以转换行ch
  • django xlsxwriter 中的日期时间问题

    我正在尝试在 django 视图中创建导出到 Excel 的功能 如下所示 def export myreport request sd ed from xlsxwriter workbook import Workbook import
  • 使用 Google Maps API 根据地址显示房屋的街景

    我正在尝试使用 Google 地图根据地址显示房屋的街景 我创建了一个jsfiddle基于此tutorial 小提琴正在显示默认的初始地址 但我不知道按下按钮时如何将新地址传递到街景代码中 这是 HTML h3 Enter an Addre
  • jQuery ajax 安全性

    我有以下 ajax 调用 它检查用户是否是付费会员 如果是 则相应地运行某些功能 这可行 但我担心安全性 如果有人在控制台强制中更改此 ajax 代码怎么办 button无需执行任何操作即可成功运行功能 我可以在仍然使用 jQuery aj
  • 根据 Symfony 中的另一个字段值验证一个字段

    我在 Symfony 表单中有两个相关字段 object status and cryopreservation method 第一个不能为空 并存储三个可能的选择之一 liquid solid or cryopreserved 仅当记录有
  • 为什么调试模式和运行模式下的保留计数不同?

    我知道 ARC 和 MRC 是如何工作的 但我在测试下面的代码时感到困惑 我不知道为什么会发生这种情况 为什么同一个问题在调试模式和运行模式下的保留计数不同 NSMutableArray a NSMutableArray array a a
  • 让画布无限大

    我目前正在使用画布 在上面画了一些感兴趣的区域 它们由正方形组成 可以通过鼠标单击来移动 即 每次我在画布上单击时 所选区域将以我的光标位置为中心 我当前的问题是我想添加以下功能 当我单击画布边缘附近 左或右 时 如果正方形的一部分不在画布
  • 将新行添加到数据表

    我有一个DataGrid绑定到具有一张表和一列 FooTable 和 FooName 的数据库 使用以下代码 我可以绑定DataGrid to DataTable并显示数据库数据 但是当我每次添加新行时DataSet Add Click 没
  • JAXB - 具有递归依赖性的编组

    有人尝试用递归引用封送 JAXB 对象吗 我有以下课程 public class A private Long id private String name private List a aList 我想将其编组为 a a a a a a
  • 列表视图行布局的动态变化也会影响其他行

    我正在使用 ListView 每个列表元素上都有几个按钮 当单击一行上的按钮时 该按钮应该消失 单击时单击的按钮消失 没关系 问题是其他一些列表元素按钮也消失了 例如 当我单击第一个元素按钮时 它也会影响第 6 11 16 个元素中的按钮
  • 将文本添加到点阵条形图中的面板

    我尝试向具有多个面板的格子条形图中的条形添加标签 我最终得到了太多的标签 每个标签都在每个面板中 这是我的代码 library lattice data iris barchart seq 1 50 Petal Width Petal Le
  • 也可以将 swift println 日志写入文件吗?

    将日志写入文本文件也是一种简单的方法吗 我需要一个崩溃日志来分析何时出现问题 但我已经在代码中使用了 println al Use String writeToFile lt path String gt atomically lt Boo
  • 在 DevExtreme/Phonegap 上使用 FCM 推送通知

    我使用 DevExtreme 开发了我的应用程序 这是一个基于 PhoneGap 的多平台工具 现在 我尝试使用phonegap plugin push 管理推送通知 我的第一个简单目标是发送接收来自 FCM Firebase 云消息传递
  • 线性规划 - Google ortool - 错误的决策变量最终值

    我正在尝试解决线性规划问题 以下是问题的具体情况 我有一个网络流问题已转换为线性规划问题 因此 所有流量约束 例如容量 流量守恒等 都必须强制执行 我的目标是最小化成本 决策变量 我通过定义字典并在这 128 个位置中的每个位置添加决策变量