用梯度上升法解决N皇后问题

这篇博客介绍了如何使用梯度上升法解决N皇后问题,包括最陡梯度上升法和首选梯度上升法。通过构造函数、评估函数和计算函数的详细讲解,阐述了算法的实现过程。文章还讨论了两种方法的优缺点,并给出了实际运行时间对比,展示优化后的计算时间减少但步数增加的现象。
摘要由CSDN通过智能技术生成

用梯度上升法解决N皇后问题

一、最陡梯度上升法

1.先上代码
<span style="font-size:18px;">#ifndef GA
#define GA
#include<iostream>
#include<ctime>
using namespace std;
class queen
{
private:
	int size;
	int eva_now;
	int *list;
	void init()
	{
		for(int i=0;i<size;++i)
			list[i]=rand()%size;
		eva_now=evaluate(list);
	}
	int evaluate(int *li)
	{
		int eva=0,minx,miny,x;
		for(minx=0;minx<size;++minx)
		{
			miny=li[minx];
			for(x=minx+1;x<size;++x)
			{
				if(x==minx)
					continue;
				else if(li[x]==miny)
					eva++;
				else if(abs(miny-li[x])==abs(minx-x))
					eva++;
			}
		}
		return eva;
	}
	bool calculate()
	{
		if(eva_now==0)
			return true;
		int chx,chy,x,y,recoardy,recoardeva=eva_now;
		int tmp;
		bool change=false;
		for(x=0;x<size;++x)
		{
			recoardy=list[x];
			for(y=0;y<size;++y)
			{
				if(y==recoardy)
					continue;
				else 
				{
					list[x]=y;
					tmp=evaluate(list);
					if(tmp<recoardeva)
					{
						chx=x;
						chy=y;
						change=true;
						recoardeva=tmp;
					}
				}
			}
			list[x]=recoardy;
		}
		if(change==false)
			return false;
		eva_now=recoardeva;
		list[chx]=chy;
		return true;
	}
public:
	void output()
	{
		for(int i=0;i<size;++i)
			cout<<list[i]<<endl;
	}
	bool start()
	{
		if(size==-1)
			return false;
		for(int i=0;i<100000;++i)
		{
			if(eva_now==0)
				return true;
			else
			{
				if(calculate())
					continue;
				else
					init();
			}
		}
	}
	bool start(int &stp,int &res)
	{
		stp=0;
		res=0;
		if(size==-1)
			return false;
		for(int i=0;i<100000;++i)
		{
			stp++;
			if(eva_now==0)
				return true;
			else
			{
				if(calculate())
					continue;
				else
				{
					init();
					res++;
				}
			}	
		}
	}
	queen()
	{
		srand(clock());
		size=-1;
		list=NULL;
	}
	bool setsize(int n)
	{
		if(size!=-1)
			delete[] list;
		list=new int[n];
		if(!list)
			return false;
		size=n;
		init();
	}
	queen(int _size):size(_size)
	{
		srand(clock());
		list=new int[size];
		init();

	}
	~queen()
	{
		if(size!=-1)
			delete[] list;
	}
};


#endif</span>

2、详解

为了避免大家受来回翻页之苦,我会在每个函数的解释旁附上相应的代码,希望能让大家看得轻松。

a、构造函数

<pre class="cpp" name="code"><span style="font-size:18px;"> queen(int _size):size(_size)
	{
		srand(clock());
		list=new int[s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值