最优化实例和matlab源程序

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最优化平时作业

一、目标规划

1、题目:见书中例题P110 例 4

2、解题方法:利用Lingo 求解

3、具体步骤

(1).对应于第一优先等级,建立线性规划问题:

model:

min=-d1;

5*x1+10*x2<=60;

x1-2*x2+d1_-d1=0;

end

运行结果:-d1=0

(2 )对应于第二优先等级,将-d1=0 作为约束条件,建立线性规划问题:min=d2_;

5*x1+10*x2<=60;

x1-2*x2+d1_-d1=0;

4*x1+4*x2+d2_-d2=36;

-d1=0;

end

运行结果:d2=0;

(3).对应于第三优先等级,将-d1=0, -d1=0 作为约束条件,建立线性规划问题:min=d3_;

5*x1+10*x2<=60; x1-2*x2+d1_-d1=0;

4*x1+4*x2+d2_-d2=36;

6x1+8*x2+d3_-d3=48;

-d1=0;

d2=0;

end

运行结果:d3=0;

X1 4.800000

X2 2.400000

二、动态规划之0-1 背包问题

1、题目:给定n种物品和一背包。物品i 的重量是Wi ,其价值为Vi ,背包的容量是c,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。

2、解题方法与思路:利用java 求解,.思想方法是回溯思想

3、需求分析

对于给定n 种物品和一背包。在容量最大值固定的情况下,要求装入的物品价值最大化

4、java 源程序及运行结果

BackTrace.java

* To change this template, choose Tools | Template Manager

* and open the template in the editor.

*/

package sunfa; import java.util.Date;

public class BackTrace {

* @param args

*/

public static void main(String[] args) {

double w[]={2,2,6,5,4};

double v[]={6,3,5,4,6};

int n=5;

double c=10; knapsack(v,w,c);

System.out.println(bestp);

} //比较两个元素大小的类private static class Element implements Comparable{ int id; double d;

private Element(int idd,double dd){ id=idd;

d=dd;

}

public int compareTo(Object x){ double xd=((Element)x).d; if(d

if(d==xd)return 0;

return 1;

}

public boolean equals(Object x){ return d==((Element)x).d;

}

}

static double c; // 背包容量

static int n;// 物品数

static double[]w;// 物品重量数组static double[]p; // 物品价值数组static

double cw;// 当前重量static double cp;// 当前价值static double bestp; // 当前最优值static int [] x;// 解

static int [] sortX;// 排好序之后的解static int [] bestX;// 最有解

static Date date = null; // @jve:decl-index=0:

public static double knapsack(double[]pp,double[]ww,double cc){ c=cc;

n=pp.length-1; cw=0.0;

cp=0.0; bestp=0.0;

Element[]q=new Element[n];

//q 为单位重量价值数组

for(int i=1;i<=n;i++) q[i-

1]=new Element(i,pp[i]/ww[i]);

MergeSort.mergeSort(q);

p=new double[n+1]; w=new double[n+1]; x=new int[n+1]; sortX=new int[n+1];

bestX=new int[n+1]; for(int i=1;i<=n;i++){ p[i]=pp[q[n-i].id];

w[i]=ww[q[n-i].id]; sortX[i]=q[n-i].id;

}

backtrack(1);// 回溯搜索

return bestp;

}

private static void backtrack(int i){ if(i>=n){ if(cp>bestp){ bestp=cp;

for(int j=1;j<=n;j++){ bestX[j]=x[j];

}

}

return;

}

//搜索子树

if(cw+w[i]<=c){

//进入左子树x[sortX[i]]=1; cw+=w[i]; cp+=p[i]; backtrack(i+1);

cw-=w[i];

相关文档
最新文档