日期:2014-5-19 浏览次数:20113次

怎样获得最优的随机安排,求SQL。
现在有M个市场,每个市场有不同的经营类型(例如:卖电器的和卖食品的A市场,卖食品和儿童用品的B市场,
卖纺织品和儿童用品的和日常用品的C市场,五金的D市场,等等)每个市场的经营类型有一种或多种不定,
还有L个商户,也知道每个商户的经营类型,现在需要把这L个商户依据经营类型安排到这M个市场中,
卖电器的和卖食品安排到卖电器的和卖食品的A市场,卖纺织品和儿童用品的商户安排到卖纺织品和儿童用品的B市场...,
并当一个商户在某一个市场中已经经营了某一个类型的商品后则不可以在其他包含此经营类型的不同市场经营同一类型的商品
怎么样在市场中安排最多数量的商户。

例如:
商户:狗三,他的经营类型有儿童用品、日常用品、卖食品

市场:
卖电器的和卖食品的A市场
卖食品和儿童用品的B市场
卖纺织品和儿童用品的和日常用品的C市场
五金的D市场

合理的安排:
给狗三安排:
1、A市场卖食品摊位
2、B市场卖儿童用品
3、C市场卖日常用品
这样可以给狗三在3个市场中安排3个


不合理的安排:
给狗三安排:
1、B市场卖卖食品
2、C市场卖儿童用品(或日常用品)

由于商户的安排是随机抽取,故怎样能在市场中安排最多数量的商户。并不能用游标和动态SQL语句



------解决方案--------------------
--建立环境
--市场数据
declare @市场 table (
市场 nvarchar(20),
类型 nvarchar(20)
)

insert @市场
select N 'A市场 ',N '电器 '
union all
select N 'A市场 ',N '食品 '
union all
select N 'B市场 ',N '食品 '
union all
select N 'B市场 ',N '儿童用品 '
union all
select N 'C市场 ',N '纺织品 '
union all
select N 'C市场 ',N '儿童用品 '
union all
select N 'C市场 ',N '日常用品 '
union all
select N 'D市场 ',N '五金 '

--商户数据
declare @商户 table (
商户 nvarchar(20),
类型 nvarchar(20)
)


insert @商户
select N '狗三 ',N '食品 '
union all
select N '狗三 ',N '儿童用品 '
union all
select N '狗三 ',N '日常用品 '
union all
select N '猫4 ',N '五金 '
union all
select N '猫4 ',N '电器 '
union all
select N '猫4 ',N '儿童用品 '
union all --找个全做的
select N '猪5 ',N '纺织品 '
union all
select N '猪5 ',N '电器 '
union all
select N '猪5 ',N '食品 '
union all
select N '猪5 ',N '儿童用品 '
union all
select N '猪5 ',N '五金 '
union all
select N '猪5 ',N '日常用品 '


--开始计算
--存放结果和临时数据
declare @结果 table (
id int IDENTITY(1,1),
市场 nvarchar(20),
商户 nvarchar(20),
类型 nvarchar(20),
选中 int
)

--产生所有可能结果备选
insert @结果 (市场,商户,类型,选中)
select a.市场,b.商户,a.类型,0 as 选中 from @市场 a, @商户 b
where a.类型=b.类型

while exists ( select 1 from @结果 where 选中=0)
begin

update a
set 选中=1
from @结果 a
where 选中=0
and not exists (
select 1 from @结果
where 商户=a.商户 and 市场=a.市场 and 选中 in (0,1)
and id <> a.id
)
and not exists (
select 1 from @结果 b
where id <> a.id
and 类型=a.类型
and 商户=a.商户
and 选中 in (0,1)
and not exists (
select 1 from @结果
where 商户=b.商户 and 市场=b.市场 and 选中 in (0,1)
and id <> b.id
)
)

update a
set 选中=2
from @结果 a,@结果 b
where a.选中=0 and b.选中=1
and a.商户=b.商户 and a.类型=b.类型


update a
set 选中=1
from @结果 a
where 选中=0
and not exists (
select 1 from @结果
where 商户=a.商户 and 类型=a.类型 and 选中 in (0,1)
and id <> a.id
)
and not exists (
select 1 from @结果 b
where id <> a.id
and 商户=a.商户
and 市场=a.市场
and 选中 in (0,1)
and not exists (
select 1 from @结果
where 商户=b.商户 and 类型=b.类型 and 选中 in (0,1)
and id <> b.id
)
)

update a
set 选中=2
from @结果 a,@结果