function GAInitPop() {
Chrom = new Array();
for(var ik=0; ik<10; ik++){ //一维长度为
Chrom1[ik] = randperm(7);
console.log(Chrom[ik]);
}
console.log(Chrom);
return Chrom
}
//建立从1到num的整数数组并乱序排列
function randperm(num) {
var randarr=new Array();
for(var ir = 0; ir < num; ir ++){
randarr[ir] = ir+1;
}
randarr.shuffle();
return randarr;
}
//Array洗牌
Array.prototype.shuffle = function() {
var j, tmp, i;
for(i = this.length-1; i>0; i--){
j = parseInt(Math.random() * i);
tmp = this[i];
this[i] = this[j];
this[j] = tmp;
}
}
Chrom = GAInitPop();
console.log(Chrom)
我希望得到一个10行7列的二维数组
在单独测试时能正常得到,但放在有其他功能的网页里面就会像图中只有最后一行有数据,为什么呢
Chrom1
是什么?就暂且当你写错了,我当它是 Chrom
。
然后看你说测试的时候正常,但是放到网页中就有问题了。
那么就说说什么情况会导致这个问题
- 因为是引用地址。所以如果有其他位置修改会出现这样的问题。
-
这种给最后赋值的问题,很熟悉,那就是闭包。
- for 循环中绑定事件,然后事件中赋值
- for 循环中使用setTimeout
function GAInitPop() {
Chrom1 = new Array();
for(let ik=0; ik<10; ik++){ //一维长度为
Chrom1[ik] = randperm(CityNum);
}
return Chrom1;
}
//建立从1到num的整数数组并乱序排列
function randperm(num) {
var randarr=new Array();
for(var ir = 0; ir < num; ir ++){
randarr[ir] = ir+1;
}
randarr.shuffle();
return randarr;
}
//Array洗牌
Array.prototype.shuffle = function() {
var j, tmp, i;
for(i = this.length-1; i>0; i--){
j = parseInt(Math.random() * i);
tmp = this[i];
this[i] = this[j];
this[j] = tmp;
}
}
Chrom = GAInitPop();
console.log(Chrom)
又改了下,像上面这样在for里用let能正确输出Chrom
我是最近才学到js是单线程的,然后我又试了下面的代码,一个函数里有两层for,用let和settimeout就都不好使了,console.log(Chrom1)还是会出现undefined,这种应该怎么处理呢
var TravelCon = 100;
var Capacity = 1;
function GAVRPInitPop() {
Chrom1 = new Array();
for(let i=0; i<10; i++) {
Chrom1[i] = new Array();
var TSProute = new Array();
TSProute = randperm(CityNum);
TSProute.unshift(0);
TSProute.push(0);
var VRProute = new Array();
for (let j=0; j<7; j++) {
VRProute[j] = 0; //置零
}
var DisTraveled = 0;
var delivery = 0;
var k = 0;
for (let j=1; j<=CityNum+1; j++) {
k++;
if (DisTraveled+distance[VRProute[k-1]][TSProute[j]]+distance[TSProute[j]][0]>TravelCon || delivery+demand[TSProute[j]] > Capacity){
VRProute[k] = 0;
//再去下一个城市
DisTraveled = distance[0][TSProute[j]];
delivery = demand[TSProute[j]];
k++;
VRProute[k] = TSProute[j];
}
else{
DisTraveled += distance[VRProute[k-1]][TSProute[j]];
delivery += demand[TSProute[j]];
VRProute[k] = TSProute[j];
}
}
Chrom1[i] = VRProute;
}
console.log(Chrom1)
return Chrom1;
}
//建立从1到num的整数数组并乱序排列
function randperm(num) {
var randarr=new Array();
for(var ir = 0; ir < num; ir ++){
randarr[ir] = ir+1;
}
randarr.shuffle();
return randarr;
}
//Array洗牌
Array.prototype.shuffle = function() {
var j, tmp, i;
for(i = this.length-1; i>0; i--){
j = parseInt(Math.random() * i);
tmp = this[i];
this[i] = this[j];
this[j] = tmp;
}
}
var Chrom = GAVRPInitPop();
console.log(Chrom)
其中distance为二维数组,存放节点之间的距离;demand为一维数组,存放需求量
其实代表什么不是重点,重点是执行GAVRPInitPop()前有代码没执行完,所以要将含双层for的GAVRPInitPop()异步处理