# 由SAT问题展开说（2）[演化计算c#实现下]

SAT问题展开说（2）[下]

private int GetScore(int i)

{

int score=0;

for(int j=0;j<maxNum;j++)

for(int k=0;k<valNum;k++)

if(int.Parse(satGenes[i].ToString().Substring(k,1))+bSentence[j,k]==2//

||int.Parse(satGenes[i].ToString().Substring(k,1))+bSentence[j,k]==-1)

{

score++;

break;

}

return score;

}

public int Sort()

{

int iBest=0,iWorst=0;

int bestScore=GetScore(0);//

int worstScore=GetScore(0);

for(int i=0;i<maxNum;i++)

{

score[i]=GetScore(i);

if(score[i]>bestScore)

{

iBest=i;

bestScore=score[i];

}

else if(score[i]<worstScore)

{

iWorst=i;

worstScore=score[i];

}

}

best=new StringBuilder(satGenes[iBest].ToString());

worst=new StringBuilder(satGenes[iWorst].ToString());

return bestScore;

}

1/3的情况进行某一位的取反变异，或以2/3的情况进行某连续两位的取反变异。

public void Mutation()

{

int mutType,start;

string subGene;

int i=randNum.Next(maxNum-1);

if(randNum.NextDouble()<=Pm)

{

mutType=randNum.Next(0,2);

switch(mutType)

{

case 0:

start=randNum.Next(0,valNum-1);

subGene=satGenes[i].ToString().Substring(start,1);

if(subGene=="0")

satGenes[i].Replace("0","1",start,1);

else

satGenes[i].Replace("1","0",start,1);

break;

case 1:case 2:

start=randNum.Next(0,valNum-2);

subGene=satGenes[i].ToString().Substring(start,2);

switch(subGene)

{

case "00":

satGenes[i].Replace("00","11",start,2);

break;

case "01":

satGenes[i].Replace("01","10",start,2);

break;

case "10":

satGenes[i].Replace("10","01",start,2);

break;

case "11":

satGenes[i].Replace("11","00",start,2);

break;

}

break;

default:

break;

}

}

}

public void Crossover()

{

int croType,start,length,i,j;

string i_subGene,j_subGene;

length=randNum.Next(5)+1;

start=randNum.Next(0,valNum-length);

i=randNum.Next(maxNum-1);

j=randNum.Next(maxNum-1);

i_subGene=satGenes[i].ToString().Substring(start,length);

j_subGene=satGenes[j].ToString().Substring(start,length);

croType=randNum.Next(2);

switch(croType)

{

case 0:case 2:

satGenes[i].Replace(i_subGene,j_subGene,start,length);

satGenes[j].Replace(j_subGene,i_subGene,start,length);

break;

case 1:

for(int k=0;k<length;k++)

{

switch(int.Parse(i_subGene.Substring(k,1))

+int.Parse(j_subGene.Substring(k,1)))

{

case 0:case 2:

satGenes[i].Replace(i_subGene.Substring(k,1),"1",start+k,1);

satGenes[j].Replace(j_subGene.Substring(k,1),"0",start+k,1);

break;

case 1:

satGenes[i].Replace(i_subGene.Substring(k,1),"0",start+k,1);

satGenes[j].Replace(j_subGene.Substring(k,1),"1",start+k,1);

break;

}

}

break;

default:

break;

}

}

private void geneCompute()

{

hh=DateTime.Now.Hour;

mm=DateTime.Now.Minute;

ss=DateTime.Now.Second;

ms=DateTime.Now.Millisecond;

SetTime();

oneSAT.InitGenes();

{

oneSAT.Mutation();

oneSAT.Crossover();

{

}

SetTime();

}

chListBoxString.ClearSelected();

}

oneSAT=new SAT(maxNum,valNum,0.8,0.02);

SetTime()是计算算法执行时间的跟踪，详细过程可见附录。而整个算法的执行，我们新创建一个线程computeGene，其过程如下：

{

computeGene.Start();

}

l          逻辑变量规模：200 300

l          种群规模：30

l          子句数量：30

l          杂交概率：0.8

l          变异概率：0.02

l          算法的出口为最好的染色体的分数等于非空的子句数量

00000000000000010000000000000000000011100000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0000011000000000000000000000000000000000

00000111100100000000011110000011000000000000000110101110000000000001100000011111

00000000000100000000000000000000000000000010000000000000001100000000100000110000

0000000001000000011110000010000001111100

00000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000111100000000000000000000000000000000000000000

000000000000000000000000000000000000000000000000000000000000

00001000000000000000000000000000000000000000111000000000000000000000000000000000

00000000000000000000000100000000000000000000000000001100000000000000000000000000

00000000000000000000010000000000000011110000000000000001111100000000000000000000

000000000000000000000000000000010000000000000000000000000000

1）康立山，智能计算及其应用讲义，中国地质大学内部讲义，20029

（2）Harry R.Lewis/Christos H.Papadimitriou, ELEMENTS OF THE THEORY OF COMPUTATION ,清华大学出版社（影印），1999年9月

2

• 本文已收录于以下专栏：

## 由SAT问题展开说（2）[演化计算c#实现上]

摘要：本文试图以活泼的笔调，讨论一个计算机科学难题，SAT问题。并由此展开，展示计算机算法的魅力，与计算机算法分析和设计的一些基本思想。最后，给出一个SAT问题的演化计算的算法和程序实现。关键字：S...
• PercyLee
• 2003年09月20日 00:59
• 1525

## 由SAT问题展开说(1)

由SAT问题展开说                                                    ...
• PercyLee
• 2003年08月27日 09:00
• 2110

## 由SAT问题展开说(1) (转)

• igiqoanw
• 2013年09月07日 20:13
• 726

## 由SAT问题展开说（3）[附录]

由SAT问题展开说（3） 附录：1，   SetTime函数如下：private void SetTime()         {          ...
• PercyLee
• 2003年09月20日 00:59
• 1359

## 浅谈2—SAT问题

• pi9nc
• 2013年09月20日 16:39
• 21660

## 2-SAT问题的解法（uva1146）

SAT：就是一些由布尔值组成的关系的集合。 2-SAT：就是由两个布尔值组成的关系的集合。 2-SAT问题：就是给出一些关系，然后问能不能满足这些所有的关系？ 现在比如说有n个国家，每个国家有两...
• y990041769
• 2015年05月17日 11:42
• 3722

## 算法基础 - 2-sat问题

2-SAT问题这个问题其实我们平时早就遇到过，只是从来没有认真的去思考这个问题的解法。这个在我们理解的时候，一般都是按照一个点开始，可以就继续，不可以就停止。例子问题例如我们有10个球，每个球都是编号...
• chenfs1992
• 2016年05月30日 22:03
• 1740

## 2-SAT问题相关算法与题目讲解（O(n*m)与O(m)）

2-SAT问题 信息学竞赛 OI ACM O(m) O(nm) 2-SAT问题张天翔blog.csdn.net/hzoi_ztxztx97@qq.com 前置技能 拓扑排序 基本逻辑运算 强联通分...
• hzoi_ztx
• 2017年02月14日 19:34
• 702

## SAT问题

1. 布尔表达式   布尔表达式是由布尔变量和运算符（NOT , AND ,OR）所构成的表达式。 2. 布尔可满足问题   如果对于变量的某个true,false赋值，使得一个布尔表达式的值为tr...
• 2016年06月21日 12:12
• 1638

## 使用 UITableView 创建表格应用——从plist文件加载并显示数据（转）

• fengmm521
• 2017年11月03日 18:49
• 111

举报原因： 您举报文章：由SAT问题展开说（2）[演化计算c#实现下] 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)