依旧是从固定的起点出发,历经多个必要的点,但是最终到达另外一个固定的点(不是回到起点)
是图问题吧
旅行商问题是一个经典的NP完全问题。而带有起点和终点的TSP问题相对于经典的TSP问题只需要在使用蚁群算法进行求解的时候只用改两行代码即可。具体实现的代码可以参考以下博文资料:
使用蚁群算法加邻域搜索算法解决带有起点和终点的TSP问题:https://blog.csdn.net/SUMPLUSS/article/details/117621099
可以采用一些经典的最短路径算法来解决这个问题,比如 Dijkstra 算法或者是 A* 算法。
题中要求至少访问一次,不回到原点。这已经不是tsp了,可以考虑为最短路或者最小生成树问题
可以参考下
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[(1<<20)+10][25];//st状态下停在i点的最短路;
ll mas[23][23];
ll n,m,x,y,z;
ll deal(ll st,ll x)//记忆化搜索
{
if(f[st][x]!=0x3f3f3f3f3f3f3f3f) //代表已经被处理过了;
return f[st][x];
ll st1=st-(1<<(x-1));//来到这一点前的状态,也就是第x个点还没有走过
for(int i=1;i<=n;++i){
if(mas[i][x]==0) continue;
if((st>>(i-1))&1){
f[st][x]=min(f[st][x],deal(st1,i)+mas[i][x]);
}
}
return f[st][x];
}
int main()
{
cin>>n>>m;//n个点,m条边
for(int i=1;i<=m;++i){
cin>>x>>y>>z;
mas[x][y]=z;
mas[y][x]=z;//无向边
}
memset(f,0x3f,sizeof f);//初始化
f[1][1]=0;//初始化,??????????
ll st=(1<<n)-1;//n位全部变成1,代表此时n个点都踩完了。
ll ans=1e12;
for(int i=2;i<=n;++i){
int tmp=deal(st,i);
if(mas[i][1]!=0) ans=min(ans,tmp+mas[i][1]);
}
cout<<ans<<endl;
return 0;
}
/*
样例:
5 9
1 2 2
1 3 7
1 4 2
1 5 4
2 3 10
2 4 6
2 5 3
3 4 4
4 5 1
*/
要将check()
函数获取的siteid
和client
参数传递给存储过程p_fstask_new_siteid_client
并将存储过程查询的数据返回给页面,您可以按照以下步骤进行操作:
check()
函数中,将获取到的siteid
和client
参数传递给tt()
函数。def check():
return_dict = {'status': False}
get_data = request.args.to_dict()
siteid = get_data.get('siteid')
client = get_data.get('client')
return_dict = tt(siteid, client)
return json.dumps(return_dict, ensure_ascii=False)
tt()
函数中,将siteid
和client
作为参数传递给存储过程p_fstask_new_siteid_client
。def tt(siteid, client):
cur = conn.cursor()
cur.callproc('p_fstask_new_siteid_client', [siteid, client])
result = cur.fetchall()
cur.close()
conn.commit()
return result
@app.route("/test_1.0", methods=["GET", "POST"])
def check():
return_dict = {'status': False}
get_data = request.args.to_dict()
siteid = get_data.get('siteid')
client = get_data.get('client')
result = tt(siteid, client)
return_dict['result'] = result
return json.dumps(return_dict, ensure_ascii=False)
通过以上步骤,您可以将check()
函数获取的siteid
和client
参数传递给存储过程,并将存储过程查询的数据返回给页面。
注意:在执行完存储过程后,需要调用commit()
方法提交事务,并关闭游标cur.close()
。