Flow Shop 到布尔可满足性 [多项式时间缩减]

2024-04-06

我联系您是为了了解“如何将流水车间调度问题”转化为布尔可满足性。

我已经对 N*N 数独、N 皇后和班级调度问题进行了此类简化,但我对如何将流水车间转换为 SAT 有一些问题。

SAT 问题如下所示:

目标是:使用不同的布尔变量,找到每个变量的影响以使“句子”为真。 (如果可以找到解决方案)。

我使用遗传算法创建自己的求解器,能够找到解决方案并证明何时没有解决方案。现在,我尝试解决不同的 NP 问题,例如 Flow Shop。

流水车间调度问题是车间或集团车间的一类调度问题,其中流程控制应能够对每个作业以及在一组机器或其他资源上进行的处理进行适当的排序 1,2,...,m遵守给定的加工指令。

尤其需要以最少的空闲时间和最少的等待时间来维持处理任务的连续流。

流水车间调度是作业车间调度的一种特殊情况,其中对所有作业执行的所有操作都有严格的顺序。

流水车间调度既可以应用于生产设施,也可以应用于计算设计。

(http://en.wikipedia.org/wiki/Flow_shop_scheduling http://en.wikipedia.org/wiki/Flow_shop_scheduling)

结果是一系列将经历每个研讨会的作业,图形结果将如下所示:

因此,为了表示流水作业实例,在输入中我有这样的文件:

2 4
4 26 65 62 
63 83 57 9 

这个文件意味着我有 2 个商店和 4 个作业,以及每个作业在每台机器上的所有持续时间。

目标:找到最小化 C_max 的序列,C_max 是最后一台机器上最后一个作业的结束日期(如果您愿意)。

我的 Flow-Shop 目前非常简单,但我不知道如何将它们形式化,以便创建一个 CNF 文件来执行我的 SAT 求解器。

如果你们中的一个人有一些想法:文章?一个想法的开始?

这个问题的下一部分:Flow/Job Shop 到布尔可满足性 [多项式时间缩减] 第 2 部分 https://stackoverflow.com/questions/29651856/flow-job-shop-to-boolean-satisfiability-polynomial-time-reduction-part-2


我会这样处理:

对于每台机器上每个可能的时间开始的每个资源使用情况,都有一个布尔变量(当然,这要求时间是有限的和离散的,所以我假设是整数)。

所以你会得到像这样的变量s_1_2_3其含义是资源从第二台机器 3 开始在机器 2 上使用。

现在您可以根据这些变量制定各种条件。喜欢:

  • 每个资源一次只能在一台机器上使用
  • 每台机器一次只能处理一种资源
  • 机器步骤必须按顺序发生(机器 1 需要处理资源 x,然后机器 2 才能完成其工作)

警告:即使对于小问题,这也会造成HUGE布尔表达式的数量。

正如 @gwilkins 提到的,您需要将优化问题转换为布尔问题。我会遵循他的方法:找到您愿意接受的最大时间并解决该时间限制(这实际上限制了变量的数量)。

您还可以从应该有解决方案的事物(例如添加的所有作业的时间)和自然下限的事物(最长作业所需的时间)开始,然后通过分割间隔找到最佳解决方案。

再说一次:这可能会表现得非常糟糕,但它应该提供正确的解决方案。

使用此变量制定的约束示例:

机器 1 必须先处理资源 x,然后机器 2 才能完成其作业(假设作业长度为 1):

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

Flow Shop 到布尔可满足性 [多项式时间缩减] 的相关文章

  • VB.NET 是否优化字符串文字的串联?

    如同this https stackoverflow com questions 288794 does c optimize the concatenation of string literals问题 但对于 VB NET 来说 因为我
  • 使用 lpSolve 优化 R 团队名单

    我是 R 新手 有一个想要解决的特定幻想运动队优化问题 我见过其他帖子使用 lpSolve 来解决类似的问题 但我似乎无法理解代码 下面的示例数据表 每个球员都在一个球队中 扮演着特定的角色 有薪水 并且每场比赛都有平均得分 我需要的限制是
  • 我有*很多*源文件要添加到 git 存储库,如何使其快速

    我在看here https git scm com docs git fast import寻找更快地将批量文件导入 git 存储库的灵感 但不确定是不是这样 基本上情况是 我有超过 1 亿个文件想要提交到 git 存储库 我已将它们分解为
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • 将嵌套循环计算转换为 Numpy 以加速

    我的Python程序的一部分包含以下代码段 其中一个新的网格 是根据旧网格中找到的数据计算的 网格是二维浮点数列表 该代码使用了三个 for 循环 for t in xrange 0 t step for h in xrange 1 hei
  • 优化正则表达式来解析中文拼音[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个有
  • 编程 Pearls - 随机选择算法

    Programming Pearls 第一版第 120 页介绍了从 N 个整数总体中选择 M 个等概率随机元素的算法 InitToEmpty Size 0 While Size lt M do T RandInt 1 N if not Me
  • 快速求解子集和

    考虑这种解决子集和问题的方法 def subset summing to zero activities subsets 0 for activity cost in activities iteritems old subsets sub
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null
  • 在 C++ 中通过引用传递 std 算法谓词

    我正在尝试从 a 中删除元素std list并保留已删除元素的一些统计信息 为此 我使用列表中的remove if 函数 并且我有一个谓词 我想使用这个谓词来收集统计数据 这是谓词的代码 class TestPredicate privat
  • 无需构建树即可预测霍夫曼压缩比

    我有一个二进制文件 我知道其中每个符号出现的次数 如果我要使用霍夫曼算法压缩它 我需要预测压缩文件的长度 我只对假设的输出长度感兴趣 而不对单个符号的代码感兴趣 因此构建霍夫曼树似乎是多余的 作为一个例子 我需要得到类似的东西 包含 4 个
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提

随机推荐