[請教]遇到這種問題,你會怎麼做?(分不是問題)

Edifier0709 2005-03-14 07:14:55
最近在項目中遇到了這樣一個爆復雜的問題,請教各位前輩,可以用什麼比較好的方法來解決類似問題?請給出您的寶貴的Idea,非常感謝!
問題相關描述如下:

需實現一個功能,就是將某些東東(如A、B、C、D)放入某個倉庫中的某一個盒子中,用程序來得出如數量50個A物品需要放到哪些盒子中,這些盒子需要
符合物品的某些條件且必須是空的(用一個UseStatus來表示該盒子的狀態,如0為空閒2為占用)
然而,產品A可能有一些預設的存放條件,比如說該物品必須要放在某一個倉庫?某一個區域等等。
去找這些盒子的時候,如果發現符合預設條件的盒子沒有,則找出與該條件最相近的。
這個功能目前已經基本實現,不過采用的算法比較笨拙,就是列舉出某個物品預設條件是6個預設條件(StoreCode,AreaCode,PipeCode,ShelfCode,LayerCode,RowCode)中的任意一個組合
而且在並法控制上做得不理想,這個處理過程是我在存儲過程中來實現的。
哎,狂暈,不知道描述清楚了沒,請看以下數據表

如存在表LocationInfo用於存放倉庫中儲位(也就是上面所說的盒子)的信息,結構如下:
LocationID(儲位代碼)
StoreCode(倉庫代碼)
AreaCode(區域代碼)
PipeCode(管道代碼)
ShelfCode(貨架代碼)
LayerCode(層級代碼)
RowCode(格級代碼)
UseStatus(使用狀態:0為空閒,1為鎖定,2為占用)

LocationID StoreCode AreaCode PipeCode ShelfCode LayerCode RowCode UseStatus
----------------------------------------------------------------------------------------------------------------------------
A-P13-1 A 03 P P 01 13 0
A-B15-4 A 03 P P 04 15 0
B-C12-3 B 03 C C 03 12 0
B-P13-7 B 02 P P 07 13 0
C-T19-6 C 03 T T 06 19 0
C-T19-7 C 03 T T 07 19 0
C-T19-8 C 03 T T 08 19 0
C-T19-9 C 03 T T 09 19 0
C-T20-1 C 03 T T 01 20 0
C-T20-2 C 03 T T 02 20 0

以上記錄內容說明:
如A-P13-1的位置是倉庫A中03區域中P管道P貨架01層13格
...

如存在表ProductInfo用於存放產品信息,結構如下:
ProductID(產品編號)
ProductName(產品名稱)
StorageLife(保存期限)
PileNum(堆放箱數)
StoreCode(預設存放倉庫)
AreaCode(預設存放區域)
PipeCode(預設存放管道)
ShelfCode(預設存放貨架)
LayerCode(預設存放層級)
RowCode(預設存放格級)

ProductID ProductName StorageLife PileNum StoreCode AreaCode PipeCode ShelfCode LayerCode RowCode
----------------------------------------------------------------------------------------------------------------------------
5171001 Product1 365 50 A A P S1
5171002 Product2 365 48 B H 2
5171003 Product3 180 35
5171004 Product4 120 50 C 1
5171005 Product5 365 60 D D N
5171006 Product6 180 50 B
5171007 Product7 365 48 A A S2
5171008 Product8 365 65

以上記錄內容說明:
如5171001產品設定了預設存放條件(該產品需存放在A倉庫的A區域的P1管道的S1貨架上的任何一個Location(儲位)中)
如5171002產品設定了預設存放條件(該產品需存放在B倉庫的任何區域的P3管道的任何貨架的第2層的任何一個Location(儲位)中)
如5171003產品並沒有設定任何預設條件,也就是說該產品可以被存放在任何倉庫任何區域任何管道任何貨架任何層級的任何一個儲位中)
堆放箱數即一個Location中可以存放的數量
該Table中的產品可能預設條件是6個預設條件(StoreCode,AreaCode,PipeCode,ShelfCode,LayerCode,RowCode)中的任意一個組合
...

For example:
現在有編號為5171003的產品70個,我們知道該產品的堆放箱數為35,且該產品沒有預設存放條件(即可以放到任何儲位中)
那麼可以輕松的從LocationInfo(儲位信息表)中Select出狀態為0(空閒)的儲位2個(數量70除以堆放箱數35得出需要2個儲位)
如:
A-P13-1 A 03 P P 01 13 0
A-B15-4 A 03 P P 04 15 0

再比如說有編號為5171007的產品50個,這個產品有預設的存放條件:需存放在A倉庫,A-3區域,S2貨架上的任一儲位,則可以到
LocationInfo(儲位信息表)中找狀態為0的倉庫為A區域為A-3貨架為S2的儲位,如果沒有則找條件相近的,如倉庫為A區域為A-3的
或倉庫為A貨架為S2的
...全文
208 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
shield0771 2005-03-18
  • 打赏
  • 举报
回复
能不能把找到解决方案的思想方法出来?
大家关注你的问题也是想从中学习的嘛
Edifier0709 2005-03-18
  • 打赏
  • 举报
回复
Thanks for your reply.

I have found the answer already!

Thank you,again
shield0771 2005-03-16
  • 打赏
  • 举报
回复
帮顶~~~学习~~~

該Table中的產品可能預設條件是6個預設條件(StoreCode,AreaCode,PipeCode,ShelfCode,LayerCode,RowCode)中的任意一個組合

如果是任意一個組合(也就是说6个条件平等),那条件多了以后要判断的组合实在太多......
能不能牺牲分配空间的灵活性,给这6个条件加上优先级(比如说最优先存放仓库,然后判断存放区域),这样可以用类似树的遍历来查找最优匹配项(还可以用上一些剪枝算法提高查找效率),感觉这样更符合现实的使用情况(存放条件有优先级)
感觉你上面帖的代码也带有預設條件的判断优先级呢
Edifier0709 2005-03-16
  • 打赏
  • 举报
回复
無人問津

悲慘
baobei7758 2005-03-15
  • 打赏
  • 举报
回复
mark
ziyan0218 2005-03-15
  • 打赏
  • 举报
回复
upup
心情解码 2005-03-15
  • 打赏
  • 举报
回复
up









--
Edifier0709 2005-03-15
  • 打赏
  • 举报
回复
比如說上面這段代碼可以找出符合條件的一些Location先存放到臨時表裡,它們是算vlevel(優先級)來排序的,也就是越吻合多個條件的越在前面,然後我在從前面開始找出足夠的Location
Edifier0709 2005-03-15
  • 打赏
  • 举报
回复
首先,謝謝樓上的各位

下面是我處理時的代碼片斷的簡化:
select a.LocationCode,a.StoreCode,dbo.getProdPileNumbyCode(@ProdCode) as PileNum,
case
when a.LayerCode = @LayerCode and a.ShelfCode = @ShelfCode and a.PipeCode = @PipeCode and a.AreaCode = @AreaCode then '1'
when a.LayerCode <> @LayerCode and a.ShelfCode = @ShelfCode and a.PipeCode = @PipeCode and a.AreaCode = @AreaCode then '2'
when a.LayerCode <> @LayerCode and a.ShelfCode = @ShelfCode and a.PipeCode = @PipeCode and a.AreaCode = @AreaCode then '3'
when a.LayerCode <> @LayerCode and a.ShelfCode <> @ShelfCode and a.PipeCode = @PipeCode and a.AreaCode = @AreaCode then '4'
when a.LayerCode <> @LayerCode and a.ShelfCode <> @ShelfCode and a.PipeCode <> @PipeCode and a.AreaCode = @AreaCode then '5'
when a.LayerCode <> @LayerCode and a.ShelfCode <> @ShelfCode and a.PipeCode <> @PipeCode and a.AreaCode <> @AreaCode then '6'
else '7'
end as vlevel
into #Temp_Table_Location
from BS_StoreLocationBS a,
(select LocationTypeCode,StoreCode,TempLayer from BS_ProductLDHeader where ProdCode = @ProdCode) b
where a.StoreCode = @StoreCode
and a.LocationTypeCode = b.LocationTypeCode
and a.TempLayerCode = b.TempLayer
and a.UseStateSign = '0'
and a.OrganizeCode like @OrganizeCode+'%'
and (dbo.getStoreTypebyStoreCode(a.StoreCode) = '01')
order by vlevel,a.LocationCode



reddeephehe 2005-03-15
  • 打赏
  • 举报
回复
最近在项目中遇到了这样一个爆复杂的问题,请教各位前辈,可以用什么比较好的方法来解决类似问题?请给出您的宝贵的Idea,非常感谢!
问题相关描述如下:

需实现一个功能,就是将某些东东(如A、B、C、D)放入某个仓库中的某一个盒子中,用程序来得出如数量50个A物品需要放到哪些盒子中,这些盒子需要
符合物品的某些条件且必须是空的(用一个UseStatus来表示该盒子的状态,如0为空闲2为占用)
然而,产品A可能有一些预设的存放条件,比如说该物品必须要放在某一个仓库?某一个区域等等。
去找这些盒子的时候,如果发现符合预设条件的盒子没有,则找出与该条件最相近的。
这个功能目前已经基本实现,不过采用的算法比较笨拙,就是列举出某个物品预设条件是6个预设条件(StoreCode,AreaCode,PipeCode,ShelfCode,LayerCode,RowCode)中的任意一个组合
而且在并法控制上做得不理想,这个处理过程是我在存储过程中来实现的。
哎,狂晕,不知道描述清楚了没,请看以下数据表

如存在表LocationInfo用于存放仓库中储位(也就是上面所说的盒子)的信息,结构如下:
LocationID(储位代码)
StoreCode(仓库代码)
AreaCode(区域代码)
PipeCode(管道代码)
ShelfCode(货架代码)
LayerCode(层级代码)
RowCode(格级代码)
UseStatus(使用状态:0为空闲,1为锁定,2为占用)

LocationID StoreCode AreaCode PipeCode ShelfCode LayerCode RowCode UseStatus
----------------------------------------------------------------------------------------------------------------------------
A-P13-1 A 03 P P 01 13 0
A-B15-4 A 03 P P 04 15 0
B-C12-3 B 03 C C 03 12 0
B-P13-7 B 02 P P 07 13 0
C-T19-6 C 03 T T 06 19 0
C-T19-7 C 03 T T 07 19 0
C-T19-8 C 03 T T 08 19 0
C-T19-9 C 03 T T 09 19 0
C-T20-1 C 03 T T 01 20 0
C-T20-2 C 03 T T 02 20 0

以上记录内容说明:
如A-P13-1的位置是仓库A中03区域中P管道P货架01层13格
...

如存在表ProductInfo用于存放产品信息,结构如下:
ProductID(产品编号)
ProductName(产品名称)
StorageLife(保存期限)
PileNum(堆放箱数)
StoreCode(预设存放仓库)
AreaCode(预设存放区域)
PipeCode(预设存放管道)
ShelfCode(预设存放货架)
LayerCode(预设存放层级)
RowCode(预设存放格级)

ProductID ProductName StorageLife PileNum StoreCode AreaCode PipeCode ShelfCode LayerCode RowCode
----------------------------------------------------------------------------------------------------------------------------
5171001 Product1 365 50 A A P S1
5171002 Product2 365 48 B H 2
5171003 Product3 180 35
5171004 Product4 120 50 C 1
5171005 Product5 365 60 D D N
5171006 Product6 180 50 B
5171007 Product7 365 48 A A S2
5171008 Product8 365 65

以上记录内容说明:
如5171001产品设定了预设存放条件(该产品需存放在A仓库的A区域的P1管道的S1货架上的任何一个Location(储位)中)
如5171002产品设定了预设存放条件(该产品需存放在B仓库的任何区域的P3管道的任何货架的第2层的任何一个Location(储位)中)
如5171003产品并没有设定任何预设条件,也就是说该产品可以被存放在任何仓库任何区域任何管道任何货架任何层级的任何一个储位中)
堆放箱数即一个Location中可以存放的数量
该Table中的产品可能预设条件是6个预设条件(StoreCode,AreaCode,PipeCode,ShelfCode,LayerCode,RowCode)中的任意一个组合
...

For example:
现在有编号为5171003的产品70个,我们知道该产品的堆放箱数为35,且该产品没有预设存放条件(即可以放到任何储位中)
那么可以轻松的从LocationInfo(储位信息表)中Select出状态为0(空闲)的储位2个(数量70除以堆放箱数35得出需要2个储位)
如:
A-P13-1 A 03 P P 01 13 0
A-B15-4 A 03 P P 04 15 0

再比如说有编号为5171007的产品50个,这个产品有预设的存放条件:需存放在A仓库,A-3区域,S2货架上的任一储位,则可以到
LocationInfo(储位信息表)中找状态为0的仓库为A区域为A-3货架为S2的储位,如果没有则找条件相近的,如仓库为A区域为A-3的
或仓库为A货架为S2的
redstorm11 2005-03-15
  • 打赏
  • 举报
回复
帮你顶一下
spz1755 2005-03-15
  • 打赏
  • 举报
回复
我看繁体头疼,哪位老兄翻译一下?
xuandme000 2005-03-15
  • 打赏
  • 举报
回复
还没有遇到这么复杂的东西,
帮你顶一下吧!
njuzgj 2005-03-15
  • 打赏
  • 举报
回复
UP
terryshi 2005-03-15
  • 打赏
  • 举报
回复
可不可以~~这样~~当我瞎说:
把六个code连成一个字符串,规定某些位置的字符是用来匹配的,匹配相应位子的字符是不是相同,相同最多的认为是最相近的。
simon8181 2005-03-15
  • 打赏
  • 举报
回复
我的想法和你一样,帮你在想想
syeerzy 2005-03-15
  • 打赏
  • 举报
回复
列舉出某個物品預設條件是6個預設條件(StoreCode,AreaCode,PipeCode,ShelfCode,LayerCode,RowCode)中的任意一個組合

这算法是不太理想,时间复杂度太高。

一时还没想到好的方法,但其实最简单的办法都比你列出组合好。比如对其中一个条件列出符合,再在该符合条件里再列第2个条件,然后第3。。。。。。

虽然也是笨方法。不过时间复杂度却大大提高了(假设每条件有10种情况,你的方法要考虑1000000种情况,而这样只要60以内,已经是飞跃了)。

聪明的方法还没想到。
Edifier0709 2005-03-15
  • 打赏
  • 举报
回复
看來還是得自己慢慢來優化了

沒人願意提供建議?
Edifier0709 2005-03-15
  • 打赏
  • 举报
回复
謝謝樓上的兄弟
chuxue1342 2005-03-15
  • 打赏
  • 举报
回复
帮你顶!!!
加载更多回复(6)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧