✅ 操作成功!

动态规划法

发布时间:2023-06-11 作者:admin 来源:文学

动态规划法

动态规划法

-

2023年3月4日发(作者:租金回报率)

动态规划法解旅⾏商问题(TSP)问题的java实现

ist;

;

;

p;

publicclassTSP{

privatedouble[][]dArray;//距离矩阵

privateintlength;//距离矩阵的长度

privateintlengthOfLength;//距离矩阵长度字符串的长度

privateStringallzero="";//0组成的字符串最⼤值是length个(length-1)连接起来的字符串,同样最⼩值是length个0连接起来

privateStringbiggest="";

privateListlist=newArrayList();//城市流列表

privateMapstore;//存储中间数据

privateStringnotExist="不存在";

privateStringfirnalRoad=notExist;//最终的路径,即距离矩阵的列号取值

privateStringfirnalCityFlow="";//最终形成的城市流

privateStringmin=notExist;//最终求得的最⼩值

privateStringallFlowTime=notExist;//求解所有城市流的时间

privateStringguihuaTime=notExist;//动态规划的时间

/**CreatesanewinstanceofTwentyTwo*/

publicTSP(double[][]dArray){

if((dArray)){

=dArray;

=;

OfLength=(length-1+"").length();

for(intzeroLength=0;zeroLength<(length*lengthOfLength);){

allzero+=0;

zeroLength=();

}

for(inti=;i>0;i--){

t+=thOfLength(i-1);

}

longstart=tTimeMillis();

w();

longend=tTimeMillis();

wTime=end-start+"毫秒";

start=tTimeMillis();

oreMap();

(-2);

end=tTimeMillis();

Time=end-start+"毫秒";

}

}

publicStringgetFirnalRoad(){

Road;

}

publicStringgetFirnalCityFlow(){

if("".equals(CityFlow)){

st;

}

CityFlow;

}

publicStringgetMin(){

;

}

publicStringgetAllFlowTime(){

wTime;

}

publicStringgetGuihuaTime(){

Time;

}

//输⼊距离矩阵的有效性判读

privatebooleancheck(double[][]dArray){

if(<3){

n("错误信息:距离矩阵长度过⼩");

returnfalse;

}

for(inti=0;i<;i++){//每个double[]的长度都进⾏判断

if(!=dArray[i].length){

n("错误信息:距离数组长度不合法");

returnfalse;

}

}

for(inti=0;i<;i++){

if(!oneZero(dArray[i],i)){

n("错误信息:距离数组顺序或元素值设置不合法");

returnfalse;

}

}

returntrue;

}

//对于⼀个doulbe类型的数组,只有第i个元素为0的判断

privatebooleanoneZero(double[]dArray,inti){

intnumOfZero=0;

for(doubled:dArray){

if(d==0.0){

numOfZero++;

}

}

if(numOfZero==1&&(dArray[i]==0)){

returntrue;

}else{

returnfalse;

}

}

//判断⼀个城市流是否合法

privatebooleanoneFlow(Stringstr){

//将⼀个字符串更改为⼀个字符链表

ListlistString=newArrayList();

for(inti=0;i<(*OfLength);){

(ing(i,i+OfLength));

i+=OfLength;

}

//如果有相同的元素,则false

for(inti=0;i<(-1);i++){

for(intj=i+1;j<;j++){

for(intj=i+1;j<;j++){

if((i*OfLength).equals((j*OfLength))){

returnfalse;

}

}

}

//如果有距离矩阵全0对⾓线上的元素,则false

for(inti=0;i<();i++){

if(nt((i))==i){

returnfalse;

}

}

//排除没有遍历所有城市的情况(从0点出发到达0点)

Mapmap=newHashMap();

for(inti=0;i<;){

(i,nt(ing(i,i+OfLength)));

i+=OfLength;

}

intallcity=0;

for(inti=0;;){

i=(i);

allcity++;

if(i==0){

break;

}

}

if(allcity<){

returnfalse;

}

returntrue;

}

//初始化存储map

privatevoidinitstoreMap(){

=newHashMap();

//存距离矩阵最后⼀⾏可能的列号

for(inti=0;i<-1;i++){

(thOfLength(i),[-1][i]);

}

//存距离矩阵倒数两⾏可能的列号

for(inti=0;i<;i++){

if(i==-2)

continue;

for(intj=0;j<-1;j++){

if(i==j){

continue;

}

(thOfLength(i)+thOfLength(j),[-2][i]+(thOfLength(j)));

}

}

}

//两个相近的城市流,前length-2-temp个数相同,后⾯不同,⽤动态规划实现

privatevoidguihua(inttemp){

if(()==1){

Road=(0);

nt((0));

=((0))+"";

return;

}

for(inti=0;i<(()-1);i++){

intnext=(i+1);

if((i).substring(0,temp*OfLength).equals((next).substring(0,temp*OfLength))){

doubleiValue=0;

doubleiValue=0;

doublenextValue=0;

iValue=[temp][nt((i).substring(temp,temp+OfLength))]+

((i).substring((temp+1)*OfLength));

nextValue=[temp][nt((next).substring(temp,temp+OfLength))]+

((next).substring((temp+1)*OfLength));

((i).substring(temp*OfLength),iValue);

((next).substring(temp*OfLength),nextValue);

if(iValue>=nextValue){

(i);

}else{

(next);

}

i--;

}

}

(temp-1);

}

//组成所有的城市流

privatevoidallFlow(){

while(!(o)){

o=(o);

if(w(o)){

(o);

}

}

}

//将length进制的字符串加1操作

privateStringaddone(Stringstr){

ListlistString=newArrayList();

for(inti=0;i<(*OfLength);){

(ing(i,i+OfLength));

i+=OfLength;

}

for(inti=(length-1);i>-1;i--){

intlast=nt((i));

if(last==(length-1)){

last=0;

StringstrLast=thOfLength(last);

(i,strLast);

}else{

last++;

StringstrLast=thOfLength(last);

(i,strLast);

break;

}

}

Stringret="";

for(Strings:listString){

ret+=s;

}

returnret;

}

//如果⼀个int字符串长度不够lengthOfLength则补⾜

privateStringtoLengthOfLength(Objecti){

StringreturnString=ng();

while(()

returnString=(0+returnString);

}

returnreturnString;

}

//将⼀个字符串键值映射,并标准输出

privatevoidthePrint(Stringstr){

Mapmap=newHashMap();

for(inti=0;i<;){

(i,nt(ing(i,i+OfLength)));

i+=OfLength;

}

StringcityFlow=thOfLength(0);

for(inti=0;;){

i=(i);

cityFlow+=thOfLength(i);

if(i==0){

break;

}

}

for(inti=0;i<+1;){

if(i<()){

CityFlow+=nt(ing(i,i+OfLength))+"->";

}else{

CityFlow+=nt(ing(i,i+OfLength));

}

i+=OfLength;

}

}

publicstaticvoidmain(String[]args){

double[][]first={//各个节点之间路径长度的⼆维数组

{0,2,1,3,4,5,5,6},

{1,0,4,4,2,5,5,6},

{5,4,0,2,2,6,5,6},

{5,2,2,0,3,2,5,6},

{4,2,4,2,0,3,5,6},

{4,2,4,2,3,0,5,6},

{4,2,4,2,4,3,0,6},

{4,2,4,2,8,3,5,0}};

longstart=tTimeMillis();

TSPff=newTSP(first);

n("路径是:"+nalRoad());

n("城市顺序:"+nalCityFlow());

n("最⼩值:"+());

n("⽣成所有合法城市流⽤时:"+FlowTime());

n("动态规划求解过程⽤时:"+huaTime());

}

}

👁️ 阅读量:0