⑴ 一道数学建模题
我有一个贪心算法,就是说由于不论加班与否都是P1产品的利润高,因此为了满足利润应该尽量在非加班时间生产P1产品,如此一来,P2产品的利润应该是>=7*75=525,剩下的利润还有3500-525=2975
如果A,B组都在非加班时间生产A产品,则可生产10*8+8*8=144kg,利润为144*20=2880,还差95的利润,即95/15=6或7kg,由于B的生产能力是8kg/h,所以7/8>7/10,所以由B生产8千克,此时P1的生产任务完成
再看P2,有75千克的生产任务,此时A组剩下4小时,B组3小时,折合一共生产47kg,不达生产要求
此算法应该是考虑到利润最大化,而又尽量满足生产任务的,因此应该没有无法分配满足题目要求的工作计划
仅供参考
⑵ 数学建模最小生成树的语言程序
有Prim算法和Kruskal算法:(贪心),个人认为前者简洁,代码如下:
----------------------prim-------------------------------
#include <stdio.h>
#include <string.h>
int mat[55][55],used[55],min[55];
int p;
int prim()
{
int i,j,k,q,ret = 0;
for(i = 1;i <= p;i++)
min[i] = 1000000000,used[i] = 0;
min[1] = 0;
for(i = 1;i <= p;i++)
{
k = -1;
for(j = 1;j <= p;j++)
if(!used[j] && (k == -1 || min[j] < min[k]))
k = j;
used[k] = 1;
ret += min[k];
for(j = 1;j <= p;j++)
if(!used[j] && mat[k][j] && mat[k][j] < min[j])
min[j] = mat[k][j];
}
return ret;
}
int main()
{
int i,j,n,r,a,b,c;
while(scanf("%d%d",&p,&r) != EOF && p != 0)
{
memset(mat,0,sizeof(mat));
for(i = 0;i < r;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(!mat[a][b] || mat[a][b] > c)
mat[a][b] = mat[b][a] = c;
}
printf("%d\n",prim());
}
return 0;
}
----------------------Kruskal--------------------------
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 1000
int father[MAX], son[MAX];
int v, l;
typedef struct Kruskal //存储边的信息
{
int a;
int b;
int value;
};
bool cmp(const Kruskal & a, const Kruskal & b)
{
return a.value < b.value;
}
int unionsearch(int x) //查找根结点+路径压缩
{
return x == father[x] ? x : unionsearch(father[x]);
}
bool join(int x, int y) //合并
{
int root1, root2;
root1 = unionsearch(x);
root2 = unionsearch(y);
if(root1 == root2) //为环
return false;
else if(son[root1] >= son[root2])
{
father[root2] = root1;
son[root1] += son[root2];
}
else
{
father[root1] = root2;
son[root2] += son[root1];
}
return true;
}
int main()
{
int ncase, ltotal, sum, flag;
Kruskal edge[MAX];
scanf("%d", &ncase);
while(ncase--)
{
scanf("%d%d", &v, &l);
ltotal = 0, sum = 0, flag = 0;
for(int i = 1; i <= v; ++i) //初始化
{
father[i] = i;
son[i] = 1;
}
for(int i = 1; i <= l ; ++i)
{
scanf("%d%d%d", &edge[i].a, &edge[i].b, &edge[i].value);
}
sort(edge + 1, edge + 1 + l, cmp); //按权值由小到大排序
for(int i = 1; i <= l; ++i)
{
if(join(edge[i].a, edge[i].b))
{
ltotal++; //边数加1
sum += edge[i].value; //记录权值之和
cout<<edge[i].a<<"->"<<edge[i].b<<endl;
}
if(ltotal == v - 1) //最小生成树条件:边数=顶点数-1
{
flag = 1;
break;
}
}
if(flag) printf("%d\n", sum);
else printf("data error.\n");
}
return 0;
}
⑶ 急求:2012美国数学建模竞赛B题的建模思想
简单来说,动态规划,贪心算法,具体原则得由自己定……
旅行社是以什么为最大原则,这个很难确定,哪怕算法对了,原则设计错误,效果也不好,我们小组以最大流通量为原则,只不过得了一等奖,有的人以最多利润为原则,更好一些~~~
⑷ 数学建模 粮仓选址问题
从上缴粮食的情况来,仓库应该建在100那个位置为最好。
⑸ 数学建模 最优线路设计 解答完再给100,发我邮箱,如果论文正确可付10Qb,诚心求高手援助
用数据结构算法如贪心算法
⑹ 什么是贪婪算法
是贪心算法吧……
就是每次都取最优值。。。比如合并果子:
有n堆果子,每个果子都有一个重量,每次可以任意选择2堆果子将其合并成一堆,花费是这两堆果子的重量值之和,求最终合并成一堆的最小(最大)花费。
算法就是,每次取重量最小(最大)的两堆果子合并,直到还剩一堆。
⑺ 关于数学建模中用到的数学理论和编程算法
关于程序,我建议你用matlab或者mathmaticas,用这类专用数学软件比较好,因为我知道绝大多数人对C及C++的掌握还不至于到能够熟练写出你上述的各种算法(当然一些的简单的可以参考ACM的相关书籍),况且在实际工作中很多科学工作者或是工程师都是用Matlab之类的数学软件,所以我也建议你用。
至于你是工科的(我也是),所以我也能够理解你想学习上述各种算法等的想法,但是我觉得这个真的不太现实,我自己也很爱好数学,在平时我也经常学习各种非自己专业的数学知识,但是实际上你学习了之后也要理解,更何况你要运用它到非常熟练的程度(绝非一般考试可比),所以我认为你就必须要非常有选择的看,而且强烈建议你先做好规划(一定要符合自己实际情况,不要贪心),然后抓紧学。
我看你上面列的,其中组合数学非常难,但是你一定要非常踏实地学好(这个会应用在许多连你自己都想不到的地方),另外图论也是必须的,但这里我建议你先学习《离散数学》中的“图论”,当你以后在运用中如果遇到更高深的理论再去参考专门的图论书籍也不迟。另外微分方程我建议你先学习一些基础的知识即可,因为在建模中大多数情况下我觉得你只要会建立就行了,这块内容不用涉入太深,不然太费时间。至于你后面列的一些算法,这个没办法回避的,但也不是说你要一个个看过来,当然你可以考虑先走马观花地扫一遍,然后在仔细深入地学习集中重要的,相对出现几率大的算法。建议你多多拿题目来练习,在练题的过程中顺带学习相应知识,这样效率比较高。
其他的我也帮不了什么,关键你自己要抓紧,效率要大大提高。最后祝你好运!
⑻ 我在数学建模中,把所有情况用matlab列出求解,算是贪婪算法吗不是的话算什么算法呢
你所说的“所有情况”是怎么得到的?所谓的“贪婪算法”主要是指“贪婪”的考虑所有算法,而不是靠任何数学或者计算机的思想去筛选。所以,这里主要的是指你得到所有算法的方法,而不是说你用什么去求解。
⑼ 求数学建模论文,关于浓度稀释的,发我邮箱啊
能给我发一份吗?谢谢你! QQ邮箱:1807073810
⑽ 我是计算机系的,数学建模都需要用到哪些软件编程有什么要求,算法和数据结构要求高吗求专业详细解答
贪心算法,蚁群算法,遗传算法,进化算法,基于文化的遗传算法,禁忌算法,蒙特卡洛算法,混沌随机算法,序贯数论算法,粒子群算法,模拟退火算法。
模拟退火+遗传算法混合编程例子:
http://..com/question/43266691.html
自适应序贯数论算法例子:
http://..com/question/60173220.html