关于配伍类的算法问题 大家进来唠唠吧 [又好久没提问了 哎]

「已注销」 2003-02-28 12:54:21
简单的描述问题如下:

A与B相容

但A与B与C不相容

但B与C相容

……

我们暂不讨论顺序问题 如 ACB和ABC的区别

我们只讨论这几种东西放在一起的相容性问题

我们暂且把这类问题称为配伍问题

因为它和药品配伍是一样的

如何设计这样的数据库才能达到最具有可扩充性、最优?

请做过的和没做过的朋友们都过来讨论一下

注意:是配伍 不是配对 是说一组东西是否相容 而不是说某一对东西是否相容

@_@
...全文
121 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2003-04-24
  • 打赏
  • 举报
回复
谢谢大家的教诲

这个设计我没继续做下去 只是想和大家讨论一下而已

@_@
pp616 2003-03-13
  • 打赏
  • 举报
回复
不懂。一头雾水?汗!!!
勉励前行 2003-03-13
  • 打赏
  • 举报
回复
粗粗看了一下,說說看法。
只要計算不相容的就以了吧,如果是這樣,
只做一個不相容表,然後對已分配的結果做檢測,是否在滿足不相容條件。

該不相容表應該與藥品主表分離,用編碼或ID來標識藥品,還有個不相容條件。

如:
如果藥品A存放在X櫃,則藥品B不能存放在X櫃,也不能存放在與X櫃同在一個房間的任何一個櫃。
這裡用的是if then 規則。
那麼相應的數據就應該有:藥品主表,倉庫主表,藥品存放地點表,藥品櫃表。。。
實現起來就哆嗦麻煩,寫程序時就得考慮清楚是實現到哪一步,如:不管你放在哪個倉庫,哪個櫃子,另提出一種藥品存放區的概念,簡化設計,相容規則就可以描述成,A,B不能同在一個存放區。
如果藥品存放區是平面線性的,那上面的設計沒問題,如果藥品存放區是區有包容關係的,如A區是B區的一個子區域,這時規則的設計就多了集合的概念,就象上面說的櫃子是放在房間裡的要一樣。不同的數據結構肯定會有不同的程序,要看你們是怎樣設計的了。

設計要為用戶考慮,特殊情況還要事先得到客戶的許可。
halibut 2003-03-13
  • 打赏
  • 举报
回复
uping.
googoler 2003-03-12
  • 打赏
  • 举报
回复
秦阿的较易用 但我不知道这位兄台是专为本贴设计的表 还是以前做项目的时候写过
//-----------------------------------------------------------------------
这个就是专门为本贴设计的表 ,有300分可以分呀

//-----------------------------------------------------------------------
你这个应该是HIS的一部分吧,以前看到过医院用过管理软件,金蝶的财务软件就好象
有专门的医院行业版,不过HIS我也是前两个月才听说!

//-----------------------------------------------------------------------
配伍类,角色关系,一个二元表的下三角填充,药品配伍禁忌查询系统,逻辑学
--------------------------------------------------------------------------
呀,这些东西我还真是第一次听说,学习!学海无涯呀!
当初偶看到这个贴子只是简单的想到不就是 树的存储吗
根节点表示相容或不相容,叶子节点表示药品,这么简单
的问题还有300分,赶快抢!十分钟就写了出来!
现在看来偶当初想得太简单了,惭愧,惭愧!

//-----------------------------------------------------------------------
空杯提出的算法很周密 但实现起来的确繁琐
我感觉秦兄的算法也不够简洁
--------------------------------------------------------------------------
A与B相容
但A与B与C不相容
但B与C相容

如何设计这样的数据库才能达到最具有可扩充性、最优?

由此 我们实现了药品配伍的算法
--------------------------------------------------------------------------
不知道楼主究竟是怎样设计的,为什么不公开出来与大家共享呢?
学习....

--------------------------------------------------------------------------
欢迎大家继续讨论,多作交流

「已注销」 2003-03-11
  • 打赏
  • 举报
回复
再加点感慨

也许学过逻辑学会好许多 可惜我没学过呵

感慨完毕
「已注销」 2003-03-11
  • 打赏
  • 举报
回复
谢谢大家


我仔细的阅读了大家的回复

我感觉到没什么进展

空杯提出的算法很周密 但实现起来的确繁琐

秦阿的较易用 但我不知道这位兄台是专为本贴设计的表 还是以前做项目的时候写过

我感觉秦兄的算法也不够简洁

让我们阅读一下上面 来电 兄的发言

//--------引用开始

配伍应该是角色关系的子集,在角色关系定义中,包括角色的互斥,继承,孤立等复杂关系。
配伍差不多是定义其中的互斥。

我们在实现时采用属性元素的方法,即先定义基本元素,基本元素的关系值的特定BIT赋值,表明与具有该BIT属性的基本元素互斥。

而角色是多种元素的组合,在组合时检查其各种元素关系值的是否排斥,是则允许加入,否则不许。

//---引用结束

第一句话 指出了这种关系的种类 并指出了关键字 互斥

第二句话 指出了一种算法 就是基本元素法 事实上这很符合药品的实际情况 比如某药品M的“特定BIT”值是N (假设M和N是互斥的)

第三句话 如果某处方中已含有药品M 那么N将被排斥 写到这里大家已经明白 来电兄没有解决第三种药的问题 比如 M的确与N是互斥的 但如果M和N之间添加了P 可能就不再互斥了 那么 根据来电兄的提示 我们的程序应该到N就终止了 N加不进去 P更加不进去了

来电兄的BIT值写起来并不比秦兄和空杯兄的记录简洁 那只是一种抽象的表示方法 而已 我们的工作量一点都没减少 反而可能增多 我们是不是要为每一种药都定义属性值呢

我想我可以将算法进一步的设计如下:

很明显,我们只能采用黑名单,而无需采用白名单
如我的命题

A与B相容
但A与B与C不相容
但B与C相容

就可以描述成
A B C不相容
除此之外 不做限制

我们的黑名单表(即不相容表)仅写上一条 A-B-C就可以了

我们从实际出发 我们的主要目的是限制不相容的药放在一起 而M不相容N 再加上P(甘草)就相容的现象实际上并不多
所以我们可以设计下面的表示方法
假设我们提出新的命题如下:

A与B不能放在一起用药 (这是一个最典型的命题)
那么我们就可以表示成 A-B-*

意思就是 A 与 B 不能放在一起 一旦发现它们放在一起了 那么您无论再加什么 都不行
反过来讲 我只要没看到A和B在一起 我就不做限定
由此 我们实现了药品配伍的算法

欢迎大家继续讨论 继续引玉 很高兴和大家做这样的交流

真如实观 2003-03-03
  • 打赏
  • 举报
回复
是不是搞药品配伍禁忌查询系统?
chifengwatch 2003-03-02
  • 打赏
  • 举报
回复
强烈学习.
  • 打赏
  • 举报
回复
一个二元表的下三角填充...
pp616 2003-03-02
  • 打赏
  • 举报
回复
有点累了。7点过了。该去睡觉了。
Lastdrop 2003-03-01
  • 打赏
  • 举报
回复
to: LzSnow(江南一雪)

1. POWER()是Oracle的函数,POWER(2,0)是2的0次方的意思

2.relation_table中应该有两个元素编号来表明是那两种元素相容或不相容
关键是相容与不相容关系可能是两元的也可以是三元,四元.....,不定,所以无法用元素编号来
表示。

googoler(泰阿) 的方法相当于将relation_table中用relation_word表示的关系,用一个关系表来实现,这种方法分析和运算要简单一些,相应的SQL语句也好写一些,只是配伍表的记录可能会很多。建议在相容表中增加冗余字段表示是几元关系。
googoler 2003-03-01
  • 打赏
  • 举报
回复
select count(*) from ... where groupID=

googoler 2003-03-01
  • 打赏
  • 举报
回复
冗余字段表示是几元关系

不太好,这样每当用户的增加,删除都要处理,
select count(*) from ... where ID=
这样的查询实在是太快了!


LzSnow 2003-02-28
  • 打赏
  • 举报
回复
楼上 Lastdrop(空杯) 的想法有一定的可行性,这个问题的分析和运算复杂一点是可以在其限度范围内的,只是我觉得POWER()的结构应该和relation_table的结构一样,而且relation_table中应该有两个元素编号来表明是那两种元素相容或不相容,这样这个问题就类似于递归。
纯属拙见,望大家多多指教! 我也是正在寻求配伍问题的解决方案。谢谢!
googoler 2003-02-28
  • 打赏
  • 举报
回复
缺点:

多用户并发进行配伍时,有一个对配伍 唯一性 的问题
需要额外处理一下,

先看看有没有其他的网友提出更好的办法!
----------------------------------------------------------------------------

可以写个触发器
netsys2 2003-02-28
  • 打赏
  • 举报
回复
配伍应该是角色关系的子集,在角色关系定义中,包括角色的互斥,继承,孤立等复杂关系。
配伍差不多是定义其中的互斥。

我们在实现时采用属性元素的方法,即先定义基本元素,基本元素的关系值的特定BIT赋值,表明与具有该BIT属性的基本元素互斥。

而角色是多种元素的组合,在组合时检查其各种元素关系值的是否排斥,是则允许加入,否则不许。
googoler 2003-02-28
  • 打赏
  • 举报
回复
缺点:

多用户并发进行配伍时,有一个对配伍 唯一性 的问题
需要额外处理一下,

先看看有没有其他的网友提出更好的办法!

googoler 2003-02-28
  • 打赏
  • 举报
回复
配伍表错了,应该是
GroupID(int,引用相容表ID),ID(int,引用药品表ID)
1,1
1,2
1,3
2,1
2,2
3,1
3,3
---------------------------------------------------------------------------
googoler 2003-02-28
  • 打赏
  • 举报
回复
药品表
ID(int),Name(varchar)
1,A
2,B
3,C
---------------------------------------------------------------------------
相容表
GroupID(int),Memo(varchar),Mutex(bool)
1,配伍一,1 //(A,B,C不相容)
2,配伍二,0 //(A,B相容)
3,配伍三,0 //(A,C相容)
---------------------------------------------------------------------------
配伍表
GroupID(int,引用相容表ID),ID(int,引用药品表ID)
1,A
1,B
1,C
2,A
2,B
3,A
3,C
---------------------------------------------------------------------------
可无限扩充,但要注意查询效率,
数据量太大的话,可将以上相容表分成两个,一个表示相容,一个表示互斥

加载更多回复(11)

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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