運(yùn)籌學(xué)問題java代碼,運(yùn)籌學(xué)問題類型及解決方法

運(yùn)籌學(xué) 表上作業(yè)法求運(yùn)輸問題

定義x(i,j)表示從產(chǎn)地i運(yùn)往銷地j的數(shù)量

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、丹江口網(wǎng)站維護(hù)、網(wǎng)站推廣。

a(i,j)表示運(yùn)費(fèi)。

建立如下模型:

3 3

min z= ∑ ∑a(i,j)*x(i,j);

i=1 j=1

s.t:

x(1,1)+x(1,2)+x(1,3)=20;

x(2,1)+x(2,2)+x(2,3)=16;

x(3,1)+x(3,2)+x(3,3)=4;

x(1,1)+x(2,1)+x(3,1)=10;

x(1,2)+x(2,2)+x(3,2)=14;

x(1,3)+x(2,3)+x(3,3)=16;

x(i,j)都為整數(shù)且大于零

用lingo求解的話代碼如下:

sets:

row/1 2 3/:b;

col/1 2 3/:c;

link(row,col):a,x;

endsets

data:

a=6 5 13

10 7 16

8 2 4;

b=20 16 4;

c=10 14 16;

enddata

[OBJ]min=@sum(link(i,j):a(i,j)*x(i,j));

@for(row(i):@sum(col(j):x(i,j))=b(i));

@for(col(j):@sum(row(i):x(i,j))=c(j));

@for(link(i,j):x(i,j)=0;@gin(x(i,j)););

end

得出數(shù)據(jù)如下:

Variable Value Reduced Cost

X( 1, 1) 10.00000 6.000000

X( 1, 2) 0.000000 5.000000

X( 1, 3) 10.00000 13.00000

X( 2, 1) 0.000000 10.00000

X( 2, 2) 14.00000 7.000000

X( 2, 3) 2.000000 16.00000

X( 3, 1) 0.000000 8.000000

X( 3, 2) 0.000000 2.000000

X( 3, 3) 4.000000 4.000000

Row Slack or Surplus Dual Price

OBJ 336.0000 -1.000000

有數(shù)據(jù)可知與圖2中答案吻合。

誰幫忙給個(gè)運(yùn)籌學(xué)任務(wù)指派問題的JAVA算法阿!不需要C或者C++語言,也不要和我說看著C++就能改,我不會(huì)改!!!!!

public class AssignWorkProblem {

public static void main(String[] args) {

/*

*測試

**/

int[][] cost=new int[][]{{2,15,13,4},{10,4,14,15},{9,14,16,13},{7,8,11,9}};

System.out.println(Arrays.toString(awpProcedure(cost, 4, 4)));

cost=new int[][]{{12,7,9,7,9},{8,9,6,6,6},{7,17,12,14,12},{15,14,6,6,10},{4,10,7,10,6}};

System.out.println(Arrays.toString(awpProcedure(cost, 5, 5)));

}

/*

* 費(fèi)用矩陣costMatrix,由于要改變costMatrix的值,clone方法只能對基本類型;

* pnum即為幾個(gè)人,也是costMatrix的行數(shù),wnum是幾個(gè)任務(wù),也是costMatrix的列數(shù)

* 返回值:沒兩個(gè)數(shù)字為一組,表示i,j。如返回[1,1,2,0]表示costMatrix[1][1]、costMatrix[2][0]費(fèi)用最低

*/

public static int[] awpProcedure(int[][] costMatrix,int pnum,int wnum){

if(pnum1||pnumwnum)

return null; //test n=m

int[][] costC=new int[pnum][]; //clone 一份costMatrix

for(int i=0;ipnum;i++){

costC[i]=costMatrix[i].clone();

}

//每行減去最小的元素

int[] lzeroa=new int[pnum+1]; //記錄每行0的個(gè)數(shù),lzero[pnum]記錄0最少的行標(biāo)

lzeroa[pnum]=-1;

int i,j;

for(i=0;ipnum;i++){

int lmin=costC[i][0]; //記錄每行最小的

for(j=1;jwnum;j++)

lmin=lmincostC[i][j]?costC[i][j]:lmin;

for(j=0;jwnum;j++){

costC[i][j]-=lmin;

lzeroa[i]+=costC[i][j]==0?1:0;

}

}

for(j=0;jwnum;j++){

int cmin=costC[0][j]; //記錄每列最小的

for(i=1;ipnum;i++)

cmin=cmincostC[i][j]?costC[i][j]:cmin;

if(cmin==0)continue;

for(i=0;ipnum;i++){

costC[i][j]-=cmin;

lzeroa[i]+=costC[i][j]==0?1:0;

}

}

int[] rzerop;

int whilenum=0;

while(true){

boolean[] lzerob=new boolean[pnum]; //記錄某行是否查找過

rzerop=new int[pnum*2]; //記錄0元素所在的行列

Arrays.fill(rzerop, -1);

if(awpIsSolution(costC,pnum,wnum,lzeroa.clone(),lzerob,rzerop))

break;

//下面調(diào)整矩陣

int[] coverLC=new int[pnum+wnum]; //要被標(biāo)記的行列,0-pnum-1為行,pnum以后為列

Arrays.fill(coverLC, -1);

//沒有找到合適0元素的行做標(biāo)記

for(i=0;ipnum;i++)

if(lzerob[i]==false)coverLC[i]=i;

//對已經(jīng)標(biāo)記的行上的0元素所在的列做標(biāo)記

for(i=0;ipnum;i++)

if(coverLC[i]!=-1){

for(j=0;jwnum;j++){

if(costC[coverLC[i]][j]==0)

coverLC[pnum+j]=j;

}

}

//對已經(jīng)標(biāo)記的列上的已經(jīng)選中的0元素所在的行做標(biāo)記

for(j=0;jwnum;j++){

if(coverLC[pnum+j]!=-1){

for(i=0;irzerop.lengthrzerop[i]!=-1;i+=2){

if(rzerop[i+1]==j)

coverLC[rzerop[i]]=rzerop[i];

}

}

}

//確定能找出新最小值的區(qū)域,直線覆蓋掉沒有打勾的行,打勾的列,最終coverLC[x]!=-1就是能選擇的數(shù)

for(i=0;iwnum;i++){

if(coverLC[pnum+i]!=-1)coverLC[pnum+i]=-1;

else coverLC[pnum+i]=i;

}

//從區(qū)域中找出最小元素

int nmin=-1;

for(i=0;ipnum;i++){

if(coverLC[i]==-1)continue;

for(j=0;jwnum;j++){

if(coverLC[pnum+j]==-1)continue;

if(nmin==-1)nmin=costC[i][j];

else nmin=nmincostC[i][j]?costC[i][j]:nmin;

}

}

//打勾的列加上nmin,打勾的行減去nmin,記錄0個(gè)數(shù)的數(shù)組作相應(yīng)變化

for(j=0;jwnum;j++){

if(coverLC[pnum+j]==-1){

for(i=0;ipnum;i++){

if(costC[i][j]==0)lzeroa[i]-=1;

costC[i][j]+=nmin;

}

}

}

for(i=0;ipnum;i++){

if(coverLC[i]!=-1){

for(j=0;jwnum;j++){

costC[i][j]-=nmin;

if(costC[i][j]==0)lzeroa[i]+=1;

}

}

}

whilenum++;

if(whilenum==100){

System.out.println("100次之內(nèi)矩陣調(diào)整沒有找到");

return null;

}

}

return rzerop;

}

/*

* 測試矩陣costC是否有解,已經(jīng)通過變換或者調(diào)整得到的矩陣

*/

public static boolean awpIsSolution(int[][] costC,int pnum,int wnum,int[] lzeroa,boolean[] lzerob,int[] rzerop){

int i,j,rzeropi=0;

for(int p=0;ppnum;p++){ //開始按照匈牙利法劃去0所在的行列

//查找0元素個(gè)數(shù)最少的行

for(i=0;ipnum;i++){

if(lzerob[i]||lzeroa[i]1)continue; //如果某行已經(jīng)查找過或者沒有0元素,可能被劃去了

if(lzeroa[pnum]!=-1lzeroa[i]lzeroa[lzeroa[pnum]])lzeroa[pnum]=i;

else if(lzeroa[pnum]==-1) lzeroa[pnum]=i;

}

//沒有找到足夠的不在同一行同一列的0元素,需要對矩陣進(jìn)行調(diào)整,如果lzeroa[pnum]有值,則說明該行一定能找到

if(lzeroa[pnum]==-1){

return false;

}

//劃去找到的行中沒有被覆蓋的0元素所在的行列

for(j=0;jwnum;j++){

if(costC[lzeroa[pnum]][j]!=0)continue;

//第一次找0元素最少的行

if(rzeropi==0){

rzerop[rzeropi++]=lzeroa[pnum];

rzerop[rzeropi++]=j;

lzerob[lzeroa[pnum]]=true; //找到第lzeroa[pnum]行,第j列0元素

//劃去所在的行列時(shí) lzeroa做相應(yīng)的變化

for(i=0;ipnum;i++){

if(i!=lzeroa[pnum]costC[i][j]==0)

lzeroa[i]-=1;

}

lzeroa[pnum]=-1;

break;

}

//找到的0元素是否被劃去

for(i=0;irzeropi(lzeroa[pnum]!=rzerop[i]j!=rzerop[i+1]);i+=2);

//如果被劃去則找該行下一個(gè)0元素

if(irzeropi)continue;

rzerop[rzeropi++]=lzeroa[pnum];

rzerop[rzeropi++]=j;

lzerob[lzeroa[pnum]]=true;

for(i=0;ipnum;i++){

if(i!=lzeroa[pnum]costC[i][j]==0)

lzeroa[i]-=1;

}

lzeroa[pnum]=-1;

break;

}

}

return true;

}

}

運(yùn)籌學(xué)的問題

你好!

這道題是清華大學(xué)06年的真題,答案在我空間里。用的是動(dòng)態(tài)規(guī)劃的方法。有不懂可以追問哦

運(yùn)籌學(xué)資源分配問題lingo代碼

max=0.5*X1+0.4*X2;

0.1*X1+0.1*X2=80;

0.075*X1+0.05*X2=30;

0.075*X1+0.1*X2=45;

《運(yùn)籌學(xué)》中的單純形方法求線性規(guī)劃問題用C語言怎么算?求代碼,謝謝!

#includestdio.h

#includemath.h

#includeiostream.h

float matrix[100][100],x[100]; /* 記錄總方程的數(shù)組,解的數(shù)組 */

int a[100]; /* 記錄基礎(chǔ),非基礎(chǔ)的解的情況,0:非基礎(chǔ),1:基礎(chǔ) */

int m,n,s,type; /* 方程變量,約束數(shù),求最大最小值的類型,0:最小 1:最大 */

int indexe,indexl,indexg; /* 剩余變量,松弛變量,人工變量 */

void Jckxj()

{

int i,j;

for(i=0;in;i++)

for(j=0;js;j++)

if(matrix[i][j]==1a[j]==1){

x[j]=matrix[i][s];

j=s;

}

for(i=0;is;i++)

if(a[i]==0) x[i]=0;

}

int Rj()

{

int i;

for(i=0;is;i++)

if(fabs(matrix[n][i])=0.000001)

if(matrix[n][i]0) return 0;

return 1;

}

int Min()

{

int i,temp=0;

float min=matrix[n][0];

for(i=1;is;i++)

if(minmatrix[n][i]){

min=matrix[n][i];

temp=i;

}

return temp;

}

void JustArtificial()

{

int i;

for(i=m+indexe+indexl;is;i++)

if(fabs(x[i])=0.000001){

printf("No Answer\n");

return;

}

}

int Check(int in)

{

int i;

float max1=-1;

for(i=0;in;i++)

if(fabs(matrix[i][in])=0.000001max1matrix[i][s]/matrix[i][in])

max1=matrix[i][s]/matrix[i][in];

if(max10)

return 1;

return 0;

}

int SearchOut(int *temp,int in)

{

int i;

float min=10000;

for(i=0;in;i++)

if(fabs(matrix[i][in])=0.000001(matrix[i][s]/matrix[i][in]=0)minmatrix[i][s]/matrix[i][in]){

min=matrix[i][s]/matrix[i][in];

*temp=i;

}

for(i=0;is;i++)

if(a[i]==1matrix[*temp][i]==1) return i;

}

void Mto(int in,int temp)

{

int i;

for(i=0;i=s;i++)

if(i!=in)

matrix[temp][i]=matrix[temp][i]/matrix[temp][in];

matrix[temp][in]=1;

}

void Be(int temp,int in)

{

int i,j;

float c;

for(i=0;i=n;i++){

c=matrix[i][in]/matrix[temp][in];

if(i!=temp)

for(j=0;j=s;j++)

matrix[i][j]=matrix[i][j]-matrix[temp][j]*c;

}

}

void Achange(int in,int out)

{

int temp=a[in];

a[in]=a[out];

a[out]=temp;

}

void Print()

{

int i,j,k,temp=0;

for(i=0;in;i++){

for(k=temp;ks;k++)

if(a[k]==1){

printf("X%d ",k);

temp=k+1;

k=s;

}

for(j=0;j=s;j++)

printf("%8.2f",matrix[i][j]);

printf("\n");

}

分享名稱:運(yùn)籌學(xué)問題java代碼,運(yùn)籌學(xué)問題類型及解決方法
URL標(biāo)題:http://muchs.cn/article2/hcpdic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站排名、微信小程序、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營