用JavaScript解线性规划问题

<!DOCTYPE html>
<html>
<body>

<h1>我的第一张网页</h1>

<p id="demo">我的第一个段落</p>
<p id="demo1">我的第一个段落</p>
<script>
var b=5;
//全局变量
var M=10000;
//var knrnel[110][310];
//声明二维数组    核心矩阵表
var knrnel = new Array();
for(var i=0;i<40;i++){          //一维长度为5
    knrnel[i]=new Array(i);    //在声明二维
          for(var j=0;j<40;j++){      //二维长度为5
            knrnel[i][j]=0;
       }
}
//m:约束不等式个数  
//n:结构向量的个数   
//t:目标函数类型:-1代表求求最小值,1代表求最大值   
var m=0,n=0,t=0;
//约束条件矩阵
//读入约束条件
var x0=[-999,-999,-999,-999,-999,-999,-999,-999,-999];//多余部分
//          x1,x2,x3,x4,x5,x6,等号方向,常数项
var x1=[-999, 4,1,0,1,0,0,1,325         ,65416541];
var x2=[-999, 0,1,0,0,1,0,1,300         ,65416541];
var x3=[-999, 0,0,1,0,0,1,1,275         ,65416541];
var x4=[-999, 1,1,1,0,0,0,1,350          ,65416541];
var x5=[-999, 0,0,0,12,1,1,1,600          ,65416541];
var x6=[-999, 3.9,1.7,1,2.5,1.8,1.4    ,58465464];
//求解不等式方程为
// max=3.9*x1+1.7*x2+1*x3+2.5*x4+1.8*x5+1.4*x6;
// 4*x1+x2+x4<=325;
// x2+x5<=300;
// x3+x6<=275;
// x1+x2+x3<=350;
// 12*x4+x5+x6<=600;
var x=[x0,x1,x2,x3,x4,x5,x0,x6];
var temp5=new Array();
f=0;//最优值
function input() {
    //输入n=?
    n=6;
    //输入m=?
    m=5; 
    var i,j;
    //初始化核心向量
    for ( i = 0; i < m+1; i++) {
        for ( j = 0; j < n+m+m; j++) {
            knrnel[i][j]=0;
        } 
    }
    var f,k;
    for ( f = 1; f < m+1; f++) {
        for ( k = 1; k < n+3; k++) {
            knrnel[f][k]=x[f][k];
        }
    }

    for (i = 1; i <= m; i++)
	{
		knrnel[i][0] = knrnel[i][n + 2];
		knrnel[i][n + 2] = 0;
    }
    //读入目标条件 系数
    i=1;
    for (j = 1; j < n+1; j++) {
        knrnel[0][j]=x[7][j]; 
    }
    //输入t     t:目标函数类型:-1代表求求最小值,1代表求最大值   
    t=-1;
    //矩阵调整
    if (t==-1) {
        for (i = 1; i <= n; i++)
            knrnel[0][i] = (-1)*knrnel[0][i];
    }
    for (i = 1; i <= m; i++)
	{
		knrnel[i][n + i] = knrnel[i][n + 1];
		if (i != 1)
            knrnel[i][n + 1] = 0;
	}
}
function comput() {
    gg=0;
    tiaochu=0;
    var i,j,flag,temp1,temp2,h,f,k=0;
    var temp3 = new Array();

    var a,temp,aa,d,c;
    var b=new Array();
    var temp4=new Array();
    
    var end=new Array();
    //初始化
    for (i = 1; i <= m; i++)
		temp3[i] = 0;
	for (i = 0; i < 11; i++)
	{
		temp4[i] = 0;
		temp5[i] = 0;
	}
	for (i = 1; i <= m; i++)
	{
		if (knrnel[i][n + i] == -1)
		{
			knrnel[i][n + m + i] = 1;
			knrnel[0][n + m + i] = M;
			temp3[i] = n + m + i;
		}
		else
			temp3[i] = n + i;
	}
	for (i = 1; i <= m; i++)
		temp4[i] = knrnel[0][temp3[i]];

do {    
		for (i = 1; i <= n + m + m; i++)
		{
			a = 0;
			for (j = 1; j <= m; j++)
                a =a+ knrnel[j][i] * temp4[j];
                knrnel[m + 1][i] = knrnel[0][i] - a;
		}
		for (i = 1; i <= n + m + m; i++)
		{
			if (knrnel[m + 1][i] >= 0) flag = 1;
			else
			{
				flag = -1;
				break;
			}
		}
		if (flag == 1)
		{
			for (i = 1; i <= m; i++)
			{
				if (temp3[i] <= n + m) temp1 = 1;
				else
				{
					temp1 = -1;
					break;
				}
			}
			if (temp1 == 1)
			{
				
				for (i = 1; i <= m; i++)
					temp5[temp3[i]] = knrnel[i][0];
                tiaochu=1;
				if (tiaochu==1) {
                    break;
                }
				
            }
			else
			{
				tiaochu=1;
				if (tiaochu==1) {
                    break;
                }
			}
        }
        if (tiaochu==1) {
            break;
        }
		if (flag == -1)
		{
			temp = 100000;
			for (i = 1; i <= n + m + m; i++)
				if (knrnel[m + 1][i] < temp)
				{
					temp = knrnel[m + 1][i];
					h = i;
				}

			for (i = 1; i <= m; i++)
			{
				if (knrnel[i][h] <= 0) temp2 = 1;
				else {
					temp2 = -1;
					break;
				}
			}
		}
		if (temp2 == 1)
		{
            //cout << "此线性规划无约束";
            if (tiaochu==1) {
                break;
            }
        }
        if (tiaochu==1) {
            break;
        }
		if (temp2 == -1)
		{
			c = 100000;
			for (i = 1; i <= m; i++)
			{
				if (knrnel[i][h] != 0)  b[i] = knrnel[i][0] / knrnel[i][h];
				if (knrnel[i][h] == 0)  b[i] = 100000;
				if (b[i] < 0)     b[i] = 100000;
				if (b[i] < c)
				{
					c = b[i];
					k = i;
				}
			}
			temp3[k] = h;
			temp4[k] = knrnel[0][h];
			d = knrnel[k][h];
			for (i = 0; i <= n + m + m; i++)
            knrnel[k][i] = knrnel[k][i] / d;
			for (i = 1; i <= m; i++)
			{
				if (i == k)
					continue;
				aa = knrnel[i][h];
				for (j = 0; j <= n + m + m; j++)
                knrnel[i][j] = knrnel[i][j] - aa * knrnel[k][j];
			}
        }
        if (tiaochu==1) {
            break;
        }
	} while (1);
}


input()
z=""
r=""
comput()
a=5;
alert(knrnel[1][1]+" "+knrnel[0][4]);
knrnel[1][1] = knrnel[0][4] - a;
for ( kk = 0; kk < 30; kk++) {
    for ( hh = 0; hh < 30; hh++) {  
        z=z+"&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp"+knrnel[kk][hh]+"&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp//";
        
    }
    z=z+"</br>"
}
//temp5
for ( i = 0; i < temp5.length; i++) {
    r=r+"&nbsp&nbsp&nbsp&nbsp"+temp5[i]+"&nbsp&nbsp&nbsp&nbsp";
    
}
qqq=0
for (i = 1; i <= n; i++)
	qqq +=-1*knrnel[0][i] * temp5[i];
// alert(qqq)
document.getElementById("demo").innerHTML=r+" &nbsp&nbsp&nbsp最优:"+qqq;
document.getElementById("demo1").innerHTML=z;

// max=2.5*x1+1.7*x2+1.8*x3+2.5*x4+1.8*x5+1.4*x6;
// 4*x1+x2+x4<=325;
// x2+x5<=300;
// x3+x6<=275;
// x1+x2+x3<=350;
// 12*x4+x5+x6<=600;
// x1>0;
// x2>0;
// x3>0;
// x4>0;
// x5>0;
// x6>0;
</script>

</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_40417296/article/details/89223013
今日推荐