最优化实例和matlab源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];