
动态规划法
-
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()); } }