📄 form1.cs
字号:
this.ltbOptimize.Items.Add("可调配的车辆数为:" + this.truckNum + "辆");
this.ltbOptimize.Items.Add("需要的车辆数为:" + cycleNum + "辆");
this.label5.Text = "【正在进行迭代计算,请稍后... 迭代次数:" + this.projectCmb.Text.ToString() + "】";
this.label5.Update();
MessageBox.Show("计算最佳路径成功!", "计算最佳路径成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.label5.Text = "【就绪】";
this.label5.Update();
this.btnSave.Enabled = true;
}
public void GetVariationCycle(ArrayList pathList, int vNum) //随机获取节点环,并且进行变异
{
Array pathArray = pathList.ToArray();
int cycleNum = 0;
for (int i = 0; i < pathArray.Length; i++)//求出patharray中的环数,用cycleNum来表示;
{
int cityFlag = ((ClassPathNode)pathArray.GetValue(i)).city.flag;
if (cityFlag == 0 && i != pathArray.Length - 1)
{
cycleNum += 1;
}
}
if (vNum >= cycleNum)
{
vNum = cycleNum;
}
if (vNum == 0)
{
return;
}
int k = this.GetRand(0,vNum);
k = cycleNum - k;
int k1= 0;
for (int i = 0; i < pathArray.Length; i++)//记下从哪个环节点(节点下标)开始
{
if (((ClassPathNode)pathArray.GetValue(i)).city.flag == 0)
{
k1 += 1;
if (k1 == k)
{
k1 = i;
break;
}
}
}
for (int i = k1; i < pathArray.Length; i++)
{
pathList.RemoveAt(k1);//把所有k1后面的所有节点删掉
}
pathArray = pathList.ToArray();//patharray中存放了消去一些节点后的值
list = (ArrayList)listBack.Clone();
array = list.ToArray();
for (int i = 0; i < pathArray.Length; i++)//设置截取完后的节点的值为零。(设置array中的节点)
{
Guid cityId = ((ClassPathNode)pathArray.GetValue(i)).city.cityId;
for (int j1 = 0; j1 < array.Length; j1++)
{
if (((Classcity)array.GetValue(j1)).cityId == cityId)
{
((Classcity)array.GetValue(j1)).needWeight = ((Classcity)array.GetValue(j1)).needWeight - ((ClassPathNode)pathArray.GetValue(i)).loadValue;
}
}
}
setPathLength();//重新设定截取后的总路径长度
Generate();//从新生成pathlist;
}
public void getCitysOrientValue()//获取初始化的城市配货值
{
listBack = Classcity.generateCitys(this.projectId);
}
public void getCityLink()//根据当前的节点顺序取出所有节点的路径链接关系
{
ClassCityLink cityLink = new ClassCityLink();
listAllLinks = cityLink.listCityLink(list,this.projectId);
}
public bool isCityHasPath(int missionNum)
{
bool hasPath = false;
Guid nextMissionId = ((Classcity)array.GetValue(missionNum)).cityId;
ArrayList links = (ArrayList)listAllLinks[currentCity];
for (int i = 1; i < links.Count; i++)
{
if (((ClassNextCity)links[i]).nextCityid == nextMissionId)
{
hasPath = true;
break;
}
}
return hasPath;
}
public int getPathLength(int missionNum)//获取城市间的路程
{
int linkLength=0;
Guid nextMissionId = ((Classcity)array.GetValue(missionNum)).cityId;
ArrayList links = (ArrayList)listAllLinks[currentCity];
for (int i = 1; i < links.Count; i++)
{
if (((ClassNextCity)links[i]).nextCityid.ToString().Equals(nextMissionId.ToString()))
{
linkLength=((ClassNextCity)links[i]).linkLength;
}
}
return linkLength;
}
public int GetCurrentLinkCout()
{
ArrayList links = (ArrayList)listAllLinks[currentCity];
return links.Count;
}
public int GetNextMissionNum()
{
int nextMissionNum = -1;
ArrayList links = (ArrayList)listAllLinks[currentCity];
int Next = GetMessionNum();
Guid nextCityId = ((ClassNextCity)links[Next]).nextCityid;
for (int i = 0; i < array.Length; i++)
{
if (((Classcity)array.GetValue(i)).cityId == nextCityId)
{
nextMissionNum = i;
break;
}
}
return nextMissionNum;
}
public void setPathLength()//算出截取节点后的路径值
{
this.pathlength=0;
for (int i = 0; i < this.pathList.Count-1; i++)//在截取后的路径依次计算路径总长度
{
Guid id =((ClassPathNode)this.pathList[i]).city.cityId;
for(int j=0;j<listAllLinks.Count;j++)//在已经设定的路径中查找节点之间的路径
{
ArrayList link = (ArrayList)listAllLinks[j];
Guid linkId=((ClassCityLink)link[0]).firstCityId;
if(id.Equals(linkId))
{
for(int k =1;k<link.Count;k++)
{
Guid nextId = ((ClassPathNode)this.pathList[i + 1]).city.cityId;
if (nextId.Equals(((ClassNextCity)link[k]).nextCityid))
{
this.pathlength = this.pathlength + ((ClassNextCity)link[k]).linkLength;
}
}
}
}
}
}
private void button3_Click(object sender, EventArgs e)//把最佳路径存入数据库,shortestResult是最佳迭代结果
{
generatePath1TableAdapter pathTableAdapter = new generatePath1TableAdapter();
wlddDataSet.generatePath1DataTable generatePath1Table = new wlddDataSet.generatePath1DataTable();
//pathTableAdapter.DeleteQueryByProjectId(this.projectId);
pathTableAdapter.DeleteQuery();
pathTableAdapter.Fill(generatePath1Table);
pathTableAdapter.Update(generatePath1Table);
ArrayList shortList = shortestResult.list;
for (int i = 0; i < shortList.Count; i++)//
{
wlddDataSet.generatePath1Row row = generatePath1Table.NewgeneratePath1Row();
Classcity city = ((ClassPathNode)shortList[i]).city;
row.projectId = this.projectId;
row.missionOrder = i;
row.missionsId = city.cityId;
row.cityName = city.cityName;
row.generateId = Guid.NewGuid();
row.shortestpathLength = (int)(shortestResult.length);
generatePath1Table.Rows.Add(row);
}
pathTableAdapter.Update(generatePath1Table);
this.btnSave.Enabled = false;
this.button2.Enabled = true;
this.btnShowMap.Enabled = true;
MessageBox.Show("最佳路径已成功保存至数据库!", "最佳路径保存成功!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void button4_Click(object sender, EventArgs e)//在地图中显示最佳路径
{
generatePath1TableAdapter adapter = new generatePath1TableAdapter();
wlddDataSet.generatePath1DataTable table = adapter.GetDataBy1(this.projectId);
ArrayList listShortestPath = new ArrayList();
for (int i = 0; i < table.Rows.Count; i++)//从已经迭代的最佳路径表中取出路径来在map中显示
{
for(int j=0;j<table.Rows.Count;j++)
{
if (i == (int)(table.Rows[j]["missionOrder"]))
{
Classcity city = new Classcity();
city.cityId = (Guid)table.Rows[j]["missionsId"];
city.cityName = (string)(table.Rows[j]["cityName"]).ToString().Trim();
ClassPathNode cityNode = new ClassPathNode(city,0);
listShortestPath.Add(cityNode);
break;
}
}
}
for (int i = 0; i < listShortestPath.Count; i++)
{
System.Console.Out.WriteLine(((ClassPathNode)listShortestPath[i]).city.cityName+"cityName");
}
generateResult result = new generateResult();
result.list = listShortestPath;
result.length = double.Parse(table.Rows[0]["shortestPathLength"].ToString());
FormShowMap showmap = new FormShowMap(result,this.projectId,this.projectName.Trim());
showmap.Show();
}
private void projectCmb_SelectedIndexChanged(object sender, EventArgs e)
{
label4.Text = "【迭代次数:" + this.projectCmb.Text.ToString() + " 次】";
}
private void projectCmb_TextChanged(object sender, EventArgs e)
{
label4.Text = "【迭代次数:" + this.projectCmb.Text.ToString() + " 次】";
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -