习题3: 优化过程

第三次作业题涉及到一个新的优化算法: Two Edge Exchange,也叫2-opt算法。

1 Two Edge Exchange Move理论基础

2-opt算法是一个非常著名的路线规划的优化方法。其核心是,每次去除两条不相邻的路径,并将产生的子序列重新连接起来。过程如图所示:

2-opt图解

这个概念也可以应用于工业生产中的订单排期。在这里,在一个订单序列中,订单不仅作为单独的元素被考虑,订单之间的连接(路径或边)也被考虑。如果订单i直接跟随订单j,这两个订单通过一个链接,或 "边",(i,j)连接。因此,所谓的TwoEdge Exchange Move可以定义如下:

一个TwoEdgeExchange MoveM(\text{2-EdgeExchange}, s, i, j)描述了两对订单(i,i+1)(j,j+1)的连接交换。在这里,连接可能不相邻。连接(i,i+1)(j,j+1)被移除,并且被重新连接的路径或者边为:(i,j)(i+1,j+1)

a) 第一次交换

给出以下的生产序列 s=[0,1,2,3,4,5,6]。手动执行以下TwoEdgeExchange-Move:
M(\text{2-EdgeExchange}, s, 1, 4)

  • 答案:M(\text{2-EdgeExchange}, s, 1, 4) = [0, 1, 4, 3, 2, 5, 6]

*提示:思路很简单,把原本连着的 i 和 i+1 以及 j 和 j+1 断开,再把 i 和 j 连起来, i+1 和 j+1 也要连起来

b) 计算复杂度

确定TwoEdge Exchange-Move邻域的复杂性。假设一个解决方案由长度为n的置换表示,并且|j-i|geq 3成立。

注:复杂性是n的函数。

  • 答案:|N(\text{2-EdgeExchange}, s)| = 1/2 * (n-4) * (n-3)

3 TwoEdgeExchange-Move 代码实现

用TwoEdge Exchange-Move邻域来扩展前八章中创建的求解器Solver 。创建 "TwoEdgeExchangeMove"和 "TwoEdgeExchangeNeighborhood"类。

在数据集InputFlowshopSIST20.json上测试邻域。使用BestImprovement策略和FCFS初始方案。

# 2 classes in Neighborhood.py
class TwoEdgeExchangeMove:
# 这个类借鉴了前面内容中,列表元素交换的思路。我们首先定义TwoEdgeExchangeMove类,定义类的时候要注意类应具有普遍性,也就是说类应该能够适用于交换任意两个位置的订单。
# 看构造函数的参数表,我们首先需要一个初始排列,还有我们想要交换位置的元素的索引。然后在构造函数中完成交换过程,并把交换位置后的列表赋给self.Permutation,即这个类的对象的属性。
# 这样,每当我们构造一个TwoEdgeExchangeMove的对象(在循环中),这个对象的Permutation属性就被确定了
    def __init__(self, initialPermutation, indexA, indexB):
        self.Permutation = list(initialPermutation)
        self.IndexA = indexA
        self.IndexB = indexB

        # 这里需要注意细节,python中的列表包含左边,不包含右边
        # 另外还要理解2-opt的交换过程,简单说就是从序列中选两个点,A和B,A左边和B右边的节点和路径保持不变,AB中间的节点颠倒顺序
        list_left = initialPermutation[0: indexA+1]
        list_mid = reversed(initialPermutation[indexA+1: indexB+1])
        list_right = initialPermutation[indexB+1: ]

        self.Permutation = list_left+list(list_mid)+list_right

class TwoEdgeExchangeNeighborhood(BaseNeighborhood):
    def __init__(self, inputData, initialPermutation, evaluationLogic, solutionPool):
        super().__init__(inputData, initialPermutation, evaluationLogic, solutionPool)
        self.Type = 'TwoEdgeExchange'

    def DiscoverMoves(self):
        for i in range(0, len(self.Permutation)-4):
            for j in range(i+3, len(self.Permutation)-1):
                
                twoEdgeExchangeMove = TwoEdgeExchangeMove(self.Permutation, i, j)

                self.Moves.append(twoEdgeExchangeMove)

# ImprovementAlgorithm.py
def CreateNeighborhood(self, neighborhoodType, bestCurrentSolution):
    if neighborhoodType == 'Swap':
        return SwapNeighborhood(self.InputData, bestCurrentSolution.Permutation, self.EvaluationLogic, self.SolutionPool)
    elif neighborhoodType == 'Insertion':
        return InsertionNeighborhood(self.InputData, bestCurrentSolution.Permutation, self.EvaluationLogic, self.SolutionPool)
    elif neighborhoodType == 'TwoEdgeExchange':
        return TwoEdgeExchangeNeighborhood(self.InputData, bestCurrentSolution.Permutation, self.EvaluationLogic, self.SolutionPool)
    else:
        raise Exception(f"Neighborhood type {neighborhoodType} not defined.")
from Solver import *


data = InputData("InputFlowshopSIST20.json")

localSearch = IterativeImprovement(data, 'BestImprovement', ['TwoEdgeExchange'])

solver = Solver(data, 1008)

solver.RunLocalSearch(
    constructiveSolutionMethod='FCFS',
    algorithm=localSearch)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容