为分配/指派问题建立线性规划

2024-03-06

我在线性程序方面遇到了一些麻烦,我已经解决并使用 Excel,但现在我想在 R/Python 中执行它,因为我已经达到了 Excel 和求解器的限制。因此,我就这个特定主题寻求帮助。

我通过改变 lp.assign 函数尝试使用 lPsovle 包,但我无法想出解决方案。

问题如下:

假设我是商品的交付者。

我有不同的仓库,服务于不同的区域。这些地区必须满足他们的需求。 另一方面,我的仓库的处理和交付能力受到限制。 一个站点可以服务多个区域,但一个区域只能由一个站点服务。

我有仓库和区域之间连接的距离/成本矩阵以及该区域的需求。

该解决方案的目标应该是以尽可能最小的努力为这些区域提供服务。

假设成本/距离矩阵如下所示:

assign.costs <- matrix (c(2, 7, 7, 2, 7, 7, 3, 2, 7, 2, 8, 10, 1, 9, 8, 2,7,8,9,10), 4, 10)

因此,这创建了我的矩阵,其中第一行/标题中包含客户/区域,第一列/行名称中包含仓库。

现在地区/客户的需求是:

assign.demand <- matrix (c(1,2,3,4,5,6,7,8,9,10), 1, 10)

容量限制,存款可以提供的金额是:

assign.capacity <- matrix (c(15,15,15,15), 4, 1)

所以现在我希望通过 lp 来解决这个问题,以生成分配,根据这些限制,哪个区域应该由哪个仓库提供服务。

结果应该是这样的:

assign.solution <- matrix (c(1,0,0,0 ,0,1,0,0, 1,0,0,0, 1,0,0,0 ,0,0,0,1), 4, 10)

至于限制,这意味着每一列最多只能有一个。

我尝试使用 lpSolve 中的 lpsolve 和 lp.assign 函数,但我不知道如何实现我所拥有的确切类型的限制,并且我已经尝试更改 lp.assign 函数,但没有成功。 如果有帮助的话,我还可以制定 lp 的方程。

谢谢大家的帮助,我现在真的很困难:D

BR


步骤 1. 建立数学模型

数学模型可以如下所示:

蓝色条目表示数据,红色条目表示决策变量。i是仓库和j是客户。Ship表明我们是否从i to j(它是一个二进制变量)。第一个约束条件是从仓库发货的总金额i不应超过其容量。第二个约束条件是必须只有一个供应商i对于每个客户j.

步骤 2. 实施

现在这只是一个精确的问题。我尽可能严格地遵循上一节中的模型。

library(dplyr)
library(tidyr)
library(ROI)
library(ROI.plugin.symphony)
library(ompr)
library(ompr.roi)

num_depots <- 4
num_cust <- 10

cost <- matrix(c(2, 7, 7, 2, 7, 7, 3, 2, 7, 2, 8, 10, 1, 9, 8, 2,7,8,9,10), num_depots, num_cust)
demand <- c(1,2,3,4,5,6,7,8,9,10)
capacity <- c(15,15,15,15)

m <- MIPModel() %>%
  add_variable(ship[i,j], i=1:num_depots, j=1:num_cust, type="binary") %>%
  add_constraint(sum_expr(demand[j]*ship[i,j], j=1:num_cust) <= capacity[i], i=1:num_depots) %>% 
  add_constraint(sum_expr(ship[i,j], i=1:num_depots) == 1, j=1:num_cust) %>% 
  set_objective(sum_expr(cost[i,j]*ship[i,j], i=1:num_depots, j=1:num_cust),"min") %>% 
  solve_model(with_ROI(solver = "symphony", verbosity=1))

cat("Status:",solver_status(m),"\n")
cat("Objective:",objective_value(m),"\n")
get_solution(m,ship[i, j]) %>%
  filter(value > 0) 

我们看到首先写下一个数学模型是多么重要。它比一堆代码更紧凑、更容易推理。直接编写代码通常会导致各种问题。就像盖房子没有蓝图一样。即使对于这个小例子,写下数学模型也是一个有用的练习。

对于实现,我使用 OMPR 而不是 LpSolve 包,因为 OMPR 让我更接近数学模型。 LpSolve 有一个矩阵接口,除了非常结构化的模型之外,很难使用。

第三步:解决它

Status: optimal 
Objective: 32 
   variable i  j value
1      ship 1  1     1
2      ship 4  2     1
3      ship 2  3     1
4      ship 1  4     1
5      ship 3  5     1
6      ship 4  6     1
7      ship 4  7     1
8      ship 2  8     1
9      ship 1  9     1
10     ship 3 10     1

我相信这是正确的解决方案。

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

为分配/指派问题建立线性规划 的相关文章

随机推荐

  • 无法使用 urllib2 将内容类型设置为 application/json

    这个小宝贝 import urllib2 import simplejson as json opener urllib2 build opener opener addheaders append Content Type applica
  • NSTableView 未显示

    这是上一个问题的后续 对不起 我不知道如何添加代码或编辑 5 分钟前编写的内容 一个简短的总结 我正在尝试在常规视图上显示自定义 派生的 TableView 我没有使用IB 而是从代码中完成一切 这里的目标是构建应用程序 同时也是学习 Co
  • FileProvider 崩溃 - npe 尝试对 null 字符串调用 XmlResourceParser

    这是我的清单的一部分
  • 如何扩展现有的docker镜像?

    我在用着官方的elasticsearch Docker 镜像 https hub docker com r elasticsearch 而不是设置我自己的弹性搜索实例 这非常有效 直到我想扩展它为止 我想安装marvel http www
  • VBScript 发送键“

    我有一个 VBScript 可以取消订阅所有 Steam 创意工坊对象 Code Set WshShell WScript CreateObject WScript Shell WshShell AppActivate Steam Comm
  • 如何选择 cypress 自动完成字段

    我如何在 cypress 中选择自动完成字段 该字段如下所示 这是 HTML 代码 div class mui select span style color rgb 51 51 51 font family none font size
  • 有没有更好的方法使用 Dash by Plotly 执行多重输出?

    正如我们所看到的入门的互动部分 https plot ly dash getting started part 2 interactivity 一个回调函数可以接受多个输入 但始终只有一个输出 假设我们有两个单独的块 它们必须在输入更改后更
  • 数组“__curl_rule_01__”的大小为负数

    我在尝试编译 GIT 时遇到错误 我已经在 Google 和 GIT 源代码问题 错误中搜索了类似的问题 但没有找到任何可以帮助我的内容 最初我收到以下错误 root teemo usr src git make prefix usr in
  • 使用 Swift 3.0 将 JSON 数组解析到服务器

    我正在尝试将 JSON 数组发送到 Web 服务器 我在网上看了几个例子 即 and 使用 Swift 3 0 将 CoreData 保存到 Web 服务器 https stackoverflow com questions 4619996
  • 使用前缀或域的路由

    我正在开发一个平台 该平台允许用户在主网站域的子文件夹中运行自己的网站 或者为其网站映射自定义域 使用自定义域时 每个路由的 URL 结构略有不同 因为它以用户名为前缀 但使用自定义域时 不使用此前缀 有没有一种巧妙的方法可以在我的 Rou
  • 通过递归得出帕斯卡三角形

    有人可以告诉我我当前的代码是否可行吗 我必须使用输入创建帕斯卡三角形 而不使用任何循环 我注定要递归 我花了三天时间来做这个 这是我能想到的最好的输出 def pascal curlvl newlvl tri if curlvl newlv
  • R 中向量的子集()

    我根据以下函数编写了subset 我觉得很方便 ss lt function x subset r lt eval substitute subset data frame x parent frame if is logical r st
  • 将 JSON 解析为 MONGODB 文档

    我是新来的JAVA and MONGODB并且一直在学习尝试并了解这些技术是否能够满足我对产品的要求 我目前陷入无法插入文档 记录 的地步JAVA进入我的MONGODB收藏 我正在使用新的MONGODB version 3 0 到目前为止的
  • 如何在heroku 上托管我的discord.py 机器人?

    我目前正在尝试将我的 Discord 机器人连接到 Heroku 并 24 7 托管它 但我遇到了问题 我将我的机器人上传到 githubhttps github com zemocode flankebot tree master htt
  • 如何更改 .net Web 应用程序中的默认区域性设置?

    我们的 Web 应用程序 net C 使用 amount ToString c 格式化货币金额 显示为几个不同区域的本地化 我们的法裔加拿大用户更喜欢所有金额均采用美国格式 123 456 99 而 fr CA 的默认 Windows 格式
  • Android中如何将日志写入SD卡? [复制]

    这个问题在这里已经有答案了 我的程序在设备中崩溃 我想在我的设备中运行时准确捕获程序的日志 即我想将日志写入我的 SD 卡 直到崩溃为止 我怎样才能实现这个目标 尝试这个 Thread setDefaultUncaughtException
  • 从模块关闭用户窗体

    我正在尝试从模块关闭用户表单 但它不起作用 这是我尝试过的 Sub UpdateSheetButton Dim subStr1 As String Dim subSrrt2 As String Dim tmp As Integer Dim
  • Android Flash 切换按钮崩溃

    应用程序在四种不同的设备上运行良好 但客户端在打开 关闭闪光灯按钮时面临崩溃Xperia z2 主要活动 btnFlash setOnClickListener new OnClickListener Override public voi
  • 需要 Nest REST API 的工作示例而不使用 Firebase API

    我正在努力寻找一个使用普通休息将数据写入 Nest Thermostat API 的工作示例 尝试编写 C 应用程序但无法使用 Firebase 到目前为止发布的多个 Curl 示例不起作用 我有一个有效的 auth token 并且可以毫
  • 为分配/指派问题建立线性规划

    我在线性程序方面遇到了一些麻烦 我已经解决并使用 Excel 但现在我想在 R Python 中执行它 因为我已经达到了 Excel 和求解器的限制 因此 我就这个特定主题寻求帮助 我通过改变 lp assign 函数尝试使用 lPsovl