使用lap.lapjv实现线性分配(我主要用来作为匈牙利算法的实现)

使用lap.lapjv实现线性分配(我主要用来作为匈牙利算法的实现)

lapjv算法是一种最佳任务分配方法,可以应用的地方很多。需要输入一个分数方阵,最终获得一列最佳分配数值。如 n 个数值,要实现其最佳的配对,那么配对就需要根据n*n的一个分数方阵来计算,以总体最小代价实现任务分配,每一个数值不会重复分配。这里不讨论如何构建分数矩阵。如下图,依据分数矩阵,以最小代价给每一个工人分配任务。
在这里插入图片描述
例1
以上工人分配显然不是最佳,那么最佳方式是怎么样的呢?下面用代码来看看:

>>> import lap
>>> from lap import lapjv
>>> import numpy as np
>>> a = np.array([[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]])
>>> a
array([[ 1,  2,  3,  4],
       [ 2,  4,  6,  8],
       [ 3,  6,  9, 12],
       [ 4,  8, 12, 16]])
>>> c,x,y = lapjv(a)
>>> c
20.0
>>> x
array([3, 2, 1, 0])
>>> y
array([3, 2, 1, 0])

由此可以看出,最佳分配为:a-s,b-r,c-q,d-p, 总代价最小为20.

代码测试二:

>>> import lap
>>> from lap import lapjv
>>> import numpy as np
>>> a = np.array([[0.1,0.6,0.3],[0.2,0.1,0.6],[0.5,0.2,0.9]])
>>>
>>> c,x,y = lapjv(a)
>>> c
0.7
>>> x
array([2, 0, 1])
>>> y
array([1, 2, 0])
>>>

这里返回三个值:
c: 赋值的代价,如果return_cost为False,则不返回。
x: 一个大小为n的数组,用于指定每一行被分配到哪一列。
y: 一个大小为n的数组,用于指定每列被分配到哪一行。

在这里插入图片描述
行索引分配[2,0,1]: cost = 0.3+0.2 +0.2 = 0.7

列索引分配 [1,2,0]:cost = 0.2 + 0.2 +0.3 =0.7

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
【资源说明】 python基于贪心、迭代实现的生物遗传物质切割算法源码.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 本项目实现将一个基因片段进行剪切,基因片段长度通常为500bp左右 实现步骤: 1. 使用贪心算法得到初始剪切位点 2. 从左往右,对上一步得初始切割得到的片段进行左右移动,实际上就是对每一个基因片段的切割位点进行左右移动 3. 使用贪心算法 变量: 1. 每个基因片段的最小长度和最大长度 2. 剪切后每个基因片段的最小值和最大值 3. 每个剪切基因片段之间的距离最大值(最小值可能为0,会不会有问题 4. 第一步贪心算法保存几个结果(10个 5. 每条链开头和结束最多可以剪切多少 #### 尝试更改 1. 使用整条gene的tm当做开始(不行,tm与第一次切割得到的tm相差太大) * 当前使用直接使用第一个与第二个最接近的当做开始,然后使用第一次切割得到的均值当做第二次切割的开始 2. 从后面开始或者从中间开始,得到多个切割的结果提供选择 * 或者使用第一步得到的tm序列中选择tm最小值的中间开始 3. 将每个片段输出 4. 将剪切后的结果进行拼接,得到有gap形式的链 5. 尝试根据第一遍遍历得到的序列tm分布情况得到从中间开始切割的位点 6. 程序中在迭代过程中好像还存在第一个切割位点(0)点不会向右移动的问题 #### 展示 1. 每个gap长度 2. 序列长度 #### 问题 1. 存在某些gap长度为0,会不会使得发卡结构概率变大?(没问题) 2. 第二条链得到的是3'端到5'端还是(第一条和第二条(互补链))--解决 3. C(1/n)没做,体现在C(2/n),一条链自成环可以体现在两条相同的链形成的发卡结构 4. primer浓度偏大影响大不大,(可能在nupack包中计算影响不大) 5. 输出什么(切割得到的片段、拼接后得到的片段、切割位点、解链温度、片段长度、 6. 输入什么(各种离子的浓度、切割允许的最大长度和最小长度、温度 --- 钠离子浓度默认为1mol/L over_lap开始不能取对tm标准差影响最大的,应该直接用tm最大上的 over_lap过程最多截取多少,两个小片段之间最大是多少 为了不影响两个片段之间,现在只是对每个片段处理 最后一段不够最小长度不管他 ------------------- 迭代: 每个片段长度最小为: min_len-5 每个片段长度最大值: max_len+5 -------------------- 细节问题: 1. 默认输入是5'端到3'端,返回的结果上面的单链是5'端到3'端,下面的是?(5'端到3'端,还是3'端到5'端)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值