C 布尔可满足性的类调度[多项式时间缩减]

C 布尔可满足性的类调度[多项式时间缩减],c,algorithm,scheduling,reduction,sat,C,Algorithm,Scheduling,Reduction,Sat,我有一些理论/实践问题,目前还不知道如何管理,这里是: 我创建了一个模型,当一个模型存在时,我能够找到它,当它不是C语言中的问题时,我能够用遗传算法证明这个矛盾 SAT问题基本上类似于此类问题: 我的目标是使用此解算器在许多不同的问题中找到解决方案。基本上,我将不同的问题转化为SAT,用我的解算器解决SAT,然后将解决方案转化为原始问题可接受的解决方案 我已经在N*N数独和N皇后问题上取得了成功,但我的新目标是:将类调度问题简化为SAT,但我不知道如何将类调度问题形式化,以便在SAT之后轻松地进

我有一些理论/实践问题,目前还不知道如何管理,这里是:

我创建了一个模型,当一个模型存在时,我能够找到它,当它不是C语言中的问题时,我能够用遗传算法证明这个矛盾

SAT问题基本上类似于此类问题: 我的目标是使用此解算器在许多不同的问题中找到解决方案。基本上,我将不同的问题转化为SAT,用我的解算器解决SAT,然后将解决方案转化为原始问题可接受的解决方案

我已经在N*N数独和N皇后问题上取得了成功,但我的新目标是:将类调度问题简化为SAT,但我不知道如何将类调度问题形式化,以便在SAT之后轻松地进行转换

很明显,我们的目标是在几个月内生成一幅这样的日程图:

我发现这个人能够解决课程安排问题,但没有减少SAT,不幸的是:/

我还发现了一些关于总体规划的文章(例如)

但本文中使用的似乎太笼统,无法表示类调度问题。:/

是否有人对如何有效地形式化一个类调度有想法,以便将其简化为SAT,然后将SAT解决方案(如果存在)转换为一个类调度

我基本上对任何建议都持开放态度,我现在不知道如何表达,如何减少问题,如何将SAT解决方案转化为时间表



后续问题

我将尝试首先将问题形式化,然后尝试将其简化为SAT

将课程安排问题定义为:

Input = { S1,S2,....,Sn | Si = {(x_i1, y_i1), (x_i2, y_i2) , ... , (x_ik, y_ik) | 0 <= x_ij < y_ij <= M } } 
Alebgra = {(1,3),(3,5),(4,6)} Calculus = {(1,4),(2,5)}
非正式地:当且仅当存在一些区间赋值,使得每对区间之间的交点为空时,才为真


缩减为SAT:

Input = { S1,S2,....,Sn | Si = {(x_i1, y_i1), (x_i2, y_i2) , ... , (x_ik, y_ik) | 0 <= x_ij < y_ij <= M } } 
Alebgra = {(1,3),(3,5),(4,6)} Calculus = {(1,4),(2,5)}
为每个间隔定义一个布尔变量,
V_ij

在此基础上,定义公式:

F1 = (V_11 OR V_12 OR ... OR V_1(k_1)) AND .... AND (V_n1 OR V_n2 OR ... OR V_n(k_n))
非正式地说,F1满足当且仅当每个类的间隔中至少有一个“满足”


定义
较小(x,y)=true
如果且仅当
如果x首先,请将类调度的输入和预期输出形式化(或链接到将其形式化的某个地方)它可以是任何东西,这就是问题所在:我搜索类调度问题的最佳形式化,而最佳为我意味着“SAT中最容易转换”:)我现在没有正式的输入,我的问题是要找到一个:/我真的希望我没有犯错误,这不是一个微不足道的减少,如果你看到任何问题请评论非常感谢:)但我必须承认,我不认为我明白你说的一切:D你的正式化确实是最简单的,所以,在SAT中转换更好:)我知道如何在最后从SAT解决方案中获得计划。但是你能举个小例子吗,比如2节课,3节课。我知道会有2*3=6个布尔变量;但是CNF文件会是什么样子呢?@ValentinMontmirail我用一个简单的例子更新了答案。2节课,3,2节课。请注意,本例中的变量数为3+2。子句的数量几乎是
O(#variables^2)
。再次感谢:)我在同一时间研究了你的想法,现在我明白了^^(我在思考之前回答得可能太快了^^^^),但真的,我完全被打动了,你的方法是如此优雅、简单并且工作完美:)谢谢你的例子,这说明了我所理解的:)只是为了完全肯定:)@ValentinMontmirail我不会说“简单”,我花了很多时间来思考,甚至更多时间来将其形式化。不过编程很简单:)
Smaller(y1,x2) OR Smaller(y2,x1)
G_{c,d} = (Not(V_ac) OR Not(V_bd) OR Smaller(y_ac,x_bd) OR Smaller(y_bd,x_ac))
F = F1 AND {G_{c,d} | for each c,d}
Alebgra = {(1,3),(3,5),(4,6)} Calculus = {(1,4),(2,5)}
F1 = (V1,1 OR V1,2 OR V1,3) AND (V2,1 OR V2,2)
G{A1,C1} = Not(V1,1) OR Not(V2,1) OR  4 <= 1 OR 3 <= 1 //clause for A(1,3) C(1,4)
         = Not(V1,1) OR Not(V2,1) OR false = 
         = Not(V1,1) OR Not(V2,1)
G{A1,C2} = Not(V1,1) OR Not(V2,2) OR  3 <= 2 OR 5 <= 1 // clause for A(1,3) C(2,5)
         = Not(V1,1) OR Not(V2,2) OR false = 
         = Not(V1,1) OR Not(V2,2)
G{A2,C1} = Not(V1,2) OR Not(V2,1) OR  5 <= 1 OR 4 <= 3 //clause for A(3,5) C(1,4)
         = Not(V1,2) OR Not(V2,1) OR false = 
         = Not(V1,2) OR Not(V2,1)
G{A2,C2} = Not(V1,2) OR Not(V2,2) OR  5 <= 2 OR 5 <= 3 // clause for A(3,5) C(2,5)
         = Not(V1,2) OR Not(V2,2) OR false = 
         = Not(V1,2) OR Not(V2,2)
G{A3,C1} = Not(V1,3) OR Not(V2,1) OR  4 <= 4 OR 6 <= 1 //clause for A(4,6) C(1,4)
         = Not(V1,3) OR Not(V2,1) OR true= 
         = true
G{A3,C2} = Not(V1,3) OR Not(V2,2) OR  6 <= 2 OR 5 <= 4 // clause for A(4,6) C(2,5)
         = Not(V1,3) OR Not(V2,2) OR false = 
         = Not(V1,3) OR Not(V2,2)
    F = (V1,1 OR V1,2 OR V1,3) AND (V2,1 OR V2,2) 
        AND  Not(V1,1) OR Not(V2,1) AND Not(V1,1) OR Not(V2,2)
        AND  Not(V1,2) OR Not(V2,1) AND Not(V1,2) OR Not(V2,2)
        AND  true AND Not(V1,3) OR Not(V2,2)
V1,1 = false
V1,2 = false
V1,3 = true
V2,1 = true
V2,2 = false