起终点不同的tsp旅行商问题

依旧是从固定的起点出发,历经多个必要的点,但是最终到达另外一个固定的点(不是回到起点)

img


能给具体的方法和程序代码最好了

是图问题吧

旅行商问题是一个经典的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()函数获取的siteidclient参数传递给存储过程p_fstask_new_siteid_client并将存储过程查询的数据返回给页面,您可以按照以下步骤进行操作:

  1. 首先,在check()函数中,将获取到的siteidclient参数传递给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)
  1. tt()函数中,将siteidclient作为参数传递给存储过程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
  1. 在存储过程执行完毕后,将查询的结果返回给页面。您可以将结果存储在一个字典中,并将其转换为JSON格式返回给页面。
@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()函数获取的siteidclient参数传递给存储过程,并将存储过程查询的数据返回给页面。

注意:在执行完存储过程后,需要调用commit()方法提交事务,并关闭游标cur.close()