用Microsoft Visual Studio 2022调试
69 Array.Sort(F, y); 这里一直提示:System.ArgumentException:“偏移量和长度超出了数组的界限,或者计数大于从索引到源集合末尾的元素数。试了很多久都解决不了求大佬解决
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Optimization
{
class Program
{
static void Main(string[] args)
{
double[] a = new double[] { 0, 0, 0 };
double[] b = new double[] { 1, 1, 1 };
double[] y = new double[] { 0, 0, 0 };
int N = 1000;
double[] F = new double[N];
double[] gamma = new double[N];
double[] x = new double[N];
double[] z = new double[N];
double[] p = new double[N];
double[] R = new double[N];
double[] T = new double[N];
double[] U = new double[N];
double[] A = new double[N];
double[] B = new double[N];
double[] C = new double[N];
double[] cost = new double[N];
double[] pump_cost = new double[N];
double[] furnace_cost = new double[N];
double[] best_y = new double[] { 0, 0, 0 };
double best_F = 0;
double last_best_F = 0;
double z_value = 1;
int p_num = 10;
int count = 0;
int max_count = 1000;
Random rand = new Random();
while (count < max_count && z_value > 0.0001)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < 3; j++)
{
gamma[j] = rand.NextDouble();
y[j] = a[j] + gamma[j] * (b[j] - a[j]);
}
R[i] = y[1];
T[i] = y[0] * 1000 / (0.1 * Math.PI * Math.Pow(0.05, 2) * Math.Sqrt(2 * 9.8 * 100));
U[i] = y[2];
if (R[i] >= 0.1 && R[i] <= 0.5 && T[i] >= 0.1 && T[i] <= 1 && U[i] >= 0.1 && U[i] <= 1)
{
A[i] = 0.5 * 1000 * y[0] * (y[1] + 273 - 35.12);
B[i] = 0.001 * 62.5 * y[2] * 1000 * 24 * 365;
C[i] = 0.001 * 7000.45 * (y[1] + 273 - 35.12) * 24 * 365;
cost[i] = A[i] + B[i] + C[i];
pump_cost[i] = B[i];
furnace_cost[i] = C[i];
F[i] = cost[i];
}
else
{
F[i] = double.MaxValue;
}
}
Array.Sort(F, y);
for (int i = 0; i < p_num; i++)
{
best_y[0] += y[i * 3];
best_y[1] += y[i * 3 + 1];
best_y[2] += y[i * 3 + 2];
}
best_y[0] /= p_num;
best_y[1] /= p_num;
best_y[2] /= p_num;
for (int i = 0; i < N; i++)
{
x[i] = Math.Pow(F[i] - best_F, 2);
}
z_value = Math.Sqrt(x.Sum() / N);
if (best_F != last_best_F)
{
last_best_F = best_F;
count = 0;
}
else
{
count++;
}
}
double Q = best_y[0];
double W = best_y[1];
double E = best_y[2];
double R_best = Q;
double T_best = Q * 1000 / (0.1 * Math.PI * Math.Pow(0.05, 2) * Math.Sqrt(2 * 9.8 * 100));
double U_best = E;
double A_best = 0.5 * 1000 * Q * (R_best + 273 - 35.12);
double B_best = 0.001 * 62.5 * E * 1000 * 24 * 365;
double C_best = 0.001 * 7000.45 * (R_best + 273 - 35.12) * 24 * 365;
double cost_best = A_best + B_best + C_best;
double pump_cost_best = B_best;
double furnace_cost_best = C_best;
Console.WriteLine("外输温度(℃)\t" + (R_best + 273 - 273.15) + "\t外输温度(℃)\t" + (best_y[1] + 273 - 273.15));
Console.WriteLine("外输压力(MPa)\t" + U_best + "\t外输压力(MPa)\t" + best_y[2]);
Console.WriteLine("");
}
}
}
根据错误信息,您的代码有一个数组越界问题。这通常发生在尝试访问数组中不存在的元素时。
在您的代码中,错误的行是 Array.Sort(F, y);
。这意味着在对 F
数组进行排序时,访问了不存在的元素。
要解决这个问题,您需要检查数组的长度和偏移量。确保数组的长度与要访问的元素数量相同,并且偏移量不超出数组的范围。您可以使用调试器在运行代码时逐步执行代码并查看变量的值来帮助诊断问题。
另外,您的代码中有一些未使用的变量,例如 z
和 p
,您可以删除这些变量来使代码更清晰。同时,使用有意义的变量名可以帮助您更好地理解代码的含义和目的。