一、从B到A的禁忌插入
A=[1+,2+,3-,4-,5+,6-,7+,8-]
和B=['a+','b+','c-','d-','e+']
A具有顺序要求,因此插入位置的不同,会导致插入结果的不同。
A具有端点的属性要求。A的首位置必须是+,A的末尾必须是-。
- 从B中取出首位置的元素a。
- 判断元素a是否属于tabo_remove【禁忌列表:表示从A到B移动的节点】
- 并判断元素的属性:+ or -/
- if +:随机选择从(0,len-1)的位置,插入
if -:随机选择从(1,len)的位置,插入- 将元素放入tabo_insert
二、从A到B的禁忌移除
A=[1+,2+,3-,4-,5+,6-,7+,8-]
和B=['a+','b+','c-','d-','e+']
A具有顺序要求,因此移除位置的不同,会导致移除结果的不同。
A具有端点的属性要求。A的首位置必须是+,A的末尾必须是-。
B不具有顺序要求,因此移除的节点直接添加到B的末尾即可。
- 对于第一个节点需要额外判断:第一个移除后,第二个节点是否可以承担首节点的要求,即要求属性为+
2.对于最后一个节点需要额外判断:最后一个移除后,倒数第二个节点是否可以承担起尾节点的要求,即要求为-。- 每个节点都应该检查是否属于tabo_insert【禁忌列表:从B插入到A的节点】
- 将移除的节点删除
- 在B后的末尾加入新节点
三、A与B的禁忌交换
A=[1+,2+,3-,4-,5+,6-,7+,8-]
和B=['a+','b+','c-','d-','e+']
A具有顺序要求,因此交换位置的不同,会导致交换结果的不同。
A具有端点的属性要求。A的首位置必须是+,A的末尾必须是-。
B不具有顺序要求,因此交换的节点直接添加到B的末尾即可。
- 对于A列表中随机选择一个交换位置index。
- if index==0:则在B中按照顺序选择一个+属性的节点。如果没有+属性,则重新选择交换位置。
- if index==len(A)-1:则在B中按照顺序选择一个-属性的节点。如果没有-属性,则重新选择交换位置。
- 其他的交换位置,则在B中按照顺序弹出一个即可。
- 先拿走A中的元素
- 拿出B中选择的元素,按照交换位置插入A
- 将A中拿走的元素在B的末尾插入。
四、列表A和列表B的禁忌配对
A=[1+,2+,3+,4+,5+,6+,7+,8+]
和B=['a-','b-','c-','d-','e-']
要从A中选择一个,再从B中选择一个,构成配对。该配对不能已经配过了。
此外A和B还会因为其他因素,导致元素减少。
- A1=A.copy(),B1=B.copy()
- 最糟糕的情况下为A=[1,8],B=[a,c]两两不成配对。
- 顺序从A1中选择第一个节点p
3.1 顺序从B1中选择节点d
3.2 if 判断d是否是p的禁忌
3.2.1 是:遍历B1的下一个节点。判断p,d是否为都为最后一个节点是
3.2.2 否:if 判断(p,d)是否构成节点对
3.3.2.1 是:跳出选择配对环节
3.3.2.2 否: 将d记作p的禁忌,遍历B1的下一个节点。判断p,d是否都为最后一个节点。